blob: 6dbda9856ff8e498d919585ea9d53217ce0f1b70 [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,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000079 const llvm::Triple &Triple,
80 llvm::StringRef &PlatformName,
81 VersionTuple &PlatformMinVersion) {
Benjamin Kramera9992772010-01-09 17:55:51 +000082 Builder.defineMacro("__APPLE_CC__", "5621");
83 Builder.defineMacro("__APPLE__");
84 Builder.defineMacro("__MACH__");
85 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000086
John McCall098df7f2011-06-16 00:03:19 +000087 if (!Opts.ObjCAutoRefCount) {
John McCallf85e1932011-06-15 23:02:42 +000088 // __weak is always defined, for use in blocks and with objc pointers.
89 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000090
John McCallf85e1932011-06-15 23:02:42 +000091 // Darwin defines __strong even in C mode (just to nothing).
92 if (Opts.getGCMode() != LangOptions::NonGC)
93 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
94 else
95 Builder.defineMacro("__strong", "");
96
97 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
98 // allow this in C, since one might have block pointers in structs that
99 // are used in pure C code and in Objective-C ARC.
100 Builder.defineMacro("__unsafe_unretained", "");
101
102 // The Objective-C bridged cast keywords are defined to nothing in non-ARC
103 // mode; then they become normal, C-style casts.
104 Builder.defineMacro("__bridge", "");
105 Builder.defineMacro("__bridge_transfer", "");
106 Builder.defineMacro("__bridge_retained", "");
John McCall18164422011-06-17 21:23:37 +0000107 Builder.defineMacro("__bridge_retain", "");
John McCallf85e1932011-06-15 23:02:42 +0000108 }
109
Eli Friedman2de4fee2009-06-04 23:00:29 +0000110 if (Opts.Static)
Benjamin Kramera9992772010-01-09 17:55:51 +0000111 Builder.defineMacro("__STATIC__");
Eli Friedman2de4fee2009-06-04 23:00:29 +0000112 else
Benjamin Kramera9992772010-01-09 17:55:51 +0000113 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000114
115 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000116 Builder.defineMacro("_REENTRANT");
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000117
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000118 // Get the platform type and version number from the triple.
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000119 unsigned Maj, Min, Rev;
Mike Stump1eb44332009-09-09 15:08:12 +0000120
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000121 // If no version was given, default to to 10.4.0, for simplifying tests.
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000122 if (Triple.getOSName() == "darwin" || Triple.getOSName() == "osx") {
123 PlatformName = "macosx";
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000124 Min = Rev = 0;
125 Maj = 8;
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000126 } else {
127 // Otherwise, honor all three triple forms ("-darwinNNN[-iphoneos]",
128 // "-osxNNN", and "-iosNNN").
129
130 if (Triple.getOS() == llvm::Triple::Darwin) {
131 // For historical reasons that make little sense, the version passed here
132 // is the "darwin" version, which drops the 10 and offsets by 4.
133 Triple.getOSVersion(Maj, Min, Rev);
134
135 if (Triple.getEnvironmentName() == "iphoneos") {
136 PlatformName = "ios";
137 } else {
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000138 PlatformName = "macosx";
139 Rev = Min;
140 Min = Maj - 4;
141 Maj = 10;
142 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000143 } else {
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000144 Triple.getOSVersion(Maj, Min, Rev);
Daniel Dunbara4ff6482011-04-19 23:34:21 +0000145 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000146 }
147 }
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000148
149 // Set the appropriate OS version define.
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000150 if (PlatformName == "ios") {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000151 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000152 char Str[6];
153 Str[0] = '0' + Maj;
154 Str[1] = '0' + (Min / 10);
155 Str[2] = '0' + (Min % 10);
156 Str[3] = '0' + (Rev / 10);
157 Str[4] = '0' + (Rev % 10);
158 Str[5] = '\0';
159 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
160 } else {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000161 // Note that the Driver allows versions which aren't representable in the
162 // define (because we only get a single digit for the minor and micro
163 // revision numbers). So, we limit them to the maximum representable
164 // version.
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000165 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000166 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000167 char Str[5];
168 Str[0] = '0' + (Maj / 10);
169 Str[1] = '0' + (Maj % 10);
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000170 Str[2] = '0' + std::min(Min, 9U);
171 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000172 Str[4] = '\0';
173 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000174 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000175
176 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman618234a2008-08-20 02:34:37 +0000177}
Reid Spencer5f016e22007-07-11 17:01:13 +0000178
Chris Lattner797c3c42009-08-10 19:03:04 +0000179namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000180template<typename Target>
181class DarwinTargetInfo : public OSTargetInfo<Target> {
182protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000183 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000184 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000185 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
186 this->PlatformMinVersion);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000187 }
Mike Stump1eb44332009-09-09 15:08:12 +0000188
Torok Edwin5f6c1942009-06-30 17:10:35 +0000189public:
190 DarwinTargetInfo(const std::string& triple) :
191 OSTargetInfo<Target>(triple) {
Eric Christopherdd53ec92010-06-25 19:04:52 +0000192 this->TLSSupported = llvm::Triple(triple).getDarwinMajorNumber() > 10;
Daniel Dunbare177d3b2011-02-21 23:12:51 +0000193 this->MCountName = "\01mcount";
Torok Edwin5f6c1942009-06-30 17:10:35 +0000194 }
195
Anders Carlssonf959fb52010-01-30 18:33:31 +0000196 virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
Chris Lattner797c3c42009-08-10 19:03:04 +0000197 // Let MCSectionMachO validate this.
198 llvm::StringRef Segment, Section;
199 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000200 bool HasTAA;
Chris Lattner797c3c42009-08-10 19:03:04 +0000201 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000202 TAA, HasTAA, StubSize);
Chris Lattner797c3c42009-08-10 19:03:04 +0000203 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000204
Anders Carlsson18af3682010-06-08 22:47:50 +0000205 virtual const char *getStaticInitSectionSpecifier() const {
206 // FIXME: We should return 0 when building kexts.
207 return "__TEXT,__StaticInit,regular,pure_instructions";
208 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000209
Torok Edwin5f6c1942009-06-30 17:10:35 +0000210};
211
Chris Lattner797c3c42009-08-10 19:03:04 +0000212
Torok Edwin5f6c1942009-06-30 17:10:35 +0000213// DragonFlyBSD Target
214template<typename Target>
215class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
216protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000217 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000218 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000219 // DragonFly defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000220 Builder.defineMacro("__DragonFly__");
221 Builder.defineMacro("__DragonFly_cc_version", "100001");
222 Builder.defineMacro("__ELF__");
223 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
224 Builder.defineMacro("__tune_i386__");
225 DefineStd(Builder, "unix", Opts);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000226 }
227public:
Mike Stump1eb44332009-09-09 15:08:12 +0000228 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000229 : OSTargetInfo<Target>(triple) {}
230};
231
232// FreeBSD Target
233template<typename Target>
234class FreeBSDTargetInfo : public OSTargetInfo<Target> {
235protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000236 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000237 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000238 // FreeBSD defines; list based off of gcc output
239
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000240 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramer3bb65302010-01-30 19:55:01 +0000241 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000242
Benjamin Kramer3bb65302010-01-30 19:55:01 +0000243 Builder.defineMacro("__FreeBSD__", Release);
244 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramera9992772010-01-09 17:55:51 +0000245 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
246 DefineStd(Builder, "unix", Opts);
247 Builder.defineMacro("__ELF__");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000248 }
249public:
Mike Stump1eb44332009-09-09 15:08:12 +0000250 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands1e90faf2009-07-08 13:55:08 +0000251 : OSTargetInfo<Target>(triple) {
252 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000253
254 llvm::Triple Triple(triple);
255 switch (Triple.getArch()) {
256 default:
257 case llvm::Triple::x86:
258 case llvm::Triple::x86_64:
259 this->MCountName = ".mcount";
260 break;
261 case llvm::Triple::mips:
262 case llvm::Triple::mipsel:
263 case llvm::Triple::ppc:
264 case llvm::Triple::ppc64:
265 this->MCountName = "_mcount";
266 break;
267 case llvm::Triple::arm:
268 this->MCountName = "__mcount";
269 break;
270 }
271
Duncan Sands1e90faf2009-07-08 13:55:08 +0000272 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000273};
274
Chris Lattner38e317d2010-07-07 16:01:42 +0000275// Minix Target
276template<typename Target>
277class MinixTargetInfo : public OSTargetInfo<Target> {
278protected:
279 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
280 MacroBuilder &Builder) const {
281 // Minix defines
282
283 Builder.defineMacro("__minix", "3");
284 Builder.defineMacro("_EM_WSIZE", "4");
285 Builder.defineMacro("_EM_PSIZE", "4");
286 Builder.defineMacro("_EM_SSIZE", "2");
287 Builder.defineMacro("_EM_LSIZE", "4");
288 Builder.defineMacro("_EM_FSIZE", "4");
289 Builder.defineMacro("_EM_DSIZE", "8");
290 DefineStd(Builder, "unix", Opts);
291 }
292public:
293 MinixTargetInfo(const std::string &triple)
294 : OSTargetInfo<Target>(triple) {
295 this->UserLabelPrefix = "";
296 }
297};
298
Torok Edwin5f6c1942009-06-30 17:10:35 +0000299// Linux target
300template<typename Target>
301class LinuxTargetInfo : public OSTargetInfo<Target> {
302protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000303 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000304 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000305 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000306 DefineStd(Builder, "unix", Opts);
307 DefineStd(Builder, "linux", Opts);
308 Builder.defineMacro("__gnu_linux__");
309 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000310 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000311 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000312 if (Opts.CPlusPlus)
313 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000314 }
315public:
Mike Stump1eb44332009-09-09 15:08:12 +0000316 LinuxTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000317 : OSTargetInfo<Target>(triple) {
318 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000319 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000320 }
321};
322
Chris Lattnerb62bb282009-07-13 20:29:08 +0000323// NetBSD Target
324template<typename Target>
325class NetBSDTargetInfo : public OSTargetInfo<Target> {
326protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000327 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000328 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000329 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000330 Builder.defineMacro("__NetBSD__");
331 Builder.defineMacro("__unix__");
332 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000333 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000334 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000335 }
336public:
Mike Stump1eb44332009-09-09 15:08:12 +0000337 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerb62bb282009-07-13 20:29:08 +0000338 : OSTargetInfo<Target>(triple) {
339 this->UserLabelPrefix = "";
340 }
341};
342
Torok Edwin5f6c1942009-06-30 17:10:35 +0000343// OpenBSD Target
344template<typename Target>
345class OpenBSDTargetInfo : public OSTargetInfo<Target> {
346protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000347 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000348 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000349 // OpenBSD defines; list based off of gcc output
350
Benjamin Kramera9992772010-01-09 17:55:51 +0000351 Builder.defineMacro("__OpenBSD__");
352 DefineStd(Builder, "unix", Opts);
353 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000354 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000355 Builder.defineMacro("_POSIX_THREADS");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000356 }
357public:
Mike Stump1eb44332009-09-09 15:08:12 +0000358 OpenBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000359 : OSTargetInfo<Target>(triple) {}
360};
361
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000362// PSP Target
363template<typename Target>
364class PSPTargetInfo : public OSTargetInfo<Target> {
365protected:
366 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000367 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000368 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000369 Builder.defineMacro("PSP");
370 Builder.defineMacro("_PSP");
371 Builder.defineMacro("__psp__");
372 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000373 }
374public:
375 PSPTargetInfo(const std::string& triple)
376 : OSTargetInfo<Target>(triple) {
377 this->UserLabelPrefix = "";
378 }
379};
380
John Thompson3f6918a2009-11-19 17:18:50 +0000381// PS3 PPU Target
382template<typename Target>
383class PS3PPUTargetInfo : public OSTargetInfo<Target> {
384protected:
385 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000386 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000387 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000388 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000389 Builder.defineMacro("__PPU__");
390 Builder.defineMacro("__CELLOS_LV2__");
391 Builder.defineMacro("__ELF__");
392 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000393 Builder.defineMacro("_ARCH_PPC64");
394 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000395 }
396public:
397 PS3PPUTargetInfo(const std::string& triple)
398 : OSTargetInfo<Target>(triple) {
399 this->UserLabelPrefix = "";
John Thompsonec387af2009-12-18 14:21:08 +0000400 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000401 this->IntMaxType = TargetInfo::SignedLongLong;
402 this->UIntMaxType = TargetInfo::UnsignedLongLong;
403 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000404 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000405 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
406 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000407 }
408};
409
410// FIXME: Need a real SPU target.
411// PS3 SPU Target
412template<typename Target>
413class PS3SPUTargetInfo : public OSTargetInfo<Target> {
414protected:
415 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000416 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000417 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000418 Builder.defineMacro("__SPU__");
419 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000420 }
421public:
422 PS3SPUTargetInfo(const std::string& triple)
423 : OSTargetInfo<Target>(triple) {
424 this->UserLabelPrefix = "";
425 }
426};
427
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000428// AuroraUX target
429template<typename Target>
430class AuroraUXTargetInfo : public OSTargetInfo<Target> {
431protected:
432 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000433 MacroBuilder &Builder) const {
434 DefineStd(Builder, "sun", Opts);
435 DefineStd(Builder, "unix", Opts);
436 Builder.defineMacro("__ELF__");
437 Builder.defineMacro("__svr4__");
438 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000439 }
440public:
441 AuroraUXTargetInfo(const std::string& triple)
442 : OSTargetInfo<Target>(triple) {
443 this->UserLabelPrefix = "";
444 this->WCharType = this->SignedLong;
445 // FIXME: WIntType should be SignedLong
446 }
447};
448
Torok Edwin5f6c1942009-06-30 17:10:35 +0000449// Solaris target
450template<typename Target>
451class SolarisTargetInfo : public OSTargetInfo<Target> {
452protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000453 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000454 MacroBuilder &Builder) const {
455 DefineStd(Builder, "sun", Opts);
456 DefineStd(Builder, "unix", Opts);
457 Builder.defineMacro("__ELF__");
458 Builder.defineMacro("__svr4__");
459 Builder.defineMacro("__SVR4");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000460 }
461public:
Mike Stump1eb44332009-09-09 15:08:12 +0000462 SolarisTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000463 : OSTargetInfo<Target>(triple) {
464 this->UserLabelPrefix = "";
465 this->WCharType = this->SignedLong;
466 // FIXME: WIntType should be SignedLong
467 }
468};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000469
470// Windows target
471template<typename Target>
472class WindowsTargetInfo : public OSTargetInfo<Target> {
473protected:
474 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
475 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000476 Builder.defineMacro("_WIN32");
477 }
478 void getVisualStudioDefines(const LangOptions &Opts,
479 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000480 if (Opts.CPlusPlus) {
481 if (Opts.RTTI)
482 Builder.defineMacro("_CPPRTTI");
483
484 if (Opts.Exceptions)
485 Builder.defineMacro("_CPPUNWIND");
486 }
487
488 if (!Opts.CharIsSigned)
489 Builder.defineMacro("_CHAR_UNSIGNED");
490
491 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
492 // but it works for now.
493 if (Opts.POSIXThreads)
494 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000495
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000496 if (Opts.MSCVersion != 0)
497 Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
498
499 if (Opts.Microsoft) {
500 Builder.defineMacro("_MSC_EXTENSIONS");
501
502 if (Opts.CPlusPlus0x) {
503 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
504 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
505 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
506 }
507 }
508
509 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000510 }
511
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000512public:
513 WindowsTargetInfo(const std::string &triple)
514 : OSTargetInfo<Target>(triple) {}
515};
516
Mike Stump1eb44332009-09-09 15:08:12 +0000517} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000518
Chris Lattnerd29b6302008-10-05 21:50:58 +0000519//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000520// Specific target implementations.
521//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000522
Eli Friedmane4277982008-08-20 23:11:40 +0000523namespace {
524// PPC abstract base class
525class PPCTargetInfo : public TargetInfo {
526 static const Builtin::Info BuiltinInfo[];
527 static const char * const GCCRegNames[];
528 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Eli Friedmane4277982008-08-20 23:11:40 +0000529public:
Eli Friedman15b91762009-06-05 07:05:05 +0000530 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
531
Eli Friedmane4277982008-08-20 23:11:40 +0000532 virtual void getTargetBuiltins(const Builtin::Info *&Records,
533 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000534 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000535 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000536 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000537
Chris Lattner33328642009-03-20 15:52:06 +0000538 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000539 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000540
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000541 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000542 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000543 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000544 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000545 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000546 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000547 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000548 default: return false;
549 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000550 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000551 case 'b': // Base register
552 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000553 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000554 break;
555 // FIXME: The following are added to allow parsing.
556 // I just took a guess at what the actions should be.
557 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000558 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000559 case 'v': // Altivec vector register
560 Info.setAllowsRegister();
561 break;
562 case 'w':
563 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000564 case 'd':// VSX vector register to hold vector double data
565 case 'f':// VSX vector register to hold vector float data
566 case 's':// VSX vector register to hold scalar float data
567 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000568 break;
569 default:
570 return false;
571 }
572 Info.setAllowsRegister();
573 Name++; // Skip over 'w'.
574 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000575 case 'h': // `MQ', `CTR', or `LINK' register
576 case 'q': // `MQ' register
577 case 'c': // `CTR' register
578 case 'l': // `LINK' register
579 case 'x': // `CR' register (condition register) number 0
580 case 'y': // `CR' register (condition register)
581 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000582 Info.setAllowsRegister();
583 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000584 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000585 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000586 // (use `L' instead for SImode constants)
587 case 'K': // Unsigned 16-bit constant
588 case 'L': // Signed 16-bit constant shifted left 16 bits
589 case 'M': // Constant larger than 31
590 case 'N': // Exact power of 2
591 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000592 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000593 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000594 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000595 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000596 break;
597 case 'm': // Memory operand. Note that on PowerPC targets, m can
598 // include addresses that update the base register. It
599 // is therefore only safe to use `m' in an asm statement
600 // if that asm statement accesses the operand exactly once.
601 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000602 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000603 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000604 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000605 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000606 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
607 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000608 // register to be updated.
609 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000610 if (Name[1] != 's')
611 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000612 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000613 // include any automodification of the base register. Unlike
614 // `m', this constraint can be used in asm statements that
615 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000616 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000617 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000618 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000619 break;
620 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000621 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000622 case 'Z': // Memory operand that is an indexed or indirect from a
623 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000624 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000625 Info.setAllowsMemory();
626 Info.setAllowsRegister();
627 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000628 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000629 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000630 // register (`p' is preferable for asm statements)
631 case 'S': // Constant suitable as a 64-bit mask operand
632 case 'T': // Constant suitable as a 32-bit mask operand
633 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000634 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000635 // instructions
636 case 'W': // Vector constant that does not require memory
637 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000638 break;
639 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000640 }
John Thompson8e6065a2010-06-24 22:44:13 +0000641 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000642 }
Eli Friedmane4277982008-08-20 23:11:40 +0000643 virtual const char *getClobbers() const {
644 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000645 }
Eli Friedmane4277982008-08-20 23:11:40 +0000646};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000647
Eli Friedmane4277982008-08-20 23:11:40 +0000648const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000649#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
650#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
651 ALL_LANGUAGES, false },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000652#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000653};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000654
655
Chris Lattnerc0f59212009-03-02 22:27:17 +0000656/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
657/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000658void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000659 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000660 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000661 Builder.defineMacro("__ppc__");
662 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000663 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000664 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000665 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000666 Builder.defineMacro("_ARCH_PPC64");
667 Builder.defineMacro("_LP64");
668 Builder.defineMacro("__LP64__");
Chris Lattnere03ae302010-02-16 18:14:57 +0000669 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000670 Builder.defineMacro("__ppc64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000671 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +0000672 Builder.defineMacro("__ppc__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000673 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000674
Chris Lattnerc0f59212009-03-02 22:27:17 +0000675 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +0000676 Builder.defineMacro("_BIG_ENDIAN");
677 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000678
Chris Lattnerc0f59212009-03-02 22:27:17 +0000679 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000680 Builder.defineMacro("__NATURAL_ALIGNMENT__");
681 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000682
Chris Lattnerc0f59212009-03-02 22:27:17 +0000683 // FIXME: Should be controlled by command line option.
Benjamin Kramera9992772010-01-09 17:55:51 +0000684 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000685
John Thompson3f6918a2009-11-19 17:18:50 +0000686 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000687 Builder.defineMacro("__VEC__", "10206");
688 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000689 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000690}
691
Chris Lattner393ff042008-04-21 18:56:49 +0000692
Eli Friedmane4277982008-08-20 23:11:40 +0000693const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +0000694 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
695 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
696 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
697 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
698 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
699 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
700 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
701 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +0000702 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000703 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +0000704 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000705 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
706 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
707 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
708 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +0000709 "vrsave", "vscr",
710 "spe_acc", "spefscr",
711 "sfp"
712};
Reid Spencer5f016e22007-07-11 17:01:13 +0000713
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000714void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000715 unsigned &NumNames) const {
716 Names = GCCRegNames;
717 NumNames = llvm::array_lengthof(GCCRegNames);
718}
Reid Spencer5f016e22007-07-11 17:01:13 +0000719
Eli Friedmane4277982008-08-20 23:11:40 +0000720const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
721 // While some of these aliases do map to different registers
722 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000723 { { "0" }, "r0" },
724 { { "1"}, "r1" },
725 { { "2" }, "r2" },
726 { { "3" }, "r3" },
727 { { "4" }, "r4" },
728 { { "5" }, "r5" },
729 { { "6" }, "r6" },
730 { { "7" }, "r7" },
731 { { "8" }, "r8" },
732 { { "9" }, "r9" },
733 { { "10" }, "r10" },
734 { { "11" }, "r11" },
735 { { "12" }, "r12" },
736 { { "13" }, "r13" },
737 { { "14" }, "r14" },
738 { { "15" }, "r15" },
739 { { "16" }, "r16" },
740 { { "17" }, "r17" },
741 { { "18" }, "r18" },
742 { { "19" }, "r19" },
743 { { "20" }, "r20" },
744 { { "21" }, "r21" },
745 { { "22" }, "r22" },
746 { { "23" }, "r23" },
747 { { "24" }, "r24" },
748 { { "25" }, "r25" },
749 { { "26" }, "r26" },
750 { { "27" }, "r27" },
751 { { "28" }, "r28" },
752 { { "29" }, "r29" },
753 { { "30" }, "r30" },
754 { { "31" }, "r31" },
755 { { "fr0" }, "f0" },
756 { { "fr1" }, "f1" },
757 { { "fr2" }, "f2" },
758 { { "fr3" }, "f3" },
759 { { "fr4" }, "f4" },
760 { { "fr5" }, "f5" },
761 { { "fr6" }, "f6" },
762 { { "fr7" }, "f7" },
763 { { "fr8" }, "f8" },
764 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +0000765 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000766 { { "fr11" }, "f11" },
767 { { "fr12" }, "f12" },
768 { { "fr13" }, "f13" },
769 { { "fr14" }, "f14" },
770 { { "fr15" }, "f15" },
771 { { "fr16" }, "f16" },
772 { { "fr17" }, "f17" },
773 { { "fr18" }, "f18" },
774 { { "fr19" }, "f19" },
775 { { "fr20" }, "f20" },
776 { { "fr21" }, "f21" },
777 { { "fr22" }, "f22" },
778 { { "fr23" }, "f23" },
779 { { "fr24" }, "f24" },
780 { { "fr25" }, "f25" },
781 { { "fr26" }, "f26" },
782 { { "fr27" }, "f27" },
783 { { "fr28" }, "f28" },
784 { { "fr29" }, "f29" },
785 { { "fr30" }, "f30" },
786 { { "fr31" }, "f31" },
787 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +0000788};
789
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000790void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000791 unsigned &NumAliases) const {
792 Aliases = GCCRegAliases;
793 NumAliases = llvm::array_lengthof(GCCRegAliases);
794}
795} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +0000796
797namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000798class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000799public:
Chris Lattnere03ae302010-02-16 18:14:57 +0000800 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +0000801 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 +0000802 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +0000803
804 if (getTriple().getOS() == llvm::Triple::FreeBSD)
Roman Divackyc81f2a22011-01-06 08:27:10 +0000805 SizeType = UnsignedInt;
806 }
807
808 virtual const char *getVAListDeclaration() const {
809 // This is the ELF definition, and is overridden by the Darwin sub-target
810 return "typedef struct __va_list_tag {"
811 " unsigned char gpr;"
812 " unsigned char fpr;"
813 " unsigned short reserved;"
814 " void* overflow_arg_area;"
815 " void* reg_save_area;"
816 "} __builtin_va_list[1];";
Eli Friedmaned855cb2008-08-21 00:13:15 +0000817 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000818};
819} // end anonymous namespace.
820
821namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000822class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000823public:
Eli Friedmane4277982008-08-20 23:11:40 +0000824 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000825 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +0000826 IntMaxType = SignedLong;
827 UIntMaxType = UnsignedLong;
828 Int64Type = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000829 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 +0000830 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerf291b102008-05-09 06:17:04 +0000831 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000832 virtual const char *getVAListDeclaration() const {
833 return "typedef char* __builtin_va_list;";
834 }
Eli Friedmane4277982008-08-20 23:11:40 +0000835};
836} // end anonymous namespace.
837
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000838
839namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +0000840class DarwinPPC32TargetInfo :
841 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000842public:
Roman Divackyc81f2a22011-01-06 08:27:10 +0000843 DarwinPPC32TargetInfo(const std::string& triple)
844 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000845 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +0000846 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
847 }
848 virtual const char *getVAListDeclaration() const {
849 return "typedef char* __builtin_va_list;";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000850 }
851};
852
853class DarwinPPC64TargetInfo :
854 public DarwinTargetInfo<PPC64TargetInfo> {
855public:
856 DarwinPPC64TargetInfo(const std::string& triple)
857 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
858 HasAlignMac68kSupport = true;
859 }
860};
861} // end anonymous namespace.
862
Reid Spencer5f016e22007-07-11 17:01:13 +0000863namespace {
Justin Holewinski285dc652011-04-20 19:34:15 +0000864 class PTXTargetInfo : public TargetInfo {
865 static const char * const GCCRegNames[];
866 static const Builtin::Info BuiltinInfo[];
867 public:
868 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
869 TLSSupported = false;
870 LongWidth = LongAlign = 64;
871 }
872 virtual void getTargetDefines(const LangOptions &Opts,
873 MacroBuilder &Builder) const {
874 Builder.defineMacro("__PTX__");
875 }
876 virtual void getTargetBuiltins(const Builtin::Info *&Records,
877 unsigned &NumRecords) const {
878 Records = BuiltinInfo;
879 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
880 }
881
882 virtual void getGCCRegNames(const char * const *&Names,
883 unsigned &NumNames) const;
884 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
885 unsigned &NumAliases) const {
886 // No aliases.
887 Aliases = 0;
888 NumAliases = 0;
889 }
890 virtual bool validateAsmConstraint(const char *&Name,
891 TargetInfo::ConstraintInfo &info) const {
892 // FIXME: implement
893 return true;
894 }
895 virtual const char *getClobbers() const {
896 // FIXME: Is this really right?
897 return "";
898 }
899 virtual const char *getVAListDeclaration() const {
900 // FIXME: implement
901 return "typedef char* __builtin_va_list;";
902 }
903 };
904
905 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
906#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
907#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
908 ALL_LANGUAGES, false },
909#include "clang/Basic/BuiltinsPTX.def"
910 };
911
912 const char * const PTXTargetInfo::GCCRegNames[] = {
913 "r0"
914 };
915
916 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
917 unsigned &NumNames) const {
918 Names = GCCRegNames;
919 NumNames = llvm::array_lengthof(GCCRegNames);
920 }
921
922
923 class PTX32TargetInfo : public PTXTargetInfo {
924 public:
925 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
926 PointerWidth = PointerAlign = 32;
927 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
928 DescriptionString
929 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
930 }
931 };
932
933 class PTX64TargetInfo : public PTXTargetInfo {
934 public:
935 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
936 PointerWidth = PointerAlign = 64;
937 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
938 DescriptionString
939 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
940 }
941 };
942}
943
944namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +0000945// MBlaze abstract base class
946class MBlazeTargetInfo : public TargetInfo {
947 static const char * const GCCRegNames[];
948 static const TargetInfo::GCCRegAlias GCCRegAliases[];
949
950public:
951 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +0000952 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +0000953 }
954
955 virtual void getTargetBuiltins(const Builtin::Info *&Records,
956 unsigned &NumRecords) const {
957 // FIXME: Implement.
958 Records = 0;
959 NumRecords = 0;
960 }
961
962 virtual void getTargetDefines(const LangOptions &Opts,
963 MacroBuilder &Builder) const;
964
965 virtual const char *getVAListDeclaration() const {
966 return "typedef char* __builtin_va_list;";
967 }
968 virtual const char *getTargetPrefix() const {
969 return "mblaze";
970 }
971 virtual void getGCCRegNames(const char * const *&Names,
972 unsigned &NumNames) const;
973 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
974 unsigned &NumAliases) const;
975 virtual bool validateAsmConstraint(const char *&Name,
976 TargetInfo::ConstraintInfo &Info) const {
977 switch (*Name) {
978 default: return false;
979 case 'O': // Zero
980 return true;
981 case 'b': // Base register
982 case 'f': // Floating point register
983 Info.setAllowsRegister();
984 return true;
985 }
986 }
987 virtual const char *getClobbers() const {
988 return "";
989 }
990};
991
992/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
993/// #defines that are not tied to a specific subtarget.
994void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
995 MacroBuilder &Builder) const {
996 // Target identification.
997 Builder.defineMacro("__microblaze__");
998 Builder.defineMacro("_ARCH_MICROBLAZE");
999 Builder.defineMacro("__MICROBLAZE__");
1000
1001 // Target properties.
1002 Builder.defineMacro("_BIG_ENDIAN");
1003 Builder.defineMacro("__BIG_ENDIAN__");
1004
1005 // Subtarget options.
1006 Builder.defineMacro("__REGISTER_PREFIX__", "");
1007}
1008
1009
1010const char * const MBlazeTargetInfo::GCCRegNames[] = {
1011 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1012 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1013 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1014 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1015 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1016 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1017 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1018 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1019 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1020 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1021};
1022
1023void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1024 unsigned &NumNames) const {
1025 Names = GCCRegNames;
1026 NumNames = llvm::array_lengthof(GCCRegNames);
1027}
1028
1029const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1030 { {"f0"}, "r0" },
1031 { {"f1"}, "r1" },
1032 { {"f2"}, "r2" },
1033 { {"f3"}, "r3" },
1034 { {"f4"}, "r4" },
1035 { {"f5"}, "r5" },
1036 { {"f6"}, "r6" },
1037 { {"f7"}, "r7" },
1038 { {"f8"}, "r8" },
1039 { {"f9"}, "r9" },
1040 { {"f10"}, "r10" },
1041 { {"f11"}, "r11" },
1042 { {"f12"}, "r12" },
1043 { {"f13"}, "r13" },
1044 { {"f14"}, "r14" },
1045 { {"f15"}, "r15" },
1046 { {"f16"}, "r16" },
1047 { {"f17"}, "r17" },
1048 { {"f18"}, "r18" },
1049 { {"f19"}, "r19" },
1050 { {"f20"}, "r20" },
1051 { {"f21"}, "r21" },
1052 { {"f22"}, "r22" },
1053 { {"f23"}, "r23" },
1054 { {"f24"}, "r24" },
1055 { {"f25"}, "r25" },
1056 { {"f26"}, "r26" },
1057 { {"f27"}, "r27" },
1058 { {"f28"}, "r28" },
1059 { {"f29"}, "r29" },
1060 { {"f30"}, "r30" },
1061 { {"f31"}, "r31" },
1062};
1063
1064void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1065 unsigned &NumAliases) const {
1066 Aliases = GCCRegAliases;
1067 NumAliases = llvm::array_lengthof(GCCRegAliases);
1068}
1069} // end anonymous namespace.
1070
1071namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001072// Namespace for x86 abstract base class
1073const Builtin::Info BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001074#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
1075#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1076 ALL_LANGUAGES, false },
Chris Lattner6b15cdc2009-06-14 01:05:48 +00001077#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +00001078};
Eli Friedman61538a72008-05-20 14:21:01 +00001079
Nuno Lopes2550d702009-12-23 17:49:57 +00001080static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +00001081 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1082 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
1083 "argp", "flags", "fspr", "dirflag", "frame",
1084 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1085 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1086 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001087 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eli Friedman618234a2008-08-20 02:34:37 +00001088};
1089
Eric Christophercfd323d2011-06-21 00:05:20 +00001090const TargetInfo::AddlRegName AddlRegNames[] = {
1091 { { "al", "ah", "eax", "rax" }, 0 },
1092 { { "bl", "bh", "ebx", "rbx" }, 3 },
1093 { { "cl", "ch", "ecx", "rcx" }, 2 },
1094 { { "dl", "dh", "edx", "rdx" }, 1 },
1095 { { "esi", "rsi" }, 4 },
1096 { { "edi", "rdi" }, 5 },
1097 { { "esp", "rsp" }, 7 },
1098 { { "ebp", "rbp" }, 6 },
Eli Friedman618234a2008-08-20 02:34:37 +00001099};
1100
1101// X86 target abstract base class; x86-32 and x86-64 are very close, so
1102// most of the implementation can be shared.
1103class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001104 enum X86SSEEnum {
1105 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
1106 } SSELevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001107 enum AMD3DNowEnum {
1108 NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
1109 } AMD3DNowLevel;
1110
Eric Christophereea12d12010-04-02 23:50:19 +00001111 bool HasAES;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001112 bool HasAVX;
1113
Eli Friedman618234a2008-08-20 02:34:37 +00001114public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001115 X86TargetInfo(const std::string& triple)
Eric Christophereea12d12010-04-02 23:50:19 +00001116 : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001117 HasAES(false), HasAVX(false) {
Eli Friedman618234a2008-08-20 02:34:37 +00001118 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001119 }
1120 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1121 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001122 Records = BuiltinInfo;
1123 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001124 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001125 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001126 unsigned &NumNames) const {
1127 Names = GCCRegNames;
1128 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001129 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001130 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001131 unsigned &NumAliases) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001132 Aliases = 0;
1133 NumAliases = 0;
1134 }
1135 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1136 unsigned &NumNames) const {
1137 Names = AddlRegNames;
1138 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001139 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001140 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001141 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings002333f2011-06-07 23:45:05 +00001142 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001143 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001144 return "~{dirflag},~{fpsr},~{flags}";
1145 }
Chris Lattner33328642009-03-20 15:52:06 +00001146 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001147 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001148 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1149 const std::string &Name,
1150 bool Enabled) const;
Mike Stump1eb44332009-09-09 15:08:12 +00001151 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001152 llvm::StringMap<bool> &Features) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001153 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Reid Spencer5f016e22007-07-11 17:01:13 +00001154};
Chris Lattner3daed522009-03-02 22:20:04 +00001155
Mike Stump1eb44332009-09-09 15:08:12 +00001156void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001157 llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001158 // FIXME: This should not be here.
1159 Features["3dnow"] = false;
1160 Features["3dnowa"] = false;
1161 Features["mmx"] = false;
1162 Features["sse"] = false;
1163 Features["sse2"] = false;
1164 Features["sse3"] = false;
1165 Features["ssse3"] = false;
1166 Features["sse41"] = false;
1167 Features["sse42"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001168 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001169 Features["avx"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001170
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001171 // LLVM does not currently recognize this.
1172 // Features["sse4a"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001173
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001174 // FIXME: This *really* should not be here.
1175
1176 // X86_64 always has SSE2.
1177 if (PointerWidth == 64)
1178 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1179
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001180 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1181 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1182 ;
1183 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1184 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001185 else if (CPU == "pentium3")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001186 setFeatureEnabled(Features, "sse", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001187 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001188 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001189 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001190 setFeatureEnabled(Features, "sse3", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001191 else if (CPU == "core2")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001192 setFeatureEnabled(Features, "ssse3", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001193 else if (CPU == "penryn") {
1194 setFeatureEnabled(Features, "sse4", true);
1195 Features["sse42"] = false;
1196 } else if (CPU == "atom")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001197 setFeatureEnabled(Features, "sse3", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001198 else if (CPU == "corei7") {
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001199 setFeatureEnabled(Features, "sse4", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001200 setFeatureEnabled(Features, "aes", true);
Benjamin Kramerb65b6722011-05-20 15:11:23 +00001201 } else if (CPU == "corei7-avx") {
Roman Divackybcaa3b82011-04-05 20:32:44 +00001202 setFeatureEnabled(Features, "sse4", true);
1203 setFeatureEnabled(Features, "aes", true);
1204// setFeatureEnabled(Features, "avx", true);
1205 } else if (CPU == "k6" || CPU == "winchip-c6")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001206 setFeatureEnabled(Features, "mmx", true);
Mike Stump1eb44332009-09-09 15:08:12 +00001207 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001208 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
1209 setFeatureEnabled(Features, "mmx", true);
1210 setFeatureEnabled(Features, "3dnow", true);
1211 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1212 setFeatureEnabled(Features, "sse", true);
1213 setFeatureEnabled(Features, "3dnowa", true);
1214 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1215 CPU == "athlon-fx") {
Mike Stump1eb44332009-09-09 15:08:12 +00001216 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001217 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00001218 } else if (CPU == "k8-sse3") {
1219 setFeatureEnabled(Features, "sse3", true);
1220 setFeatureEnabled(Features, "3dnowa", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001221 } else if (CPU == "c3-2")
1222 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001223}
1224
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001225bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump1eb44332009-09-09 15:08:12 +00001226 const std::string &Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001227 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00001228 // FIXME: This *really* should not be here. We need some way of translating
1229 // options into llvm subtarget features.
1230 if (!Features.count(Name) &&
1231 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001232 return false;
1233
1234 if (Enabled) {
1235 if (Name == "mmx")
1236 Features["mmx"] = true;
1237 else if (Name == "sse")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001238 Features["mmx"] = Features["sse"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001239 else if (Name == "sse2")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001240 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001241 else if (Name == "sse3")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001242 Features["mmx"] = Features["sse"] = Features["sse2"] =
1243 Features["sse3"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001244 else if (Name == "ssse3")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001245 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001246 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001247 else if (Name == "sse4" || Name == "sse4.2")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001248 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001249 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001250 else if (Name == "sse4.1")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001251 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopherd39ebe22010-03-04 02:26:37 +00001252 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001253 else if (Name == "3dnow")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001254 Features["3dnowa"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001255 else if (Name == "3dnowa")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001256 Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00001257 else if (Name == "aes")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001258 Features["aes"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001259 else if (Name == "avx")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001260 Features["avx"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001261 } else {
1262 if (Name == "mmx")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001263 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] =
1264 Features["sse"] = Features["sse2"] = Features["sse3"] =
1265 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001266 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00001267 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001268 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001269 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00001270 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001271 Features["sse41"] = Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001272 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001273 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001274 Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001275 else if (Name == "ssse3")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001276 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencerb24bac92011-04-17 19:22:03 +00001277 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001278 Features["sse41"] = Features["sse42"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00001279 else if (Name == "sse4.2")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001280 Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001281 else if (Name == "3dnow")
1282 Features["3dnow"] = Features["3dnowa"] = false;
1283 else if (Name == "3dnowa")
1284 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001285 else if (Name == "aes")
1286 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001287 else if (Name == "avx")
1288 Features["avx"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001289 }
1290
1291 return true;
1292}
1293
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001294/// HandleTargetOptions - Perform initialization based on the user
1295/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001296void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001297 // Remember the maximum enabled sselevel.
1298 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1299 // Ignore disabled features.
1300 if (Features[i][0] == '-')
1301 continue;
1302
Eric Christophereea12d12010-04-02 23:50:19 +00001303 if (Features[i].substr(1) == "aes") {
1304 HasAES = true;
1305 continue;
1306 }
1307
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001308 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1309 // For now let it be enabled together with other SSE levels.
1310 if (Features[i].substr(1) == "avx") {
1311 HasAVX = true;
1312 continue;
1313 }
1314
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001315 assert(Features[i][0] == '+' && "Invalid target feature!");
1316 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1317 .Case("sse42", SSE42)
1318 .Case("sse41", SSE41)
1319 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00001320 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001321 .Case("sse2", SSE2)
1322 .Case("sse", SSE1)
1323 .Case("mmx", MMX)
1324 .Default(NoMMXSSE);
1325 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001326
1327 AMD3DNowEnum ThreeDNowLevel =
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001328 llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1329 .Case("3dnowa", AMD3DNowAthlon)
1330 .Case("3dnow", AMD3DNow)
1331 .Default(NoAMD3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001332
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001333 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001334 }
Chris Lattner3daed522009-03-02 22:20:04 +00001335}
Chris Lattnerc0f59212009-03-02 22:27:17 +00001336
1337/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1338/// that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00001339void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001340 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001341 // Target identification.
1342 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001343 Builder.defineMacro("_LP64");
1344 Builder.defineMacro("__LP64__");
1345 Builder.defineMacro("__amd64__");
1346 Builder.defineMacro("__amd64");
1347 Builder.defineMacro("__x86_64");
1348 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00001349 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00001350 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00001351 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001352
Eric Christophereea12d12010-04-02 23:50:19 +00001353 if (HasAES)
1354 Builder.defineMacro("__AES__");
1355
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001356 if (HasAVX)
1357 Builder.defineMacro("__AVX__");
1358
Chris Lattnerc0f59212009-03-02 22:27:17 +00001359 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00001360 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001361
Chris Lattnerc0f59212009-03-02 22:27:17 +00001362 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +00001363 Builder.defineMacro("__nocona");
1364 Builder.defineMacro("__nocona__");
1365 Builder.defineMacro("__tune_nocona__");
1366 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001367
Chris Lattner54175442009-04-19 17:32:33 +00001368 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1369 // functions in glibc header files that use FP Stack inline asm which the
1370 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00001371 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001372
Chris Lattner84f0ea82009-03-02 22:40:39 +00001373 // Each case falls through to the previous one here.
1374 switch (SSELevel) {
1375 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00001376 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001377 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00001378 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001379 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001380 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001381 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001382 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001383 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00001384 Builder.defineMacro("__SSE2__");
1385 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001386 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00001387 Builder.defineMacro("__SSE__");
1388 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001389 case MMX:
Benjamin Kramera9992772010-01-09 17:55:51 +00001390 Builder.defineMacro("__MMX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001391 case NoMMXSSE:
1392 break;
1393 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001394
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001395 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001396 switch (SSELevel) {
Michael J. Spencera764e832010-10-21 08:22:51 +00001397 case SSE42:
1398 case SSE41:
1399 case SSSE3:
1400 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001401 case SSE2:
1402 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1403 break;
1404 case SSE1:
1405 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1406 break;
1407 default:
1408 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1409 }
1410 }
1411
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001412 // Each case falls through to the previous one here.
1413 switch (AMD3DNowLevel) {
1414 case AMD3DNowAthlon:
1415 Builder.defineMacro("__3dNOW_A__");
1416 case AMD3DNow:
1417 Builder.defineMacro("__3dNOW__");
1418 case NoAMD3DNow:
1419 break;
1420 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00001421}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001422
1423
Eli Friedman618234a2008-08-20 02:34:37 +00001424bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001425X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00001426 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001427 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00001428 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00001429 case 'Y': // first letter of a pair:
1430 switch (*(Name+1)) {
1431 default: return false;
1432 case '0': // First SSE register.
1433 case 't': // Any SSE register, when SSE2 is enabled.
1434 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1435 case 'm': // any MMX register, when inter-unit moves enabled.
1436 break; // falls through to setAllowsRegister.
1437 }
Eli Friedman618234a2008-08-20 02:34:37 +00001438 case 'a': // eax.
1439 case 'b': // ebx.
1440 case 'c': // ecx.
1441 case 'd': // edx.
1442 case 'S': // esi.
1443 case 'D': // edi.
1444 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00001445 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00001446 case 't': // top of floating point stack.
1447 case 'u': // second from top of floating point stack.
1448 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00001449 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00001450 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00001451 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00001452 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1453 case 'l': // "Index" registers: any general register that can be used as an
1454 // index in a base+index memory access.
1455 Info.setAllowsRegister();
1456 return true;
1457 case 'C': // SSE floating point constant.
1458 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001459 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001460 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001461 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001462 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00001463 return true;
1464 }
Dale Johannesen545be512010-08-24 22:33:12 +00001465 return false;
Eli Friedman618234a2008-08-20 02:34:37 +00001466}
1467
Dale Johannesenf6e2c202010-10-29 23:12:32 +00001468
Eli Friedman618234a2008-08-20 02:34:37 +00001469std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00001470X86TargetInfo::convertConstraint(const char *&Constraint) const {
1471 switch (*Constraint) {
Eli Friedman618234a2008-08-20 02:34:37 +00001472 case 'a': return std::string("{ax}");
1473 case 'b': return std::string("{bx}");
1474 case 'c': return std::string("{cx}");
1475 case 'd': return std::string("{dx}");
1476 case 'S': return std::string("{si}");
1477 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00001478 case 'p': // address
1479 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00001480 case 't': // top of floating point stack.
1481 return std::string("{st}");
1482 case 'u': // second from top of floating point stack.
1483 return std::string("{st(1)}"); // second from top of floating point stack.
1484 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00001485 return std::string(1, *Constraint);
Eli Friedman618234a2008-08-20 02:34:37 +00001486 }
1487}
Eli Friedman618234a2008-08-20 02:34:37 +00001488} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00001489
1490namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001491// X86-32 generic target
1492class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001493public:
Eli Friedman618234a2008-08-20 02:34:37 +00001494 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1495 DoubleAlign = LongLongAlign = 32;
1496 LongDoubleWidth = 96;
1497 LongDoubleAlign = 32;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001498 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1499 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001500 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman1afabd92009-03-29 20:31:09 +00001501 SizeType = UnsignedInt;
1502 PtrDiffType = SignedInt;
1503 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001504 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00001505
1506 // Use fpret for all types.
1507 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1508 (1 << TargetInfo::Double) |
1509 (1 << TargetInfo::LongDouble));
Eli Friedman618234a2008-08-20 02:34:37 +00001510 }
1511 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001512 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +00001513 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00001514
Chris Lattner21fb98e2009-09-23 06:06:36 +00001515 int getEHDataRegisterNumber(unsigned RegNo) const {
1516 if (RegNo == 0) return 0;
1517 if (RegNo == 1) return 2;
1518 return -1;
1519 }
Eli Friedman618234a2008-08-20 02:34:37 +00001520};
1521} // end anonymous namespace
1522
1523namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00001524class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1525public:
1526 OpenBSDI386TargetInfo(const std::string& triple) :
1527 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1528 SizeType = UnsignedLong;
1529 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00001530 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00001531 }
1532};
1533} // end anonymous namespace
1534
1535namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00001536class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00001537public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00001538 DarwinI386TargetInfo(const std::string& triple) :
1539 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00001540 LongDoubleWidth = 128;
1541 LongDoubleAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +00001542 SizeType = UnsignedLong;
1543 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001544 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1545 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001546 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbar613fd672010-05-27 00:35:16 +00001547 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00001548 }
1549
Eli Friedman618234a2008-08-20 02:34:37 +00001550};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001551} // end anonymous namespace
1552
1553namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00001554// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001555class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00001556public:
1557 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001558 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00001559 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00001560 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00001561 DoubleAlign = LongLongAlign = 64;
1562 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 +00001563 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1564 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedman29a30502008-08-21 01:40:19 +00001565 }
Michael J. Spencera764e832010-10-21 08:22:51 +00001566 virtual void getTargetDefines(const LangOptions &Opts,
1567 MacroBuilder &Builder) const {
1568 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1569 }
1570};
1571} // end anonymous namespace
1572
1573namespace {
1574
1575// x86-32 Windows Visual Studio target
1576class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1577public:
1578 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1579 : WindowsX86_32TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00001580 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00001581 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1582 }
1583 virtual void getTargetDefines(const LangOptions &Opts,
1584 MacroBuilder &Builder) const {
1585 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1586 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1587 // The value of the following reflects processor type.
1588 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1589 // We lost the original triple, so we use the default.
1590 Builder.defineMacro("_M_IX86", "600");
1591 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001592};
1593} // end anonymous namespace
1594
1595namespace {
1596// x86-32 MinGW target
1597class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1598public:
1599 MinGWX86_32TargetInfo(const std::string& triple)
1600 : WindowsX86_32TargetInfo(triple) {
1601 }
1602 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001603 MacroBuilder &Builder) const {
1604 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00001605 DefineStd(Builder, "WIN32", Opts);
1606 DefineStd(Builder, "WINNT", Opts);
1607 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00001608 Builder.defineMacro("__MSVCRT__");
1609 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00001610
1611 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1612 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1613 if (Opts.Microsoft)
1614 // Provide "as-is" __declspec.
1615 Builder.defineMacro("__declspec", "__declspec");
1616 else
1617 // Provide alias of __attribute__ like mingw32-gcc.
1618 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001619 }
1620};
1621} // end anonymous namespace
1622
1623namespace {
1624// x86-32 Cygwin target
1625class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1626public:
1627 CygwinX86_32TargetInfo(const std::string& triple)
1628 : X86_32TargetInfo(triple) {
1629 TLSSupported = false;
1630 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001631 DoubleAlign = LongLongAlign = 64;
1632 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1633 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001634 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001635 }
1636 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001637 MacroBuilder &Builder) const {
1638 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1639 Builder.defineMacro("__CYGWIN__");
1640 Builder.defineMacro("__CYGWIN32__");
1641 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00001642 if (Opts.CPlusPlus)
1643 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00001644 }
Eli Friedman29a30502008-08-21 01:40:19 +00001645};
1646} // end anonymous namespace
1647
1648namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00001649// x86-32 Haiku target
1650class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1651public:
1652 HaikuX86_32TargetInfo(const std::string& triple)
1653 : X86_32TargetInfo(triple) {
1654 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00001655 IntPtrType = SignedLong;
1656 PtrDiffType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00001657 this->UserLabelPrefix = "";
Eli Friedmana7e68452010-08-22 01:00:03 +00001658 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00001659 virtual void getTargetDefines(const LangOptions &Opts,
1660 MacroBuilder &Builder) const {
1661 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1662 Builder.defineMacro("__INTEL__");
1663 Builder.defineMacro("__HAIKU__");
1664 }
1665};
1666} // end anonymous namespace
1667
1668namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001669// x86-64 generic target
1670class X86_64TargetInfo : public X86TargetInfo {
1671public:
Chris Lattner33328642009-03-20 15:52:06 +00001672 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00001673 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00001674 LongDoubleWidth = 128;
1675 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00001676 LargeArrayMinWidth = 128;
1677 LargeArrayAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00001678 IntMaxType = SignedLong;
1679 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001680 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001681 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00001682
Eli Friedmaned855cb2008-08-21 00:13:15 +00001683 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1684 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001685 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00001686
1687 // Use fpret only for long double.
1688 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Reid Spencer5f016e22007-07-11 17:01:13 +00001689 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001690 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001691 return "typedef struct __va_list_tag {"
1692 " unsigned gp_offset;"
1693 " unsigned fp_offset;"
1694 " void* overflow_arg_area;"
1695 " void* reg_save_area;"
John McCall2b7baf02010-05-28 18:25:28 +00001696 "} __va_list_tag;"
Eli Friedmandc043162009-07-03 00:45:06 +00001697 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +00001698 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001699
Chris Lattner21fb98e2009-09-23 06:06:36 +00001700 int getEHDataRegisterNumber(unsigned RegNo) const {
1701 if (RegNo == 0) return 0;
1702 if (RegNo == 1) return 1;
1703 return -1;
1704 }
Eli Friedman618234a2008-08-20 02:34:37 +00001705};
1706} // end anonymous namespace
1707
1708namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001709// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001710class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001711public:
1712 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001713 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001714 TLSSupported = false;
1715 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00001716 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00001717 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00001718 IntMaxType = SignedLongLong;
1719 UIntMaxType = UnsignedLongLong;
1720 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00001721 SizeType = UnsignedLongLong;
1722 PtrDiffType = SignedLongLong;
1723 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00001724 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001725 }
1726 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001727 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001728 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001729 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00001730 }
NAKAMURA Takumi79521992011-01-17 22:56:23 +00001731 virtual const char *getVAListDeclaration() const {
1732 return "typedef char* __builtin_va_list;";
1733 }
Michael J. Spencera764e832010-10-21 08:22:51 +00001734};
1735} // end anonymous namespace
1736
1737namespace {
1738// x86-64 Windows Visual Studio target
1739class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1740public:
1741 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1742 : WindowsX86_64TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00001743 LongDoubleWidth = LongDoubleAlign = 64;
1744 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00001745 }
1746 virtual void getTargetDefines(const LangOptions &Opts,
1747 MacroBuilder &Builder) const {
1748 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1749 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00001750 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001751 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001752 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001753};
1754} // end anonymous namespace
1755
1756namespace {
1757// x86-64 MinGW target
1758class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1759public:
1760 MinGWX86_64TargetInfo(const std::string& triple)
1761 : WindowsX86_64TargetInfo(triple) {
1762 }
1763 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001764 MacroBuilder &Builder) const {
1765 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00001766 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00001767 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00001768 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00001769 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00001770
1771 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1772 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1773 if (Opts.Microsoft)
1774 // Provide "as-is" __declspec.
1775 Builder.defineMacro("__declspec", "__declspec");
1776 else
1777 // Provide alias of __attribute__ like mingw32-gcc.
1778 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001779 }
1780};
1781} // end anonymous namespace
1782
1783namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001784class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1785public:
Mike Stump1eb44332009-09-09 15:08:12 +00001786 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001787 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1788 Int64Type = SignedLongLong;
1789 }
1790};
1791} // end anonymous namespace
1792
1793namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00001794class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1795public:
Mike Stump1eb44332009-09-09 15:08:12 +00001796 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00001797 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1798 IntMaxType = SignedLongLong;
1799 UIntMaxType = UnsignedLongLong;
1800 Int64Type = SignedLongLong;
1801 }
1802};
1803} // end anonymous namespace
1804
1805namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00001806class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001807 // Possible FPU choices.
1808 enum FPUMode {
1809 NoFPU,
1810 VFP2FPU,
1811 VFP3FPU,
1812 NeonFPU
1813 };
1814
1815 static bool FPUModeIsVFP(FPUMode Mode) {
1816 return Mode >= VFP2FPU && Mode <= NeonFPU;
1817 }
1818
1819 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1820 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001821
Daniel Dunbareac7c532009-12-18 18:42:37 +00001822 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001823
1824 unsigned FPU : 3;
1825
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001826 unsigned IsThumb : 1;
1827
1828 // Initialized via features.
1829 unsigned SoftFloat : 1;
1830 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001831
Chris Lattner2752c012010-03-03 19:03:45 +00001832 static const Builtin::Info BuiltinInfo[];
1833
Chris Lattner393ff042008-04-21 18:56:49 +00001834public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001835 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbareac7c532009-12-18 18:42:37 +00001836 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001837 {
Daniel Dunbara2a41612009-09-14 00:02:24 +00001838 SizeType = UnsignedInt;
1839 PtrDiffType = SignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001840
Chris Lattner9bffb072010-04-23 16:29:58 +00001841 // {} in inline assembly are neon specifiers, not assembly variant
1842 // specifiers.
1843 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00001844
Daniel Dunbareac7c532009-12-18 18:42:37 +00001845 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00001846 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001847 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00001848 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1849 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001850 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1851 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001852 "v64:64:64-v128:64:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001853 } else {
1854 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1855 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001856 "v64:64:64-v128:64:128-a0:0:64-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001857 }
John McCallee79a4c2010-08-21 22:46:04 +00001858
1859 // ARM targets default to using the ARM C++ ABI.
1860 CXXABI = CXXABI_ARM;
Eli Friedman61538a72008-05-20 14:21:01 +00001861 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001862 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00001863 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001864 ABI = Name;
1865
Daniel Dunbara2a41612009-09-14 00:02:24 +00001866 // The defaults (above) are for AAPCS, check if we need to change them.
1867 //
1868 // FIXME: We need support for -meabi... we could just mangle it into the
1869 // name.
1870 if (Name == "apcs-gnu") {
Daniel Dunbard410fa22010-01-27 20:23:08 +00001871 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbara2a41612009-09-14 00:02:24 +00001872 SizeType = UnsignedLong;
1873
Daniel Dunbar684de632010-04-22 16:14:54 +00001874 // Do not respect the alignment of bit-field types when laying out
1875 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1876 UseBitFieldTypeAlignment = false;
1877
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001878 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00001879 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1880 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001881 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1882 "i64:32:32-f32:32:32-f64:32:32-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001883 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001884 } else {
1885 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001886 "i64:32:64-f32:32:32-f64:32:64-"
1887 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001888 }
1889
Daniel Dunbara2a41612009-09-14 00:02:24 +00001890 // FIXME: Override "preferred align" for double and long long.
1891 } else if (Name == "aapcs") {
1892 // FIXME: Enumerated types are variable width in straight AAPCS.
1893 } else if (Name == "aapcs-linux") {
1894 ;
1895 } else
1896 return false;
1897
1898 return true;
1899 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001900
Daniel Dunbara91320b2009-12-21 23:28:17 +00001901 void getDefaultFeatures(const std::string &CPU,
1902 llvm::StringMap<bool> &Features) const {
1903 // FIXME: This should not be here.
1904 Features["vfp2"] = false;
1905 Features["vfp3"] = false;
1906 Features["neon"] = false;
1907
1908 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1909 Features["vfp2"] = true;
1910 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1911 Features["neon"] = true;
1912 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00001913
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001914 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1915 const std::string &Name,
1916 bool Enabled) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001917 if (Name == "soft-float" || Name == "soft-float-abi") {
1918 Features[Name] = Enabled;
1919 } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1920 // These effectively are a single option, reset them when any is enabled.
1921 if (Enabled)
1922 Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1923 Features[Name] = Enabled;
1924 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001925 return false;
1926
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001927 return true;
1928 }
1929
1930 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001931 FPU = NoFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001932 SoftFloat = SoftFloatABI = false;
1933 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1934 if (Features[i] == "+soft-float")
1935 SoftFloat = true;
1936 else if (Features[i] == "+soft-float-abi")
1937 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001938 else if (Features[i] == "+vfp2")
1939 FPU = VFP2FPU;
1940 else if (Features[i] == "+vfp3")
1941 FPU = VFP3FPU;
1942 else if (Features[i] == "+neon")
1943 FPU = NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001944 }
1945
1946 // Remove front-end specific options which the backend handles differently.
1947 std::vector<std::string>::iterator it;
1948 it = std::find(Features.begin(), Features.end(), "+soft-float");
1949 if (it != Features.end())
1950 Features.erase(it);
1951 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
1952 if (it != Features.end())
1953 Features.erase(it);
1954 }
1955
Daniel Dunbareac7c532009-12-18 18:42:37 +00001956 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
1957 return llvm::StringSwitch<const char*>(Name)
1958 .Cases("arm8", "arm810", "4")
1959 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
1960 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
1961 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
1962 .Case("ep9312", "4T")
1963 .Cases("arm10tdmi", "arm1020t", "5T")
1964 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
1965 .Case("arm926ej-s", "5TEJ")
1966 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
1967 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00001968 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001969 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00001970 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001971 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1972 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson06f45632011-01-06 16:57:20 +00001973 .Case("cortex-m3", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00001974 .Case("cortex-m0", "6M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001975 .Default(0);
1976 }
1977 virtual bool setCPU(const std::string &Name) {
1978 if (!getCPUDefineSuffix(Name))
1979 return false;
1980
1981 CPU = Name;
1982 return true;
1983 }
Chris Lattner33328642009-03-20 15:52:06 +00001984 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001985 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001986 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00001987 Builder.defineMacro("__arm");
1988 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001989
Chris Lattnerc0f59212009-03-02 22:27:17 +00001990 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00001991 Builder.defineMacro("__ARMEL__");
1992 Builder.defineMacro("__LITTLE_ENDIAN__");
1993 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001994
1995 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00001996 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001997
Mike Stump437bb4b2009-04-08 02:07:04 +00001998 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001999
Daniel Dunbareac7c532009-12-18 18:42:37 +00002000 // FIXME: It's more complicated than this and we don't really support
2001 // interworking.
2002 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00002003 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002004
Daniel Dunbareac7c532009-12-18 18:42:37 +00002005 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramera9992772010-01-09 17:55:51 +00002006 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002007
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002008 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00002009 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002010
2011 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00002012 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002013
Bob Wilson84f95cf2011-05-13 18:56:03 +00002014 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002015 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00002016 Builder.defineMacro("__THUMBEL__");
2017 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00002018 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002019 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002020 }
2021
2022 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00002023 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002024
2025 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramera9992772010-01-09 17:55:51 +00002026 Builder.defineMacro("__VFP_FP__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002027
2028 // This only gets set when Neon instructions are actually available, unlike
2029 // the VFP define, hence the soft float and arch check. This is subtly
2030 // different from gcc, we follow the intent which was that it should be set
2031 // when Neon instructions are actually available.
Bob Wilson84f95cf2011-05-13 18:56:03 +00002032 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002033 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00002034 }
2035 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2036 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00002037 Records = BuiltinInfo;
2038 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00002039 }
2040 virtual const char *getVAListDeclaration() const {
John McCall0e9972c2011-05-09 02:19:37 +00002041 return "typedef void* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +00002042 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002043 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002044 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002045 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002046 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002047 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002048 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002049 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002050 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00002051 default:
Nate Begemanad487f42008-04-22 05:03:19 +00002052 case 'l': // r0-r7
2053 case 'h': // r8-r15
2054 case 'w': // VFP Floating point register single precision
2055 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00002056 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00002057 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00002058 case 'U': // a memory reference...
2059 switch (Name[1]) {
2060 case 'q': // ...ARMV4 ldrsb
2061 case 'v': // ...VFP load/store (reg+constant offset)
2062 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00002063 case 't': // address valid for load/store opaque types wider
2064 // than 128-bits
2065 case 'n': // valid address for Neon doubleword vector load/store
2066 case 'm': // valid address for Neon element and structure load/store
2067 case 's': // valid address for non-offset loads/stores of quad-word
2068 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00002069 Info.setAllowsMemory();
2070 Name++;
2071 return true;
2072 }
Nate Begemanad487f42008-04-22 05:03:19 +00002073 }
Chris Lattner393ff042008-04-21 18:56:49 +00002074 return false;
2075 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00002076 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00002077 std::string R;
2078 switch (*Constraint) {
2079 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00002080 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00002081 Constraint++;
2082 break;
Eric Christopher283f4472011-06-17 00:40:18 +00002083 case 'p': // 'p' should be translated to 'r' by default.
2084 R = std::string("r");
2085 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00002086 default:
2087 return std::string(1, *Constraint);
2088 }
2089 return R;
2090 }
Chris Lattner393ff042008-04-21 18:56:49 +00002091 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002092 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00002093 return "";
2094 }
2095};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002096
2097const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002098 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002099 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002100 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2101
2102 // Float registers
2103 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2104 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2105 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002106 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002107
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002108 // Double registers
2109 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2110 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00002111 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2112 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002113
2114 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00002115 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2116 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002117};
2118
2119void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002120 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002121 Names = GCCRegNames;
2122 NumNames = llvm::array_lengthof(GCCRegNames);
2123}
2124
2125const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002126 { { "a1" }, "r0" },
2127 { { "a2" }, "r1" },
2128 { { "a3" }, "r2" },
2129 { { "a4" }, "r3" },
2130 { { "v1" }, "r4" },
2131 { { "v2" }, "r5" },
2132 { { "v3" }, "r6" },
2133 { { "v4" }, "r7" },
2134 { { "v5" }, "r8" },
2135 { { "v6", "rfp" }, "r9" },
2136 { { "sl" }, "r10" },
2137 { { "fp" }, "r11" },
2138 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002139 { { "r13" }, "sp" },
2140 { { "r14" }, "lr" },
2141 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002142 // The S, D and Q registers overlap, but aren't really aliases; we
2143 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002144};
2145
2146void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2147 unsigned &NumAliases) const {
2148 Aliases = GCCRegAliases;
2149 NumAliases = llvm::array_lengthof(GCCRegAliases);
2150}
Chris Lattner2752c012010-03-03 19:03:45 +00002151
2152const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +00002153#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
2154#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
2155 ALL_LANGUAGES, false },
Chris Lattner2752c012010-03-03 19:03:45 +00002156#include "clang/Basic/BuiltinsARM.def"
2157};
Chris Lattner393ff042008-04-21 18:56:49 +00002158} // end anonymous namespace.
2159
Eli Friedmana9f54962008-08-20 07:44:10 +00002160
2161namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00002162class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002163 public DarwinTargetInfo<ARMTargetInfo> {
2164protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00002165 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00002166 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00002167 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00002168 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002169
Torok Edwin5f6c1942009-06-30 17:10:35 +00002170public:
Mike Stump1eb44332009-09-09 15:08:12 +00002171 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002172 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2173 HasAlignMac68kSupport = true;
2174 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002175};
2176} // end anonymous namespace.
2177
Reid Spencer5f016e22007-07-11 17:01:13 +00002178namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00002179class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00002180 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2181 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002182 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00002183public:
Eli Friedman01b86682008-08-20 07:28:14 +00002184 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2185 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00002186 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 +00002187 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00002188 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002189 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2190 const std::string &Name,
2191 bool Enabled) const {
2192 if (Name == "soft-float")
2193 Features[Name] = Enabled;
2194 else
2195 return false;
2196
2197 return true;
2198 }
2199 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2200 SoftFloat = false;
2201 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2202 if (Features[i] == "+soft-float")
2203 SoftFloat = true;
2204 }
Chris Lattner33328642009-03-20 15:52:06 +00002205 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002206 MacroBuilder &Builder) const {
2207 DefineStd(Builder, "sparc", Opts);
2208 Builder.defineMacro("__sparcv8");
2209 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002210
2211 if (SoftFloat)
2212 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00002213 }
2214 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2215 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002216 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00002217 }
2218 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002219 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00002220 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002221 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002222 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002223 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002224 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002225 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00002226 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002227 // FIXME: Implement!
2228 return false;
Gabor Greif26658672008-02-21 16:29:08 +00002229 }
2230 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002231 // FIXME: Implement!
2232 return "";
Gabor Greif26658672008-02-21 16:29:08 +00002233 }
2234};
2235
Chris Lattnere957f532009-01-27 01:58:38 +00002236const char * const SparcV8TargetInfo::GCCRegNames[] = {
2237 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2238 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2239 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2240 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2241};
2242
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002243void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002244 unsigned &NumNames) const {
2245 Names = GCCRegNames;
2246 NumNames = llvm::array_lengthof(GCCRegNames);
2247}
2248
2249const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002250 { { "g0" }, "r0" },
2251 { { "g1" }, "r1" },
2252 { { "g2" }, "r2" },
2253 { { "g3" }, "r3" },
2254 { { "g4" }, "r4" },
2255 { { "g5" }, "r5" },
2256 { { "g6" }, "r6" },
2257 { { "g7" }, "r7" },
2258 { { "o0" }, "r8" },
2259 { { "o1" }, "r9" },
2260 { { "o2" }, "r10" },
2261 { { "o3" }, "r11" },
2262 { { "o4" }, "r12" },
2263 { { "o5" }, "r13" },
2264 { { "o6", "sp" }, "r14" },
2265 { { "o7" }, "r15" },
2266 { { "l0" }, "r16" },
2267 { { "l1" }, "r17" },
2268 { { "l2" }, "r18" },
2269 { { "l3" }, "r19" },
2270 { { "l4" }, "r20" },
2271 { { "l5" }, "r21" },
2272 { { "l6" }, "r22" },
2273 { { "l7" }, "r23" },
2274 { { "i0" }, "r24" },
2275 { { "i1" }, "r25" },
2276 { { "i2" }, "r26" },
2277 { { "i3" }, "r27" },
2278 { { "i4" }, "r28" },
2279 { { "i5" }, "r29" },
2280 { { "i6", "fp" }, "r30" },
2281 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00002282};
2283
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002284void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002285 unsigned &NumAliases) const {
2286 Aliases = GCCRegAliases;
2287 NumAliases = llvm::array_lengthof(GCCRegAliases);
2288}
Gabor Greif26658672008-02-21 16:29:08 +00002289} // end anonymous namespace.
2290
Eli Friedman01b86682008-08-20 07:28:14 +00002291namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002292class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2293public:
2294 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2295 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2296 SizeType = UnsignedInt;
2297 PtrDiffType = SignedInt;
2298 }
2299};
Torok Edwin5f6c1942009-06-30 17:10:35 +00002300class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00002301public:
2302 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002303 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00002304 SizeType = UnsignedInt;
2305 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00002306 }
2307};
2308} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00002309
Chris Lattner2621fd12008-05-08 05:58:21 +00002310namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002311 class MSP430TargetInfo : public TargetInfo {
2312 static const char * const GCCRegNames[];
2313 public:
2314 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2315 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00002316 IntWidth = 16; IntAlign = 16;
2317 LongWidth = 32; LongLongWidth = 64;
2318 LongAlign = LongLongAlign = 16;
2319 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002320 SizeType = UnsignedInt;
2321 IntMaxType = SignedLong;
2322 UIntMaxType = UnsignedLong;
2323 IntPtrType = SignedShort;
2324 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00002325 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00002326 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002327 }
2328 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002329 MacroBuilder &Builder) const {
2330 Builder.defineMacro("MSP430");
2331 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002332 // FIXME: defines for different 'flavours' of MCU
2333 }
2334 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2335 unsigned &NumRecords) const {
2336 // FIXME: Implement.
2337 Records = 0;
2338 NumRecords = 0;
2339 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002340 virtual void getGCCRegNames(const char * const *&Names,
2341 unsigned &NumNames) const;
2342 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2343 unsigned &NumAliases) const {
2344 // No aliases.
2345 Aliases = 0;
2346 NumAliases = 0;
2347 }
2348 virtual bool validateAsmConstraint(const char *&Name,
2349 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00002350 // No target constraints for now.
2351 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002352 }
2353 virtual const char *getClobbers() const {
2354 // FIXME: Is this really right?
2355 return "";
2356 }
2357 virtual const char *getVAListDeclaration() const {
2358 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00002359 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002360 }
2361 };
2362
2363 const char * const MSP430TargetInfo::GCCRegNames[] = {
2364 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2365 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2366 };
2367
2368 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2369 unsigned &NumNames) const {
2370 Names = GCCRegNames;
2371 NumNames = llvm::array_lengthof(GCCRegNames);
2372 }
2373}
2374
2375
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002376namespace {
2377 class SystemZTargetInfo : public TargetInfo {
2378 static const char * const GCCRegNames[];
2379 public:
2380 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2381 TLSSupported = false;
2382 IntWidth = IntAlign = 32;
2383 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2384 PointerWidth = PointerAlign = 64;
Chris Lattner1932e122009-11-07 18:59:41 +00002385 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2386 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002387 }
2388 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002389 MacroBuilder &Builder) const {
2390 Builder.defineMacro("__s390__");
2391 Builder.defineMacro("__s390x__");
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002392 }
2393 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2394 unsigned &NumRecords) const {
2395 // FIXME: Implement.
2396 Records = 0;
2397 NumRecords = 0;
2398 }
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002399
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002400 virtual void getGCCRegNames(const char * const *&Names,
2401 unsigned &NumNames) const;
2402 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2403 unsigned &NumAliases) const {
2404 // No aliases.
2405 Aliases = 0;
2406 NumAliases = 0;
2407 }
2408 virtual bool validateAsmConstraint(const char *&Name,
2409 TargetInfo::ConstraintInfo &info) const {
2410 // FIXME: implement
2411 return true;
2412 }
2413 virtual const char *getClobbers() const {
2414 // FIXME: Is this really right?
2415 return "";
2416 }
2417 virtual const char *getVAListDeclaration() const {
2418 // FIXME: implement
2419 return "typedef char* __builtin_va_list;";
2420 }
2421 };
2422
2423 const char * const SystemZTargetInfo::GCCRegNames[] = {
2424 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2425 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2426 };
2427
2428 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2429 unsigned &NumNames) const {
2430 Names = GCCRegNames;
2431 NumNames = llvm::array_lengthof(GCCRegNames);
2432 }
2433}
2434
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002435namespace {
2436 class BlackfinTargetInfo : public TargetInfo {
2437 static const char * const GCCRegNames[];
2438 public:
2439 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2440 TLSSupported = false;
2441 DoubleAlign = 32;
2442 LongLongAlign = 32;
2443 LongDoubleAlign = 32;
Chris Lattner1932e122009-11-07 18:59:41 +00002444 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002445 }
2446
2447 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002448 MacroBuilder &Builder) const {
2449 DefineStd(Builder, "bfin", Opts);
2450 DefineStd(Builder, "BFIN", Opts);
2451 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002452 // FIXME: This one is really dependent on -mcpu
Benjamin Kramera9992772010-01-09 17:55:51 +00002453 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002454 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2455 }
2456
2457 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2458 unsigned &NumRecords) const {
2459 // FIXME: Implement.
2460 Records = 0;
2461 NumRecords = 0;
2462 }
2463
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002464 virtual void getGCCRegNames(const char * const *&Names,
2465 unsigned &NumNames) const;
2466
2467 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2468 unsigned &NumAliases) const {
2469 // No aliases.
2470 Aliases = 0;
2471 NumAliases = 0;
2472 }
2473
2474 virtual bool validateAsmConstraint(const char *&Name,
2475 TargetInfo::ConstraintInfo &Info) const {
2476 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2477 Info.setAllowsRegister();
2478 return true;
2479 }
2480 return false;
2481 }
2482
2483 virtual const char *getClobbers() const {
2484 return "";
2485 }
2486
2487 virtual const char *getVAListDeclaration() const {
2488 return "typedef char* __builtin_va_list;";
2489 }
2490 };
2491
2492 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2493 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2494 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2495 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2496 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2497 "a0", "a1", "cc",
2498 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2499 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2500 };
2501
2502 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2503 unsigned &NumNames) const {
2504 Names = GCCRegNames;
2505 NumNames = llvm::array_lengthof(GCCRegNames);
2506 }
2507}
2508
Eli Friedmanb63decf2009-08-19 20:47:07 +00002509namespace {
2510
Mike Stump1eb44332009-09-09 15:08:12 +00002511 // LLVM and Clang cannot be used directly to output native binaries for
2512 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00002513 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00002514 //
2515 // TCE uses the llvm bitcode as input and uses it for generating customized
2516 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00002517 // publicly available in http://tce.cs.tut.fi
2518
2519 class TCETargetInfo : public TargetInfo{
2520 public:
2521 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2522 TLSSupported = false;
2523 IntWidth = 32;
2524 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00002525 PointerWidth = 32;
2526 IntAlign = 32;
2527 LongAlign = LongLongAlign = 32;
2528 PointerAlign = 32;
2529 SizeType = UnsignedInt;
2530 IntMaxType = SignedLong;
2531 UIntMaxType = UnsignedLong;
2532 IntPtrType = SignedInt;
2533 PtrDiffType = SignedInt;
2534 FloatWidth = 32;
2535 FloatAlign = 32;
2536 DoubleWidth = 32;
2537 DoubleAlign = 32;
2538 LongDoubleWidth = 32;
2539 LongDoubleAlign = 32;
2540 FloatFormat = &llvm::APFloat::IEEEsingle;
2541 DoubleFormat = &llvm::APFloat::IEEEsingle;
2542 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00002543 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2544 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00002545 "f32:32:32-f64:32:32-v64:32:32-"
2546 "v128:32:32-a0:0:32-n32";
Eli Friedmanb63decf2009-08-19 20:47:07 +00002547 }
2548
2549 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002550 MacroBuilder &Builder) const {
2551 DefineStd(Builder, "tce", Opts);
2552 Builder.defineMacro("__TCE__");
2553 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00002554 }
2555 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2556 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00002557 virtual const char *getClobbers() const {
2558 return "";
2559 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002560 virtual const char *getVAListDeclaration() const {
2561 return "typedef void* __builtin_va_list;";
2562 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002563 virtual void getGCCRegNames(const char * const *&Names,
2564 unsigned &NumNames) const {}
2565 virtual bool validateAsmConstraint(const char *&Name,
2566 TargetInfo::ConstraintInfo &info) const {
2567 return true;
2568 }
2569 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2570 unsigned &NumAliases) const {}
2571 };
2572}
2573
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002574namespace {
2575class MipsTargetInfo : public TargetInfo {
Eric Christophered734732010-03-02 02:41:08 +00002576 std::string ABI, CPU;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002577 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2578 static const char * const GCCRegNames[];
2579public:
Eric Christophered734732010-03-02 02:41:08 +00002580 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002581 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanaka619e8872011-06-02 00:09:17 +00002582 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
2583 SizeType = UnsignedInt;
2584 PtrDiffType = SignedInt;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002585 }
Eric Christophered734732010-03-02 02:41:08 +00002586 virtual const char *getABI() const { return ABI.c_str(); }
2587 virtual bool setABI(const std::string &Name) {
2588
2589 if ((Name == "o32") || (Name == "eabi")) {
2590 ABI = Name;
2591 return true;
2592 } else
2593 return false;
2594 }
2595 virtual bool setCPU(const std::string &Name) {
2596 CPU = Name;
2597 return true;
2598 }
2599 void getDefaultFeatures(const std::string &CPU,
2600 llvm::StringMap<bool> &Features) const {
2601 Features[ABI] = true;
2602 Features[CPU] = true;
2603 }
2604 virtual void getArchDefines(const LangOptions &Opts,
2605 MacroBuilder &Builder) const {
2606 if (ABI == "o32")
2607 Builder.defineMacro("__mips_o32");
2608 else if (ABI == "eabi")
2609 Builder.defineMacro("__mips_eabi");
2610 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002611 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002612 MacroBuilder &Builder) const {
2613 DefineStd(Builder, "mips", Opts);
2614 Builder.defineMacro("_mips");
2615 DefineStd(Builder, "MIPSEB", Opts);
2616 Builder.defineMacro("_MIPSEB");
2617 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002618 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002619 }
2620 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2621 unsigned &NumRecords) const {
2622 // FIXME: Implement!
2623 }
2624 virtual const char *getVAListDeclaration() const {
2625 return "typedef void* __builtin_va_list;";
2626 }
2627 virtual void getGCCRegNames(const char * const *&Names,
2628 unsigned &NumNames) const;
2629 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2630 unsigned &NumAliases) const;
2631 virtual bool validateAsmConstraint(const char *&Name,
2632 TargetInfo::ConstraintInfo &Info) const {
2633 switch (*Name) {
2634 default:
2635 case 'r': // CPU registers.
2636 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2637 case 'y': // Equivalent to "r", backwards compatibility only.
2638 case 'f': // floating-point registers.
2639 Info.setAllowsRegister();
2640 return true;
2641 }
2642 return false;
2643 }
2644
2645 virtual const char *getClobbers() const {
2646 // FIXME: Implement!
2647 return "";
2648 }
2649};
2650
2651const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer20249a12010-10-21 03:16:25 +00002652 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002653 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2654 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2655 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2656 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2657 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2658 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2659 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2660 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2661 "$fcc5","$fcc6","$fcc7"
2662};
2663
2664void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2665 unsigned &NumNames) const {
2666 Names = GCCRegNames;
2667 NumNames = llvm::array_lengthof(GCCRegNames);
2668}
2669
2670const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2671 { { "at" }, "$1" },
2672 { { "v0" }, "$2" },
2673 { { "v1" }, "$3" },
2674 { { "a0" }, "$4" },
2675 { { "a1" }, "$5" },
2676 { { "a2" }, "$6" },
2677 { { "a3" }, "$7" },
2678 { { "t0" }, "$8" },
2679 { { "t1" }, "$9" },
2680 { { "t2" }, "$10" },
2681 { { "t3" }, "$11" },
2682 { { "t4" }, "$12" },
2683 { { "t5" }, "$13" },
2684 { { "t6" }, "$14" },
2685 { { "t7" }, "$15" },
2686 { { "s0" }, "$16" },
2687 { { "s1" }, "$17" },
2688 { { "s2" }, "$18" },
2689 { { "s3" }, "$19" },
2690 { { "s4" }, "$20" },
2691 { { "s5" }, "$21" },
2692 { { "s6" }, "$22" },
2693 { { "s7" }, "$23" },
2694 { { "t8" }, "$24" },
2695 { { "t9" }, "$25" },
2696 { { "k0" }, "$26" },
2697 { { "k1" }, "$27" },
2698 { { "gp" }, "$28" },
2699 { { "sp" }, "$29" },
2700 { { "fp" }, "$30" },
2701 { { "ra" }, "$31" }
2702};
2703
2704void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2705 unsigned &NumAliases) const {
2706 Aliases = GCCRegAliases;
2707 NumAliases = llvm::array_lengthof(GCCRegAliases);
2708}
2709} // end anonymous namespace.
2710
2711namespace {
2712class MipselTargetInfo : public MipsTargetInfo {
2713public:
2714 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2715 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanaka619e8872011-06-02 00:09:17 +00002716 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002717 }
2718
2719 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002720 MacroBuilder &Builder) const;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002721};
2722
2723void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002724 MacroBuilder &Builder) const {
2725 DefineStd(Builder, "mips", Opts);
2726 Builder.defineMacro("_mips");
2727 DefineStd(Builder, "MIPSEL", Opts);
2728 Builder.defineMacro("_MIPSEL");
2729 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002730 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002731}
2732} // end anonymous namespace.
2733
Reid Spencer5f016e22007-07-11 17:01:13 +00002734//===----------------------------------------------------------------------===//
2735// Driver code
2736//===----------------------------------------------------------------------===//
2737
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002738static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002739 llvm::Triple Triple(T);
2740 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00002741
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002742 switch (Triple.getArch()) {
2743 default:
2744 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00002745
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002746 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00002747 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002748 if (Triple.isOSDarwin())
2749 return new DarwinARMTargetInfo(T);
2750
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002751 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00002752 case llvm::Triple::Linux:
2753 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002754 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002755 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002756 default:
2757 return new ARMTargetInfo(T);
2758 }
Eli Friedman61538a72008-05-20 14:21:01 +00002759
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002760 case llvm::Triple::bfin:
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002761 return new BlackfinTargetInfo(T);
2762
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002763 case llvm::Triple::msp430:
2764 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00002765
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002766 case llvm::Triple::mips:
2767 if (os == llvm::Triple::Psp)
2768 return new PSPTargetInfo<MipsTargetInfo>(T);
2769 if (os == llvm::Triple::Linux)
2770 return new LinuxTargetInfo<MipsTargetInfo>(T);
2771 return new MipsTargetInfo(T);
2772
2773 case llvm::Triple::mipsel:
2774 if (os == llvm::Triple::Psp)
2775 return new PSPTargetInfo<MipselTargetInfo>(T);
2776 if (os == llvm::Triple::Linux)
2777 return new LinuxTargetInfo<MipselTargetInfo>(T);
2778 return new MipselTargetInfo(T);
2779
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002780 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002781 if (Triple.isOSDarwin())
Roman Divackyc81f2a22011-01-06 08:27:10 +00002782 return new DarwinPPC32TargetInfo(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002783 else if (os == llvm::Triple::FreeBSD)
2784 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002785 return new PPC32TargetInfo(T);
2786
2787 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002788 if (Triple.isOSDarwin())
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00002789 return new DarwinPPC64TargetInfo(T);
John Thompson3f6918a2009-11-19 17:18:50 +00002790 else if (os == llvm::Triple::Lv2)
2791 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002792 else if (os == llvm::Triple::FreeBSD)
2793 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002794 return new PPC64TargetInfo(T);
2795
Justin Holewinski285dc652011-04-20 19:34:15 +00002796 case llvm::Triple::ptx32:
2797 return new PTX32TargetInfo(T);
2798 case llvm::Triple::ptx64:
2799 return new PTX64TargetInfo(T);
2800
Chris Lattner9cbeb632010-03-06 21:21:27 +00002801 case llvm::Triple::mblaze:
2802 return new MBlazeTargetInfo(T);
2803
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002804 case llvm::Triple::sparc:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002805 if (os == llvm::Triple::AuroraUX)
2806 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002807 if (os == llvm::Triple::Solaris)
2808 return new SolarisSparcV8TargetInfo(T);
2809 return new SparcV8TargetInfo(T);
2810
John Thompson3f6918a2009-11-19 17:18:50 +00002811 // FIXME: Need a real SPU target.
2812 case llvm::Triple::cellspu:
2813 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2814
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002815 case llvm::Triple::systemz:
2816 return new SystemZTargetInfo(T);
2817
Eli Friedmanb63decf2009-08-19 20:47:07 +00002818 case llvm::Triple::tce:
2819 return new TCETargetInfo(T);
2820
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002821 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002822 if (Triple.isOSDarwin())
2823 return new DarwinI386TargetInfo(T);
2824
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002825 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002826 case llvm::Triple::AuroraUX:
2827 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002828 case llvm::Triple::Linux:
2829 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2830 case llvm::Triple::DragonFly:
2831 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2832 case llvm::Triple::NetBSD:
2833 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2834 case llvm::Triple::OpenBSD:
2835 return new OpenBSDI386TargetInfo(T);
2836 case llvm::Triple::FreeBSD:
2837 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00002838 case llvm::Triple::Minix:
2839 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002840 case llvm::Triple::Solaris:
2841 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2842 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002843 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002844 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002845 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002846 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00002847 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00002848 case llvm::Triple::Haiku:
2849 return new HaikuX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002850 default:
2851 return new X86_32TargetInfo(T);
2852 }
2853
2854 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002855 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
2856 return new DarwinX86_64TargetInfo(T);
2857
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002858 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002859 case llvm::Triple::AuroraUX:
2860 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002861 case llvm::Triple::Linux:
2862 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00002863 case llvm::Triple::DragonFly:
2864 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002865 case llvm::Triple::NetBSD:
2866 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2867 case llvm::Triple::OpenBSD:
2868 return new OpenBSDX86_64TargetInfo(T);
2869 case llvm::Triple::FreeBSD:
2870 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2871 case llvm::Triple::Solaris:
2872 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00002873 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002874 return new MinGWX86_64TargetInfo(T);
2875 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002876 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002877 default:
2878 return new X86_64TargetInfo(T);
2879 }
2880 }
Reid Spencer5f016e22007-07-11 17:01:13 +00002881}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002882
2883/// CreateTargetInfo - Return the target info object for the specified target
2884/// triple.
2885TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002886 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002887 llvm::Triple Triple(Opts.Triple);
2888
2889 // Construct the target
2890 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2891 if (!Target) {
2892 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2893 return 0;
2894 }
2895
Daniel Dunbareac7c532009-12-18 18:42:37 +00002896 // Set the target CPU if specified.
2897 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2898 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2899 return 0;
2900 }
2901
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002902 // Set the target ABI if specified.
2903 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2904 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2905 return 0;
2906 }
2907
Charles Davis98b7c5c2010-06-11 01:06:47 +00002908 // Set the target C++ ABI.
John McCallee79a4c2010-08-21 22:46:04 +00002909 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis98b7c5c2010-06-11 01:06:47 +00002910 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2911 return 0;
2912 }
2913
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002914 // Compute the default target features, we need the target to handle this
2915 // because features may have dependencies on one another.
2916 llvm::StringMap<bool> Features;
2917 Target->getDefaultFeatures(Opts.CPU, Features);
2918
2919 // Apply the user specified deltas.
2920 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2921 ie = Opts.Features.end(); it != ie; ++it) {
2922 const char *Name = it->c_str();
2923
2924 // Apply the feature via the target.
2925 if ((Name[0] != '-' && Name[0] != '+') ||
2926 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2927 Diags.Report(diag::err_target_invalid_feature) << Name;
2928 return 0;
2929 }
2930 }
2931
2932 // Add the features to the compile options.
2933 //
2934 // FIXME: If we are completely confident that we have the right set, we only
2935 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002936 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002937 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2938 ie = Features.end(); it != ie; ++it)
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002939 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2940 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002941
2942 return Target.take();
2943}