blob: 06bd1c031c1240ede631af11ea7cebbc8fb40b4c [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
Douglas Gregordca52262011-07-01 22:41:14 +00001668// RTEMS Target
1669template<typename Target>
1670class RTEMSTargetInfo : public OSTargetInfo<Target> {
1671protected:
1672 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
1673 MacroBuilder &Builder) const {
1674 // RTEMS defines; list based off of gcc output
1675
1676 // FIXME: Move version number handling to llvm::Triple.
1677 llvm::StringRef Release = Triple.getOSName().substr(strlen("rtems"), 1);
1678
1679 Builder.defineMacro("__rtems__");
1680 Builder.defineMacro("__ELF__");
1681 }
1682public:
1683 RTEMSTargetInfo(const std::string &triple)
1684 : OSTargetInfo<Target>(triple) {
1685 this->UserLabelPrefix = "";
1686
1687 llvm::Triple Triple(triple);
1688 switch (Triple.getArch()) {
1689 default:
1690 case llvm::Triple::x86:
1691 // this->MCountName = ".mcount";
1692 break;
1693 case llvm::Triple::mips:
1694 case llvm::Triple::mipsel:
1695 case llvm::Triple::ppc:
1696 case llvm::Triple::ppc64:
1697 // this->MCountName = "_mcount";
1698 break;
1699 case llvm::Triple::arm:
1700 // this->MCountName = "__mcount";
1701 break;
1702 }
1703
1704 }
1705};
1706
1707namespace {
1708// x86-32 RTEMS target
1709class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
1710public:
1711 RTEMSX86_32TargetInfo(const std::string& triple)
1712 : X86_32TargetInfo(triple) {
1713 SizeType = UnsignedLong;
1714 IntPtrType = SignedLong;
1715 PtrDiffType = SignedLong;
1716 this->UserLabelPrefix = "";
1717 }
1718 virtual void getTargetDefines(const LangOptions &Opts,
1719 MacroBuilder &Builder) const {
1720 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1721 Builder.defineMacro("__INTEL__");
1722 Builder.defineMacro("__rtems__");
1723 }
1724};
1725} // end anonymous namespace
1726
Chris Lattner86ed3a32010-04-11 19:29:39 +00001727namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001728// x86-64 generic target
1729class X86_64TargetInfo : public X86TargetInfo {
1730public:
Chris Lattner33328642009-03-20 15:52:06 +00001731 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00001732 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00001733 LongDoubleWidth = 128;
1734 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00001735 LargeArrayMinWidth = 128;
1736 LargeArrayAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00001737 IntMaxType = SignedLong;
1738 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001739 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001740 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00001741
Eli Friedmaned855cb2008-08-21 00:13:15 +00001742 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1743 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001744 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00001745
1746 // Use fpret only for long double.
1747 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Reid Spencer5f016e22007-07-11 17:01:13 +00001748 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001749 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001750 return "typedef struct __va_list_tag {"
1751 " unsigned gp_offset;"
1752 " unsigned fp_offset;"
1753 " void* overflow_arg_area;"
1754 " void* reg_save_area;"
John McCall2b7baf02010-05-28 18:25:28 +00001755 "} __va_list_tag;"
Eli Friedmandc043162009-07-03 00:45:06 +00001756 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +00001757 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001758
Chris Lattner21fb98e2009-09-23 06:06:36 +00001759 int getEHDataRegisterNumber(unsigned RegNo) const {
1760 if (RegNo == 0) return 0;
1761 if (RegNo == 1) return 1;
1762 return -1;
1763 }
Eli Friedman618234a2008-08-20 02:34:37 +00001764};
1765} // end anonymous namespace
1766
1767namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001768// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001769class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001770public:
1771 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001772 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001773 TLSSupported = false;
1774 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00001775 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00001776 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00001777 IntMaxType = SignedLongLong;
1778 UIntMaxType = UnsignedLongLong;
1779 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00001780 SizeType = UnsignedLongLong;
1781 PtrDiffType = SignedLongLong;
1782 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00001783 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001784 }
1785 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001786 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001787 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001788 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00001789 }
NAKAMURA Takumi79521992011-01-17 22:56:23 +00001790 virtual const char *getVAListDeclaration() const {
1791 return "typedef char* __builtin_va_list;";
1792 }
Michael J. Spencera764e832010-10-21 08:22:51 +00001793};
1794} // end anonymous namespace
1795
1796namespace {
1797// x86-64 Windows Visual Studio target
1798class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1799public:
1800 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1801 : WindowsX86_64TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00001802 LongDoubleWidth = LongDoubleAlign = 64;
1803 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00001804 }
1805 virtual void getTargetDefines(const LangOptions &Opts,
1806 MacroBuilder &Builder) const {
1807 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1808 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00001809 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001810 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001811 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001812};
1813} // end anonymous namespace
1814
1815namespace {
1816// x86-64 MinGW target
1817class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1818public:
1819 MinGWX86_64TargetInfo(const std::string& triple)
1820 : WindowsX86_64TargetInfo(triple) {
1821 }
1822 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001823 MacroBuilder &Builder) const {
1824 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00001825 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00001826 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00001827 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00001828 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00001829
1830 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1831 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1832 if (Opts.Microsoft)
1833 // Provide "as-is" __declspec.
1834 Builder.defineMacro("__declspec", "__declspec");
1835 else
1836 // Provide alias of __attribute__ like mingw32-gcc.
1837 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001838 }
1839};
1840} // end anonymous namespace
1841
1842namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001843class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1844public:
Mike Stump1eb44332009-09-09 15:08:12 +00001845 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001846 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1847 Int64Type = SignedLongLong;
1848 }
1849};
1850} // end anonymous namespace
1851
1852namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00001853class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1854public:
Mike Stump1eb44332009-09-09 15:08:12 +00001855 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00001856 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1857 IntMaxType = SignedLongLong;
1858 UIntMaxType = UnsignedLongLong;
1859 Int64Type = SignedLongLong;
1860 }
1861};
1862} // end anonymous namespace
1863
1864namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00001865class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001866 // Possible FPU choices.
1867 enum FPUMode {
1868 NoFPU,
1869 VFP2FPU,
1870 VFP3FPU,
1871 NeonFPU
1872 };
1873
1874 static bool FPUModeIsVFP(FPUMode Mode) {
1875 return Mode >= VFP2FPU && Mode <= NeonFPU;
1876 }
1877
1878 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1879 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001880
Daniel Dunbareac7c532009-12-18 18:42:37 +00001881 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001882
1883 unsigned FPU : 3;
1884
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001885 unsigned IsThumb : 1;
1886
1887 // Initialized via features.
1888 unsigned SoftFloat : 1;
1889 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001890
Chris Lattner2752c012010-03-03 19:03:45 +00001891 static const Builtin::Info BuiltinInfo[];
1892
Chris Lattner393ff042008-04-21 18:56:49 +00001893public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001894 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbareac7c532009-12-18 18:42:37 +00001895 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001896 {
Daniel Dunbara2a41612009-09-14 00:02:24 +00001897 SizeType = UnsignedInt;
1898 PtrDiffType = SignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001899
Chris Lattner9bffb072010-04-23 16:29:58 +00001900 // {} in inline assembly are neon specifiers, not assembly variant
1901 // specifiers.
1902 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00001903
Daniel Dunbareac7c532009-12-18 18:42:37 +00001904 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00001905 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001906 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00001907 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1908 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001909 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1910 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001911 "v64:64:64-v128:64:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001912 } else {
1913 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1914 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001915 "v64:64:64-v128:64:128-a0:0:64-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001916 }
John McCallee79a4c2010-08-21 22:46:04 +00001917
1918 // ARM targets default to using the ARM C++ ABI.
1919 CXXABI = CXXABI_ARM;
Eli Friedman61538a72008-05-20 14:21:01 +00001920 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001921 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00001922 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001923 ABI = Name;
1924
Daniel Dunbara2a41612009-09-14 00:02:24 +00001925 // The defaults (above) are for AAPCS, check if we need to change them.
1926 //
1927 // FIXME: We need support for -meabi... we could just mangle it into the
1928 // name.
1929 if (Name == "apcs-gnu") {
Daniel Dunbard410fa22010-01-27 20:23:08 +00001930 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbara2a41612009-09-14 00:02:24 +00001931 SizeType = UnsignedLong;
1932
Daniel Dunbar684de632010-04-22 16:14:54 +00001933 // Do not respect the alignment of bit-field types when laying out
1934 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1935 UseBitFieldTypeAlignment = false;
1936
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001937 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00001938 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1939 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001940 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
Bob Wilson949fd1a2011-06-29 16:09:20 +00001941 "i64:32:64-f32:32:32-f64:32:64-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001942 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001943 } else {
1944 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 +00001945 "i64:32:64-f32:32:32-f64:32:64-"
1946 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001947 }
1948
Daniel Dunbara2a41612009-09-14 00:02:24 +00001949 // FIXME: Override "preferred align" for double and long long.
1950 } else if (Name == "aapcs") {
1951 // FIXME: Enumerated types are variable width in straight AAPCS.
1952 } else if (Name == "aapcs-linux") {
1953 ;
1954 } else
1955 return false;
1956
1957 return true;
1958 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001959
Daniel Dunbara91320b2009-12-21 23:28:17 +00001960 void getDefaultFeatures(const std::string &CPU,
1961 llvm::StringMap<bool> &Features) const {
1962 // FIXME: This should not be here.
1963 Features["vfp2"] = false;
1964 Features["vfp3"] = false;
1965 Features["neon"] = false;
1966
1967 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1968 Features["vfp2"] = true;
1969 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1970 Features["neon"] = true;
1971 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00001972
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001973 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1974 const std::string &Name,
1975 bool Enabled) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001976 if (Name == "soft-float" || Name == "soft-float-abi") {
1977 Features[Name] = Enabled;
1978 } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1979 // These effectively are a single option, reset them when any is enabled.
1980 if (Enabled)
1981 Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1982 Features[Name] = Enabled;
1983 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001984 return false;
1985
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001986 return true;
1987 }
1988
1989 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001990 FPU = NoFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001991 SoftFloat = SoftFloatABI = false;
1992 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1993 if (Features[i] == "+soft-float")
1994 SoftFloat = true;
1995 else if (Features[i] == "+soft-float-abi")
1996 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001997 else if (Features[i] == "+vfp2")
1998 FPU = VFP2FPU;
1999 else if (Features[i] == "+vfp3")
2000 FPU = VFP3FPU;
2001 else if (Features[i] == "+neon")
2002 FPU = NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002003 }
2004
2005 // Remove front-end specific options which the backend handles differently.
2006 std::vector<std::string>::iterator it;
2007 it = std::find(Features.begin(), Features.end(), "+soft-float");
2008 if (it != Features.end())
2009 Features.erase(it);
2010 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2011 if (it != Features.end())
2012 Features.erase(it);
2013 }
2014
Daniel Dunbareac7c532009-12-18 18:42:37 +00002015 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
2016 return llvm::StringSwitch<const char*>(Name)
2017 .Cases("arm8", "arm810", "4")
2018 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2019 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2020 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2021 .Case("ep9312", "4T")
2022 .Cases("arm10tdmi", "arm1020t", "5T")
2023 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2024 .Case("arm926ej-s", "5TEJ")
2025 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2026 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002027 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002028 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002029 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002030 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2031 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson06f45632011-01-06 16:57:20 +00002032 .Case("cortex-m3", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00002033 .Case("cortex-m0", "6M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002034 .Default(0);
2035 }
2036 virtual bool setCPU(const std::string &Name) {
2037 if (!getCPUDefineSuffix(Name))
2038 return false;
2039
2040 CPU = Name;
2041 return true;
2042 }
Chris Lattner33328642009-03-20 15:52:06 +00002043 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002044 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00002045 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00002046 Builder.defineMacro("__arm");
2047 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002048
Chris Lattnerc0f59212009-03-02 22:27:17 +00002049 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00002050 Builder.defineMacro("__ARMEL__");
2051 Builder.defineMacro("__LITTLE_ENDIAN__");
2052 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002053
2054 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00002055 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002056
Mike Stump437bb4b2009-04-08 02:07:04 +00002057 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002058
Daniel Dunbareac7c532009-12-18 18:42:37 +00002059 // FIXME: It's more complicated than this and we don't really support
2060 // interworking.
2061 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00002062 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002063
Daniel Dunbareac7c532009-12-18 18:42:37 +00002064 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramera9992772010-01-09 17:55:51 +00002065 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002066
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002067 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00002068 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002069
2070 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00002071 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002072
Bob Wilson84f95cf2011-05-13 18:56:03 +00002073 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002074 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00002075 Builder.defineMacro("__THUMBEL__");
2076 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00002077 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002078 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002079 }
2080
2081 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00002082 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002083
2084 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramera9992772010-01-09 17:55:51 +00002085 Builder.defineMacro("__VFP_FP__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002086
2087 // This only gets set when Neon instructions are actually available, unlike
2088 // the VFP define, hence the soft float and arch check. This is subtly
2089 // different from gcc, we follow the intent which was that it should be set
2090 // when Neon instructions are actually available.
Bob Wilson84f95cf2011-05-13 18:56:03 +00002091 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002092 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00002093 }
2094 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2095 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00002096 Records = BuiltinInfo;
2097 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00002098 }
2099 virtual const char *getVAListDeclaration() const {
John McCall0e9972c2011-05-09 02:19:37 +00002100 return "typedef void* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +00002101 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002102 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002103 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002104 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002105 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002106 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002107 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002108 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002109 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00002110 default:
Nate Begemanad487f42008-04-22 05:03:19 +00002111 case 'l': // r0-r7
2112 case 'h': // r8-r15
2113 case 'w': // VFP Floating point register single precision
2114 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00002115 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00002116 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00002117 case 'U': // a memory reference...
2118 switch (Name[1]) {
2119 case 'q': // ...ARMV4 ldrsb
2120 case 'v': // ...VFP load/store (reg+constant offset)
2121 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00002122 case 't': // address valid for load/store opaque types wider
2123 // than 128-bits
2124 case 'n': // valid address for Neon doubleword vector load/store
2125 case 'm': // valid address for Neon element and structure load/store
2126 case 's': // valid address for non-offset loads/stores of quad-word
2127 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00002128 Info.setAllowsMemory();
2129 Name++;
2130 return true;
2131 }
Nate Begemanad487f42008-04-22 05:03:19 +00002132 }
Chris Lattner393ff042008-04-21 18:56:49 +00002133 return false;
2134 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00002135 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00002136 std::string R;
2137 switch (*Constraint) {
2138 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00002139 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00002140 Constraint++;
2141 break;
Eric Christopher283f4472011-06-17 00:40:18 +00002142 case 'p': // 'p' should be translated to 'r' by default.
2143 R = std::string("r");
2144 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00002145 default:
2146 return std::string(1, *Constraint);
2147 }
2148 return R;
2149 }
Chris Lattner393ff042008-04-21 18:56:49 +00002150 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002151 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00002152 return "";
2153 }
2154};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002155
2156const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002157 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002158 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002159 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2160
2161 // Float registers
2162 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2163 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2164 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002165 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002166
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002167 // Double registers
2168 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2169 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00002170 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2171 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002172
2173 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00002174 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2175 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002176};
2177
2178void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002179 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002180 Names = GCCRegNames;
2181 NumNames = llvm::array_lengthof(GCCRegNames);
2182}
2183
2184const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002185 { { "a1" }, "r0" },
2186 { { "a2" }, "r1" },
2187 { { "a3" }, "r2" },
2188 { { "a4" }, "r3" },
2189 { { "v1" }, "r4" },
2190 { { "v2" }, "r5" },
2191 { { "v3" }, "r6" },
2192 { { "v4" }, "r7" },
2193 { { "v5" }, "r8" },
2194 { { "v6", "rfp" }, "r9" },
2195 { { "sl" }, "r10" },
2196 { { "fp" }, "r11" },
2197 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002198 { { "r13" }, "sp" },
2199 { { "r14" }, "lr" },
2200 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002201 // The S, D and Q registers overlap, but aren't really aliases; we
2202 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002203};
2204
2205void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2206 unsigned &NumAliases) const {
2207 Aliases = GCCRegAliases;
2208 NumAliases = llvm::array_lengthof(GCCRegAliases);
2209}
Chris Lattner2752c012010-03-03 19:03:45 +00002210
2211const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +00002212#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
2213#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
2214 ALL_LANGUAGES, false },
Chris Lattner2752c012010-03-03 19:03:45 +00002215#include "clang/Basic/BuiltinsARM.def"
2216};
Chris Lattner393ff042008-04-21 18:56:49 +00002217} // end anonymous namespace.
2218
Eli Friedmana9f54962008-08-20 07:44:10 +00002219
2220namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00002221class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002222 public DarwinTargetInfo<ARMTargetInfo> {
2223protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00002224 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00002225 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00002226 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00002227 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002228
Torok Edwin5f6c1942009-06-30 17:10:35 +00002229public:
Mike Stump1eb44332009-09-09 15:08:12 +00002230 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002231 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2232 HasAlignMac68kSupport = true;
2233 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002234};
2235} // end anonymous namespace.
2236
Reid Spencer5f016e22007-07-11 17:01:13 +00002237namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00002238class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00002239 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2240 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002241 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00002242public:
Eli Friedman01b86682008-08-20 07:28:14 +00002243 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2244 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00002245 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 +00002246 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00002247 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002248 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2249 const std::string &Name,
2250 bool Enabled) const {
2251 if (Name == "soft-float")
2252 Features[Name] = Enabled;
2253 else
2254 return false;
2255
2256 return true;
2257 }
2258 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2259 SoftFloat = false;
2260 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2261 if (Features[i] == "+soft-float")
2262 SoftFloat = true;
2263 }
Chris Lattner33328642009-03-20 15:52:06 +00002264 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002265 MacroBuilder &Builder) const {
2266 DefineStd(Builder, "sparc", Opts);
2267 Builder.defineMacro("__sparcv8");
2268 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002269
2270 if (SoftFloat)
2271 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00002272 }
2273 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2274 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002275 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00002276 }
2277 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002278 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00002279 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002280 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002281 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002282 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002283 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002284 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00002285 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002286 // FIXME: Implement!
2287 return false;
Gabor Greif26658672008-02-21 16:29:08 +00002288 }
2289 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002290 // FIXME: Implement!
2291 return "";
Gabor Greif26658672008-02-21 16:29:08 +00002292 }
2293};
2294
Chris Lattnere957f532009-01-27 01:58:38 +00002295const char * const SparcV8TargetInfo::GCCRegNames[] = {
2296 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2297 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2298 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2299 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2300};
2301
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002302void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002303 unsigned &NumNames) const {
2304 Names = GCCRegNames;
2305 NumNames = llvm::array_lengthof(GCCRegNames);
2306}
2307
2308const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002309 { { "g0" }, "r0" },
2310 { { "g1" }, "r1" },
2311 { { "g2" }, "r2" },
2312 { { "g3" }, "r3" },
2313 { { "g4" }, "r4" },
2314 { { "g5" }, "r5" },
2315 { { "g6" }, "r6" },
2316 { { "g7" }, "r7" },
2317 { { "o0" }, "r8" },
2318 { { "o1" }, "r9" },
2319 { { "o2" }, "r10" },
2320 { { "o3" }, "r11" },
2321 { { "o4" }, "r12" },
2322 { { "o5" }, "r13" },
2323 { { "o6", "sp" }, "r14" },
2324 { { "o7" }, "r15" },
2325 { { "l0" }, "r16" },
2326 { { "l1" }, "r17" },
2327 { { "l2" }, "r18" },
2328 { { "l3" }, "r19" },
2329 { { "l4" }, "r20" },
2330 { { "l5" }, "r21" },
2331 { { "l6" }, "r22" },
2332 { { "l7" }, "r23" },
2333 { { "i0" }, "r24" },
2334 { { "i1" }, "r25" },
2335 { { "i2" }, "r26" },
2336 { { "i3" }, "r27" },
2337 { { "i4" }, "r28" },
2338 { { "i5" }, "r29" },
2339 { { "i6", "fp" }, "r30" },
2340 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00002341};
2342
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002343void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002344 unsigned &NumAliases) const {
2345 Aliases = GCCRegAliases;
2346 NumAliases = llvm::array_lengthof(GCCRegAliases);
2347}
Gabor Greif26658672008-02-21 16:29:08 +00002348} // end anonymous namespace.
2349
Eli Friedman01b86682008-08-20 07:28:14 +00002350namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002351class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2352public:
2353 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2354 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2355 SizeType = UnsignedInt;
2356 PtrDiffType = SignedInt;
2357 }
2358};
Torok Edwin5f6c1942009-06-30 17:10:35 +00002359class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00002360public:
2361 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002362 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00002363 SizeType = UnsignedInt;
2364 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00002365 }
2366};
2367} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00002368
Chris Lattner2621fd12008-05-08 05:58:21 +00002369namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002370 class MSP430TargetInfo : public TargetInfo {
2371 static const char * const GCCRegNames[];
2372 public:
2373 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2374 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00002375 IntWidth = 16; IntAlign = 16;
2376 LongWidth = 32; LongLongWidth = 64;
2377 LongAlign = LongLongAlign = 16;
2378 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002379 SizeType = UnsignedInt;
2380 IntMaxType = SignedLong;
2381 UIntMaxType = UnsignedLong;
2382 IntPtrType = SignedShort;
2383 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00002384 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00002385 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002386 }
2387 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002388 MacroBuilder &Builder) const {
2389 Builder.defineMacro("MSP430");
2390 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002391 // FIXME: defines for different 'flavours' of MCU
2392 }
2393 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2394 unsigned &NumRecords) const {
2395 // FIXME: Implement.
2396 Records = 0;
2397 NumRecords = 0;
2398 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002399 virtual void getGCCRegNames(const char * const *&Names,
2400 unsigned &NumNames) const;
2401 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2402 unsigned &NumAliases) const {
2403 // No aliases.
2404 Aliases = 0;
2405 NumAliases = 0;
2406 }
2407 virtual bool validateAsmConstraint(const char *&Name,
2408 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00002409 // No target constraints for now.
2410 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002411 }
2412 virtual const char *getClobbers() const {
2413 // FIXME: Is this really right?
2414 return "";
2415 }
2416 virtual const char *getVAListDeclaration() const {
2417 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00002418 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002419 }
2420 };
2421
2422 const char * const MSP430TargetInfo::GCCRegNames[] = {
2423 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2424 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2425 };
2426
2427 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2428 unsigned &NumNames) const {
2429 Names = GCCRegNames;
2430 NumNames = llvm::array_lengthof(GCCRegNames);
2431 }
2432}
2433
2434
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002435namespace {
2436 class SystemZTargetInfo : public TargetInfo {
2437 static const char * const GCCRegNames[];
2438 public:
2439 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2440 TLSSupported = false;
2441 IntWidth = IntAlign = 32;
2442 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2443 PointerWidth = PointerAlign = 64;
Chris Lattner1932e122009-11-07 18:59:41 +00002444 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2445 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002446 }
2447 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002448 MacroBuilder &Builder) const {
2449 Builder.defineMacro("__s390__");
2450 Builder.defineMacro("__s390x__");
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002451 }
2452 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2453 unsigned &NumRecords) const {
2454 // FIXME: Implement.
2455 Records = 0;
2456 NumRecords = 0;
2457 }
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002458
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002459 virtual void getGCCRegNames(const char * const *&Names,
2460 unsigned &NumNames) const;
2461 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2462 unsigned &NumAliases) const {
2463 // No aliases.
2464 Aliases = 0;
2465 NumAliases = 0;
2466 }
2467 virtual bool validateAsmConstraint(const char *&Name,
2468 TargetInfo::ConstraintInfo &info) const {
2469 // FIXME: implement
2470 return true;
2471 }
2472 virtual const char *getClobbers() const {
2473 // FIXME: Is this really right?
2474 return "";
2475 }
2476 virtual const char *getVAListDeclaration() const {
2477 // FIXME: implement
2478 return "typedef char* __builtin_va_list;";
2479 }
2480 };
2481
2482 const char * const SystemZTargetInfo::GCCRegNames[] = {
2483 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2484 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2485 };
2486
2487 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2488 unsigned &NumNames) const {
2489 Names = GCCRegNames;
2490 NumNames = llvm::array_lengthof(GCCRegNames);
2491 }
2492}
2493
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002494namespace {
2495 class BlackfinTargetInfo : public TargetInfo {
2496 static const char * const GCCRegNames[];
2497 public:
2498 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2499 TLSSupported = false;
2500 DoubleAlign = 32;
2501 LongLongAlign = 32;
2502 LongDoubleAlign = 32;
Chris Lattner1932e122009-11-07 18:59:41 +00002503 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002504 }
2505
2506 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002507 MacroBuilder &Builder) const {
2508 DefineStd(Builder, "bfin", Opts);
2509 DefineStd(Builder, "BFIN", Opts);
2510 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002511 // FIXME: This one is really dependent on -mcpu
Benjamin Kramera9992772010-01-09 17:55:51 +00002512 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002513 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2514 }
2515
2516 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2517 unsigned &NumRecords) const {
2518 // FIXME: Implement.
2519 Records = 0;
2520 NumRecords = 0;
2521 }
2522
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002523 virtual void getGCCRegNames(const char * const *&Names,
2524 unsigned &NumNames) const;
2525
2526 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2527 unsigned &NumAliases) const {
2528 // No aliases.
2529 Aliases = 0;
2530 NumAliases = 0;
2531 }
2532
2533 virtual bool validateAsmConstraint(const char *&Name,
2534 TargetInfo::ConstraintInfo &Info) const {
2535 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2536 Info.setAllowsRegister();
2537 return true;
2538 }
2539 return false;
2540 }
2541
2542 virtual const char *getClobbers() const {
2543 return "";
2544 }
2545
2546 virtual const char *getVAListDeclaration() const {
2547 return "typedef char* __builtin_va_list;";
2548 }
2549 };
2550
2551 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2552 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2553 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2554 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2555 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2556 "a0", "a1", "cc",
2557 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2558 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2559 };
2560
2561 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2562 unsigned &NumNames) const {
2563 Names = GCCRegNames;
2564 NumNames = llvm::array_lengthof(GCCRegNames);
2565 }
2566}
2567
Eli Friedmanb63decf2009-08-19 20:47:07 +00002568namespace {
2569
Mike Stump1eb44332009-09-09 15:08:12 +00002570 // LLVM and Clang cannot be used directly to output native binaries for
2571 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00002572 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00002573 //
2574 // TCE uses the llvm bitcode as input and uses it for generating customized
2575 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00002576 // publicly available in http://tce.cs.tut.fi
2577
2578 class TCETargetInfo : public TargetInfo{
2579 public:
2580 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2581 TLSSupported = false;
2582 IntWidth = 32;
2583 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00002584 PointerWidth = 32;
2585 IntAlign = 32;
2586 LongAlign = LongLongAlign = 32;
2587 PointerAlign = 32;
2588 SizeType = UnsignedInt;
2589 IntMaxType = SignedLong;
2590 UIntMaxType = UnsignedLong;
2591 IntPtrType = SignedInt;
2592 PtrDiffType = SignedInt;
2593 FloatWidth = 32;
2594 FloatAlign = 32;
2595 DoubleWidth = 32;
2596 DoubleAlign = 32;
2597 LongDoubleWidth = 32;
2598 LongDoubleAlign = 32;
2599 FloatFormat = &llvm::APFloat::IEEEsingle;
2600 DoubleFormat = &llvm::APFloat::IEEEsingle;
2601 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00002602 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2603 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00002604 "f32:32:32-f64:32:32-v64:32:32-"
2605 "v128:32:32-a0:0:32-n32";
Eli Friedmanb63decf2009-08-19 20:47:07 +00002606 }
2607
2608 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002609 MacroBuilder &Builder) const {
2610 DefineStd(Builder, "tce", Opts);
2611 Builder.defineMacro("__TCE__");
2612 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00002613 }
2614 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2615 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00002616 virtual const char *getClobbers() const {
2617 return "";
2618 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002619 virtual const char *getVAListDeclaration() const {
2620 return "typedef void* __builtin_va_list;";
2621 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002622 virtual void getGCCRegNames(const char * const *&Names,
2623 unsigned &NumNames) const {}
2624 virtual bool validateAsmConstraint(const char *&Name,
2625 TargetInfo::ConstraintInfo &info) const {
2626 return true;
2627 }
2628 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2629 unsigned &NumAliases) const {}
2630 };
2631}
2632
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002633namespace {
2634class MipsTargetInfo : public TargetInfo {
Eric Christophered734732010-03-02 02:41:08 +00002635 std::string ABI, CPU;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002636 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2637 static const char * const GCCRegNames[];
2638public:
Eric Christophered734732010-03-02 02:41:08 +00002639 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002640 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 +00002641 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
2642 SizeType = UnsignedInt;
2643 PtrDiffType = SignedInt;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002644 }
Eric Christophered734732010-03-02 02:41:08 +00002645 virtual const char *getABI() const { return ABI.c_str(); }
2646 virtual bool setABI(const std::string &Name) {
2647
2648 if ((Name == "o32") || (Name == "eabi")) {
2649 ABI = Name;
2650 return true;
2651 } else
2652 return false;
2653 }
2654 virtual bool setCPU(const std::string &Name) {
2655 CPU = Name;
2656 return true;
2657 }
2658 void getDefaultFeatures(const std::string &CPU,
2659 llvm::StringMap<bool> &Features) const {
2660 Features[ABI] = true;
2661 Features[CPU] = true;
2662 }
2663 virtual void getArchDefines(const LangOptions &Opts,
2664 MacroBuilder &Builder) const {
2665 if (ABI == "o32")
2666 Builder.defineMacro("__mips_o32");
2667 else if (ABI == "eabi")
2668 Builder.defineMacro("__mips_eabi");
2669 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002670 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002671 MacroBuilder &Builder) const {
2672 DefineStd(Builder, "mips", Opts);
2673 Builder.defineMacro("_mips");
2674 DefineStd(Builder, "MIPSEB", Opts);
2675 Builder.defineMacro("_MIPSEB");
2676 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002677 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002678 }
2679 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2680 unsigned &NumRecords) const {
2681 // FIXME: Implement!
2682 }
2683 virtual const char *getVAListDeclaration() const {
2684 return "typedef void* __builtin_va_list;";
2685 }
2686 virtual void getGCCRegNames(const char * const *&Names,
2687 unsigned &NumNames) const;
2688 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2689 unsigned &NumAliases) const;
2690 virtual bool validateAsmConstraint(const char *&Name,
2691 TargetInfo::ConstraintInfo &Info) const {
2692 switch (*Name) {
2693 default:
2694 case 'r': // CPU registers.
2695 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2696 case 'y': // Equivalent to "r", backwards compatibility only.
2697 case 'f': // floating-point registers.
2698 Info.setAllowsRegister();
2699 return true;
2700 }
2701 return false;
2702 }
2703
2704 virtual const char *getClobbers() const {
2705 // FIXME: Implement!
2706 return "";
2707 }
2708};
2709
2710const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer20249a12010-10-21 03:16:25 +00002711 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002712 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2713 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2714 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2715 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2716 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2717 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2718 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2719 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2720 "$fcc5","$fcc6","$fcc7"
2721};
2722
2723void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2724 unsigned &NumNames) const {
2725 Names = GCCRegNames;
2726 NumNames = llvm::array_lengthof(GCCRegNames);
2727}
2728
2729const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2730 { { "at" }, "$1" },
2731 { { "v0" }, "$2" },
2732 { { "v1" }, "$3" },
2733 { { "a0" }, "$4" },
2734 { { "a1" }, "$5" },
2735 { { "a2" }, "$6" },
2736 { { "a3" }, "$7" },
2737 { { "t0" }, "$8" },
2738 { { "t1" }, "$9" },
2739 { { "t2" }, "$10" },
2740 { { "t3" }, "$11" },
2741 { { "t4" }, "$12" },
2742 { { "t5" }, "$13" },
2743 { { "t6" }, "$14" },
2744 { { "t7" }, "$15" },
2745 { { "s0" }, "$16" },
2746 { { "s1" }, "$17" },
2747 { { "s2" }, "$18" },
2748 { { "s3" }, "$19" },
2749 { { "s4" }, "$20" },
2750 { { "s5" }, "$21" },
2751 { { "s6" }, "$22" },
2752 { { "s7" }, "$23" },
2753 { { "t8" }, "$24" },
2754 { { "t9" }, "$25" },
2755 { { "k0" }, "$26" },
2756 { { "k1" }, "$27" },
2757 { { "gp" }, "$28" },
2758 { { "sp" }, "$29" },
2759 { { "fp" }, "$30" },
2760 { { "ra" }, "$31" }
2761};
2762
2763void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2764 unsigned &NumAliases) const {
2765 Aliases = GCCRegAliases;
2766 NumAliases = llvm::array_lengthof(GCCRegAliases);
2767}
2768} // end anonymous namespace.
2769
2770namespace {
2771class MipselTargetInfo : public MipsTargetInfo {
2772public:
2773 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2774 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 +00002775 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002776 }
2777
2778 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002779 MacroBuilder &Builder) const;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002780};
2781
2782void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002783 MacroBuilder &Builder) const {
2784 DefineStd(Builder, "mips", Opts);
2785 Builder.defineMacro("_mips");
2786 DefineStd(Builder, "MIPSEL", Opts);
2787 Builder.defineMacro("_MIPSEL");
2788 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002789 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002790}
2791} // end anonymous namespace.
2792
Reid Spencer5f016e22007-07-11 17:01:13 +00002793//===----------------------------------------------------------------------===//
2794// Driver code
2795//===----------------------------------------------------------------------===//
2796
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002797static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002798 llvm::Triple Triple(T);
2799 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00002800
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002801 switch (Triple.getArch()) {
2802 default:
2803 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00002804
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002805 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00002806 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002807 if (Triple.isOSDarwin())
2808 return new DarwinARMTargetInfo(T);
2809
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002810 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00002811 case llvm::Triple::Linux:
2812 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002813 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002814 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Douglas Gregordca52262011-07-01 22:41:14 +00002815 case llvm::Triple::RTEMS:
2816 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002817 default:
2818 return new ARMTargetInfo(T);
2819 }
Eli Friedman61538a72008-05-20 14:21:01 +00002820
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002821 case llvm::Triple::bfin:
Douglas Gregordca52262011-07-01 22:41:14 +00002822 if ( os == llvm::Triple::RTEMS )
2823 return new RTEMSTargetInfo<BlackfinTargetInfo>(T);
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002824 return new BlackfinTargetInfo(T);
2825
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002826 case llvm::Triple::msp430:
2827 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00002828
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002829 case llvm::Triple::mips:
2830 if (os == llvm::Triple::Psp)
2831 return new PSPTargetInfo<MipsTargetInfo>(T);
2832 if (os == llvm::Triple::Linux)
2833 return new LinuxTargetInfo<MipsTargetInfo>(T);
Douglas Gregordca52262011-07-01 22:41:14 +00002834 if (os == llvm::Triple::RTEMS)
2835 return new RTEMSTargetInfo<MipsTargetInfo>(T);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002836 return new MipsTargetInfo(T);
2837
2838 case llvm::Triple::mipsel:
2839 if (os == llvm::Triple::Psp)
2840 return new PSPTargetInfo<MipselTargetInfo>(T);
2841 if (os == llvm::Triple::Linux)
2842 return new LinuxTargetInfo<MipselTargetInfo>(T);
Douglas Gregordca52262011-07-01 22:41:14 +00002843 if (os == llvm::Triple::RTEMS)
2844 return new RTEMSTargetInfo<MipselTargetInfo>(T);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002845 return new MipselTargetInfo(T);
2846
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002847 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002848 if (Triple.isOSDarwin())
Roman Divackyc81f2a22011-01-06 08:27:10 +00002849 return new DarwinPPC32TargetInfo(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002850 else if (os == llvm::Triple::FreeBSD)
2851 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Douglas Gregordca52262011-07-01 22:41:14 +00002852 if ( os == llvm::Triple::RTEMS )
2853 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002854 return new PPC32TargetInfo(T);
2855
2856 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002857 if (Triple.isOSDarwin())
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00002858 return new DarwinPPC64TargetInfo(T);
John Thompson3f6918a2009-11-19 17:18:50 +00002859 else if (os == llvm::Triple::Lv2)
2860 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002861 else if (os == llvm::Triple::FreeBSD)
2862 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002863 return new PPC64TargetInfo(T);
2864
Justin Holewinski285dc652011-04-20 19:34:15 +00002865 case llvm::Triple::ptx32:
2866 return new PTX32TargetInfo(T);
2867 case llvm::Triple::ptx64:
2868 return new PTX64TargetInfo(T);
2869
Chris Lattner9cbeb632010-03-06 21:21:27 +00002870 case llvm::Triple::mblaze:
2871 return new MBlazeTargetInfo(T);
2872
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002873 case llvm::Triple::sparc:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002874 if (os == llvm::Triple::AuroraUX)
2875 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002876 if (os == llvm::Triple::Solaris)
2877 return new SolarisSparcV8TargetInfo(T);
Douglas Gregordca52262011-07-01 22:41:14 +00002878 if ( os == llvm::Triple::RTEMS )
2879 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002880 return new SparcV8TargetInfo(T);
2881
John Thompson3f6918a2009-11-19 17:18:50 +00002882 // FIXME: Need a real SPU target.
2883 case llvm::Triple::cellspu:
2884 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2885
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002886 case llvm::Triple::systemz:
2887 return new SystemZTargetInfo(T);
2888
Eli Friedmanb63decf2009-08-19 20:47:07 +00002889 case llvm::Triple::tce:
2890 return new TCETargetInfo(T);
2891
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002892 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002893 if (Triple.isOSDarwin())
2894 return new DarwinI386TargetInfo(T);
2895
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002896 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002897 case llvm::Triple::AuroraUX:
2898 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002899 case llvm::Triple::Linux:
2900 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2901 case llvm::Triple::DragonFly:
2902 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2903 case llvm::Triple::NetBSD:
2904 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2905 case llvm::Triple::OpenBSD:
2906 return new OpenBSDI386TargetInfo(T);
2907 case llvm::Triple::FreeBSD:
2908 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00002909 case llvm::Triple::Minix:
2910 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002911 case llvm::Triple::Solaris:
2912 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2913 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002914 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002915 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002916 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002917 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00002918 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00002919 case llvm::Triple::Haiku:
2920 return new HaikuX86_32TargetInfo(T);
Douglas Gregordca52262011-07-01 22:41:14 +00002921 case llvm::Triple::RTEMS:
2922 return new RTEMSX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002923 default:
2924 return new X86_32TargetInfo(T);
2925 }
2926
2927 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002928 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
2929 return new DarwinX86_64TargetInfo(T);
2930
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002931 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002932 case llvm::Triple::AuroraUX:
2933 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002934 case llvm::Triple::Linux:
2935 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00002936 case llvm::Triple::DragonFly:
2937 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002938 case llvm::Triple::NetBSD:
2939 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2940 case llvm::Triple::OpenBSD:
2941 return new OpenBSDX86_64TargetInfo(T);
2942 case llvm::Triple::FreeBSD:
2943 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2944 case llvm::Triple::Solaris:
2945 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00002946 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002947 return new MinGWX86_64TargetInfo(T);
2948 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002949 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002950 default:
2951 return new X86_64TargetInfo(T);
2952 }
2953 }
Reid Spencer5f016e22007-07-11 17:01:13 +00002954}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002955
2956/// CreateTargetInfo - Return the target info object for the specified target
2957/// triple.
2958TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002959 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002960 llvm::Triple Triple(Opts.Triple);
2961
2962 // Construct the target
2963 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2964 if (!Target) {
2965 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2966 return 0;
2967 }
2968
Daniel Dunbareac7c532009-12-18 18:42:37 +00002969 // Set the target CPU if specified.
2970 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2971 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2972 return 0;
2973 }
2974
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002975 // Set the target ABI if specified.
2976 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2977 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2978 return 0;
2979 }
2980
Charles Davis98b7c5c2010-06-11 01:06:47 +00002981 // Set the target C++ ABI.
John McCallee79a4c2010-08-21 22:46:04 +00002982 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis98b7c5c2010-06-11 01:06:47 +00002983 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2984 return 0;
2985 }
2986
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002987 // Compute the default target features, we need the target to handle this
2988 // because features may have dependencies on one another.
2989 llvm::StringMap<bool> Features;
2990 Target->getDefaultFeatures(Opts.CPU, Features);
2991
2992 // Apply the user specified deltas.
2993 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2994 ie = Opts.Features.end(); it != ie; ++it) {
2995 const char *Name = it->c_str();
2996
2997 // Apply the feature via the target.
2998 if ((Name[0] != '-' && Name[0] != '+') ||
2999 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
3000 Diags.Report(diag::err_target_invalid_feature) << Name;
3001 return 0;
3002 }
3003 }
3004
3005 // Add the features to the compile options.
3006 //
3007 // FIXME: If we are completely confident that we have the right set, we only
3008 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00003009 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003010 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
3011 ie = Features.end(); it != ie; ++it)
Daniel Dunbarb93292a2009-12-19 03:30:57 +00003012 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
3013 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003014
3015 return Target.take();
3016}