blob: b98baaa938167cf4698d5f6c230ff18b032cc18d [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", "");
Eric Christopher7c9adf92011-07-07 22:55:26 +000096
John McCallf85e1932011-06-15 23:02:42 +000097 // __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", "");
Eric Christopher7c9adf92011-07-07 22:55:26 +0000101
John McCallf85e1932011-06-15 23:02:42 +0000102 // 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 }
Eric Christopher7c9adf92011-07-07 22:55:26 +0000109
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 {
Eric Christopher7c9adf92011-07-07 22:55:26 +0000185 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000186 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 Christopheraa7333c2011-07-02 00:20:22 +0000192 llvm::Triple T = llvm::Triple(triple);
193 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
Daniel Dunbare177d3b2011-02-21 23:12:51 +0000194 this->MCountName = "\01mcount";
Torok Edwin5f6c1942009-06-30 17:10:35 +0000195 }
196
Anders Carlssonf959fb52010-01-30 18:33:31 +0000197 virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
Chris Lattner797c3c42009-08-10 19:03:04 +0000198 // Let MCSectionMachO validate this.
199 llvm::StringRef Segment, Section;
200 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000201 bool HasTAA;
Chris Lattner797c3c42009-08-10 19:03:04 +0000202 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000203 TAA, HasTAA, StubSize);
Chris Lattner797c3c42009-08-10 19:03:04 +0000204 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000205
Anders Carlsson18af3682010-06-08 22:47:50 +0000206 virtual const char *getStaticInitSectionSpecifier() const {
207 // FIXME: We should return 0 when building kexts.
208 return "__TEXT,__StaticInit,regular,pure_instructions";
209 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000210
Torok Edwin5f6c1942009-06-30 17:10:35 +0000211};
212
Chris Lattner797c3c42009-08-10 19:03:04 +0000213
Torok Edwin5f6c1942009-06-30 17:10:35 +0000214// DragonFlyBSD Target
215template<typename Target>
216class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
217protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000218 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000219 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000220 // DragonFly defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000221 Builder.defineMacro("__DragonFly__");
222 Builder.defineMacro("__DragonFly_cc_version", "100001");
223 Builder.defineMacro("__ELF__");
224 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
225 Builder.defineMacro("__tune_i386__");
226 DefineStd(Builder, "unix", Opts);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000227 }
228public:
Mike Stump1eb44332009-09-09 15:08:12 +0000229 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000230 : OSTargetInfo<Target>(triple) {}
231};
232
233// FreeBSD Target
234template<typename Target>
235class FreeBSDTargetInfo : public OSTargetInfo<Target> {
236protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000237 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000238 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000239 // FreeBSD defines; list based off of gcc output
240
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000241 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramer3bb65302010-01-30 19:55:01 +0000242 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000243
Benjamin Kramer3bb65302010-01-30 19:55:01 +0000244 Builder.defineMacro("__FreeBSD__", Release);
245 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramera9992772010-01-09 17:55:51 +0000246 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
247 DefineStd(Builder, "unix", Opts);
248 Builder.defineMacro("__ELF__");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000249 }
250public:
Mike Stump1eb44332009-09-09 15:08:12 +0000251 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands1e90faf2009-07-08 13:55:08 +0000252 : OSTargetInfo<Target>(triple) {
253 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000254
255 llvm::Triple Triple(triple);
256 switch (Triple.getArch()) {
257 default:
258 case llvm::Triple::x86:
259 case llvm::Triple::x86_64:
260 this->MCountName = ".mcount";
261 break;
262 case llvm::Triple::mips:
263 case llvm::Triple::mipsel:
264 case llvm::Triple::ppc:
265 case llvm::Triple::ppc64:
266 this->MCountName = "_mcount";
267 break;
268 case llvm::Triple::arm:
269 this->MCountName = "__mcount";
270 break;
271 }
272
Duncan Sands1e90faf2009-07-08 13:55:08 +0000273 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000274};
275
Chris Lattner38e317d2010-07-07 16:01:42 +0000276// Minix Target
277template<typename Target>
278class MinixTargetInfo : public OSTargetInfo<Target> {
279protected:
280 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
281 MacroBuilder &Builder) const {
282 // Minix defines
283
284 Builder.defineMacro("__minix", "3");
285 Builder.defineMacro("_EM_WSIZE", "4");
286 Builder.defineMacro("_EM_PSIZE", "4");
287 Builder.defineMacro("_EM_SSIZE", "2");
288 Builder.defineMacro("_EM_LSIZE", "4");
289 Builder.defineMacro("_EM_FSIZE", "4");
290 Builder.defineMacro("_EM_DSIZE", "8");
291 DefineStd(Builder, "unix", Opts);
292 }
293public:
294 MinixTargetInfo(const std::string &triple)
295 : OSTargetInfo<Target>(triple) {
296 this->UserLabelPrefix = "";
297 }
298};
299
Torok Edwin5f6c1942009-06-30 17:10:35 +0000300// Linux target
301template<typename Target>
302class LinuxTargetInfo : public OSTargetInfo<Target> {
303protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000304 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000305 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000306 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000307 DefineStd(Builder, "unix", Opts);
308 DefineStd(Builder, "linux", Opts);
309 Builder.defineMacro("__gnu_linux__");
310 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000311 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000312 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000313 if (Opts.CPlusPlus)
314 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000315 }
316public:
Mike Stump1eb44332009-09-09 15:08:12 +0000317 LinuxTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000318 : OSTargetInfo<Target>(triple) {
319 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000320 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000321 }
322};
323
Chris Lattnerb62bb282009-07-13 20:29:08 +0000324// NetBSD Target
325template<typename Target>
326class NetBSDTargetInfo : public OSTargetInfo<Target> {
327protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000328 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000329 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000330 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000331 Builder.defineMacro("__NetBSD__");
332 Builder.defineMacro("__unix__");
333 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000334 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000335 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000336 }
337public:
Mike Stump1eb44332009-09-09 15:08:12 +0000338 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerb62bb282009-07-13 20:29:08 +0000339 : OSTargetInfo<Target>(triple) {
340 this->UserLabelPrefix = "";
341 }
342};
343
Torok Edwin5f6c1942009-06-30 17:10:35 +0000344// OpenBSD Target
345template<typename Target>
346class OpenBSDTargetInfo : public OSTargetInfo<Target> {
347protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000348 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000349 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000350 // OpenBSD defines; list based off of gcc output
351
Benjamin Kramera9992772010-01-09 17:55:51 +0000352 Builder.defineMacro("__OpenBSD__");
353 DefineStd(Builder, "unix", Opts);
354 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000355 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000356 Builder.defineMacro("_POSIX_THREADS");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000357 }
358public:
Mike Stump1eb44332009-09-09 15:08:12 +0000359 OpenBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000360 : OSTargetInfo<Target>(triple) {}
361};
362
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000363// PSP Target
364template<typename Target>
365class PSPTargetInfo : public OSTargetInfo<Target> {
366protected:
367 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000368 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000369 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000370 Builder.defineMacro("PSP");
371 Builder.defineMacro("_PSP");
372 Builder.defineMacro("__psp__");
373 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000374 }
375public:
376 PSPTargetInfo(const std::string& triple)
377 : OSTargetInfo<Target>(triple) {
378 this->UserLabelPrefix = "";
379 }
380};
381
John Thompson3f6918a2009-11-19 17:18:50 +0000382// PS3 PPU Target
383template<typename Target>
384class PS3PPUTargetInfo : public OSTargetInfo<Target> {
385protected:
386 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000387 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000388 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000389 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000390 Builder.defineMacro("__PPU__");
391 Builder.defineMacro("__CELLOS_LV2__");
392 Builder.defineMacro("__ELF__");
393 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000394 Builder.defineMacro("_ARCH_PPC64");
395 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000396 }
397public:
398 PS3PPUTargetInfo(const std::string& triple)
399 : OSTargetInfo<Target>(triple) {
400 this->UserLabelPrefix = "";
John Thompsonec387af2009-12-18 14:21:08 +0000401 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000402 this->IntMaxType = TargetInfo::SignedLongLong;
403 this->UIntMaxType = TargetInfo::UnsignedLongLong;
404 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000405 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000406 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
407 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000408 }
409};
410
411// FIXME: Need a real SPU target.
412// PS3 SPU Target
413template<typename Target>
414class PS3SPUTargetInfo : public OSTargetInfo<Target> {
415protected:
416 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000417 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000418 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000419 Builder.defineMacro("__SPU__");
420 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000421 }
422public:
423 PS3SPUTargetInfo(const std::string& triple)
424 : OSTargetInfo<Target>(triple) {
425 this->UserLabelPrefix = "";
426 }
427};
428
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000429// AuroraUX target
430template<typename Target>
431class AuroraUXTargetInfo : public OSTargetInfo<Target> {
432protected:
433 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000434 MacroBuilder &Builder) const {
435 DefineStd(Builder, "sun", Opts);
436 DefineStd(Builder, "unix", Opts);
437 Builder.defineMacro("__ELF__");
438 Builder.defineMacro("__svr4__");
439 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000440 }
441public:
442 AuroraUXTargetInfo(const std::string& triple)
443 : OSTargetInfo<Target>(triple) {
444 this->UserLabelPrefix = "";
445 this->WCharType = this->SignedLong;
446 // FIXME: WIntType should be SignedLong
447 }
448};
449
Torok Edwin5f6c1942009-06-30 17:10:35 +0000450// Solaris target
451template<typename Target>
452class SolarisTargetInfo : public OSTargetInfo<Target> {
453protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000454 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000455 MacroBuilder &Builder) const {
456 DefineStd(Builder, "sun", Opts);
457 DefineStd(Builder, "unix", Opts);
458 Builder.defineMacro("__ELF__");
459 Builder.defineMacro("__svr4__");
460 Builder.defineMacro("__SVR4");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000461 }
462public:
Mike Stump1eb44332009-09-09 15:08:12 +0000463 SolarisTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000464 : OSTargetInfo<Target>(triple) {
465 this->UserLabelPrefix = "";
466 this->WCharType = this->SignedLong;
467 // FIXME: WIntType should be SignedLong
468 }
469};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000470
471// Windows target
472template<typename Target>
473class WindowsTargetInfo : public OSTargetInfo<Target> {
474protected:
475 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
476 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000477 Builder.defineMacro("_WIN32");
478 }
479 void getVisualStudioDefines(const LangOptions &Opts,
480 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000481 if (Opts.CPlusPlus) {
482 if (Opts.RTTI)
483 Builder.defineMacro("_CPPRTTI");
484
485 if (Opts.Exceptions)
486 Builder.defineMacro("_CPPUNWIND");
487 }
488
489 if (!Opts.CharIsSigned)
490 Builder.defineMacro("_CHAR_UNSIGNED");
491
492 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
493 // but it works for now.
494 if (Opts.POSIXThreads)
495 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000496
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000497 if (Opts.MSCVersion != 0)
498 Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
499
500 if (Opts.Microsoft) {
501 Builder.defineMacro("_MSC_EXTENSIONS");
502
503 if (Opts.CPlusPlus0x) {
504 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
505 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
506 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
507 }
508 }
509
510 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000511 }
512
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000513public:
514 WindowsTargetInfo(const std::string &triple)
515 : OSTargetInfo<Target>(triple) {}
516};
517
Mike Stump1eb44332009-09-09 15:08:12 +0000518} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000519
Chris Lattnerd29b6302008-10-05 21:50:58 +0000520//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000521// Specific target implementations.
522//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000523
Eli Friedmane4277982008-08-20 23:11:40 +0000524namespace {
525// PPC abstract base class
526class PPCTargetInfo : public TargetInfo {
527 static const Builtin::Info BuiltinInfo[];
528 static const char * const GCCRegNames[];
529 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Eli Friedmane4277982008-08-20 23:11:40 +0000530public:
Eli Friedman15b91762009-06-05 07:05:05 +0000531 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
532
Eli Friedmane4277982008-08-20 23:11:40 +0000533 virtual void getTargetBuiltins(const Builtin::Info *&Records,
534 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000535 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000536 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000537 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000538
Chris Lattner33328642009-03-20 15:52:06 +0000539 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000540 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000541
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000542 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000543 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000544 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000545 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000546 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000547 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000548 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000549 default: return false;
550 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000551 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000552 case 'b': // Base register
553 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000554 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000555 break;
556 // FIXME: The following are added to allow parsing.
557 // I just took a guess at what the actions should be.
558 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000559 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000560 case 'v': // Altivec vector register
561 Info.setAllowsRegister();
562 break;
563 case 'w':
564 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000565 case 'd':// VSX vector register to hold vector double data
566 case 'f':// VSX vector register to hold vector float data
567 case 's':// VSX vector register to hold scalar float data
568 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000569 break;
570 default:
571 return false;
572 }
573 Info.setAllowsRegister();
574 Name++; // Skip over 'w'.
575 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000576 case 'h': // `MQ', `CTR', or `LINK' register
577 case 'q': // `MQ' register
578 case 'c': // `CTR' register
579 case 'l': // `LINK' register
580 case 'x': // `CR' register (condition register) number 0
581 case 'y': // `CR' register (condition register)
582 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000583 Info.setAllowsRegister();
584 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000585 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000586 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000587 // (use `L' instead for SImode constants)
588 case 'K': // Unsigned 16-bit constant
589 case 'L': // Signed 16-bit constant shifted left 16 bits
590 case 'M': // Constant larger than 31
591 case 'N': // Exact power of 2
592 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000593 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000594 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000595 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000596 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000597 break;
598 case 'm': // Memory operand. Note that on PowerPC targets, m can
599 // include addresses that update the base register. It
600 // is therefore only safe to use `m' in an asm statement
601 // if that asm statement accesses the operand exactly once.
602 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000603 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000604 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000605 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000606 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000607 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
608 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000609 // register to be updated.
610 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000611 if (Name[1] != 's')
612 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000613 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000614 // include any automodification of the base register. Unlike
615 // `m', this constraint can be used in asm statements that
616 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000617 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000618 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000619 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000620 break;
621 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000622 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000623 case 'Z': // Memory operand that is an indexed or indirect from a
624 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000625 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000626 Info.setAllowsMemory();
627 Info.setAllowsRegister();
628 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000629 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000630 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000631 // register (`p' is preferable for asm statements)
632 case 'S': // Constant suitable as a 64-bit mask operand
633 case 'T': // Constant suitable as a 32-bit mask operand
634 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000635 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000636 // instructions
637 case 'W': // Vector constant that does not require memory
638 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000639 break;
640 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000641 }
John Thompson8e6065a2010-06-24 22:44:13 +0000642 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000643 }
Eli Friedmane4277982008-08-20 23:11:40 +0000644 virtual const char *getClobbers() const {
645 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000646 }
Eli Friedmane4277982008-08-20 23:11:40 +0000647};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000648
Eli Friedmane4277982008-08-20 23:11:40 +0000649const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000650#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000651#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000652 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000653#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000654};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000655
656
Chris Lattnerc0f59212009-03-02 22:27:17 +0000657/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
658/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000659void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000660 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000661 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000662 Builder.defineMacro("__ppc__");
663 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000664 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000665 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000666 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000667 Builder.defineMacro("_ARCH_PPC64");
668 Builder.defineMacro("_LP64");
669 Builder.defineMacro("__LP64__");
Chris Lattnere03ae302010-02-16 18:14:57 +0000670 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000671 Builder.defineMacro("__ppc64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000672 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +0000673 Builder.defineMacro("__ppc__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000674 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000675
Chris Lattnerc0f59212009-03-02 22:27:17 +0000676 // Target properties.
Joerg Sonnenberger7cd1de52011-07-05 14:56:12 +0000677 if (getTriple().getOS() != llvm::Triple::NetBSD)
678 Builder.defineMacro("_BIG_ENDIAN");
Benjamin Kramera9992772010-01-09 17:55:51 +0000679 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000680
Chris Lattnerc0f59212009-03-02 22:27:17 +0000681 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000682 Builder.defineMacro("__NATURAL_ALIGNMENT__");
683 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000684
Chris Lattnerc0f59212009-03-02 22:27:17 +0000685 // FIXME: Should be controlled by command line option.
Benjamin Kramera9992772010-01-09 17:55:51 +0000686 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000687
John Thompson3f6918a2009-11-19 17:18:50 +0000688 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000689 Builder.defineMacro("__VEC__", "10206");
690 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000691 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000692}
693
Chris Lattner393ff042008-04-21 18:56:49 +0000694
Eli Friedmane4277982008-08-20 23:11:40 +0000695const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +0000696 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
697 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
698 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
699 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
700 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
701 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
702 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
703 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +0000704 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000705 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +0000706 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000707 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
708 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
709 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
710 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +0000711 "vrsave", "vscr",
712 "spe_acc", "spefscr",
713 "sfp"
714};
Reid Spencer5f016e22007-07-11 17:01:13 +0000715
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000716void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000717 unsigned &NumNames) const {
718 Names = GCCRegNames;
719 NumNames = llvm::array_lengthof(GCCRegNames);
720}
Reid Spencer5f016e22007-07-11 17:01:13 +0000721
Eli Friedmane4277982008-08-20 23:11:40 +0000722const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
723 // While some of these aliases do map to different registers
724 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000725 { { "0" }, "r0" },
726 { { "1"}, "r1" },
727 { { "2" }, "r2" },
728 { { "3" }, "r3" },
729 { { "4" }, "r4" },
730 { { "5" }, "r5" },
731 { { "6" }, "r6" },
732 { { "7" }, "r7" },
733 { { "8" }, "r8" },
734 { { "9" }, "r9" },
735 { { "10" }, "r10" },
736 { { "11" }, "r11" },
737 { { "12" }, "r12" },
738 { { "13" }, "r13" },
739 { { "14" }, "r14" },
740 { { "15" }, "r15" },
741 { { "16" }, "r16" },
742 { { "17" }, "r17" },
743 { { "18" }, "r18" },
744 { { "19" }, "r19" },
745 { { "20" }, "r20" },
746 { { "21" }, "r21" },
747 { { "22" }, "r22" },
748 { { "23" }, "r23" },
749 { { "24" }, "r24" },
750 { { "25" }, "r25" },
751 { { "26" }, "r26" },
752 { { "27" }, "r27" },
753 { { "28" }, "r28" },
754 { { "29" }, "r29" },
755 { { "30" }, "r30" },
756 { { "31" }, "r31" },
757 { { "fr0" }, "f0" },
758 { { "fr1" }, "f1" },
759 { { "fr2" }, "f2" },
760 { { "fr3" }, "f3" },
761 { { "fr4" }, "f4" },
762 { { "fr5" }, "f5" },
763 { { "fr6" }, "f6" },
764 { { "fr7" }, "f7" },
765 { { "fr8" }, "f8" },
766 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +0000767 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000768 { { "fr11" }, "f11" },
769 { { "fr12" }, "f12" },
770 { { "fr13" }, "f13" },
771 { { "fr14" }, "f14" },
772 { { "fr15" }, "f15" },
773 { { "fr16" }, "f16" },
774 { { "fr17" }, "f17" },
775 { { "fr18" }, "f18" },
776 { { "fr19" }, "f19" },
777 { { "fr20" }, "f20" },
778 { { "fr21" }, "f21" },
779 { { "fr22" }, "f22" },
780 { { "fr23" }, "f23" },
781 { { "fr24" }, "f24" },
782 { { "fr25" }, "f25" },
783 { { "fr26" }, "f26" },
784 { { "fr27" }, "f27" },
785 { { "fr28" }, "f28" },
786 { { "fr29" }, "f29" },
787 { { "fr30" }, "f30" },
788 { { "fr31" }, "f31" },
789 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +0000790};
791
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000792void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000793 unsigned &NumAliases) const {
794 Aliases = GCCRegAliases;
795 NumAliases = llvm::array_lengthof(GCCRegAliases);
796}
797} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +0000798
799namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000800class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000801public:
Chris Lattnere03ae302010-02-16 18:14:57 +0000802 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +0000803 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 +0000804 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +0000805
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +0000806 switch (getTriple().getOS()) {
807 case llvm::Triple::FreeBSD:
808 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +0000809 SizeType = UnsignedInt;
810 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +0000811 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +0000812 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +0000813 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000814 }
815
816 virtual const char *getVAListDeclaration() const {
817 // This is the ELF definition, and is overridden by the Darwin sub-target
818 return "typedef struct __va_list_tag {"
819 " unsigned char gpr;"
820 " unsigned char fpr;"
821 " unsigned short reserved;"
822 " void* overflow_arg_area;"
823 " void* reg_save_area;"
824 "} __builtin_va_list[1];";
Eli Friedmaned855cb2008-08-21 00:13:15 +0000825 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000826};
827} // end anonymous namespace.
828
829namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000830class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000831public:
Eli Friedmane4277982008-08-20 23:11:40 +0000832 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000833 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +0000834 IntMaxType = SignedLong;
835 UIntMaxType = UnsignedLong;
836 Int64Type = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000837 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 +0000838 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerf291b102008-05-09 06:17:04 +0000839 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000840 virtual const char *getVAListDeclaration() const {
841 return "typedef char* __builtin_va_list;";
842 }
Eli Friedmane4277982008-08-20 23:11:40 +0000843};
844} // end anonymous namespace.
845
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000846
847namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +0000848class DarwinPPC32TargetInfo :
849 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000850public:
Roman Divackyc81f2a22011-01-06 08:27:10 +0000851 DarwinPPC32TargetInfo(const std::string& triple)
852 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000853 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +0000854 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
855 }
856 virtual const char *getVAListDeclaration() const {
857 return "typedef char* __builtin_va_list;";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000858 }
859};
860
861class DarwinPPC64TargetInfo :
862 public DarwinTargetInfo<PPC64TargetInfo> {
863public:
864 DarwinPPC64TargetInfo(const std::string& triple)
865 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
866 HasAlignMac68kSupport = true;
867 }
868};
869} // end anonymous namespace.
870
Reid Spencer5f016e22007-07-11 17:01:13 +0000871namespace {
Justin Holewinski285dc652011-04-20 19:34:15 +0000872 class PTXTargetInfo : public TargetInfo {
873 static const char * const GCCRegNames[];
874 static const Builtin::Info BuiltinInfo[];
875 public:
876 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
877 TLSSupported = false;
878 LongWidth = LongAlign = 64;
879 }
880 virtual void getTargetDefines(const LangOptions &Opts,
881 MacroBuilder &Builder) const {
882 Builder.defineMacro("__PTX__");
883 }
884 virtual void getTargetBuiltins(const Builtin::Info *&Records,
885 unsigned &NumRecords) const {
886 Records = BuiltinInfo;
887 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
888 }
889
890 virtual void getGCCRegNames(const char * const *&Names,
891 unsigned &NumNames) const;
892 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
893 unsigned &NumAliases) const {
894 // No aliases.
895 Aliases = 0;
896 NumAliases = 0;
897 }
898 virtual bool validateAsmConstraint(const char *&Name,
899 TargetInfo::ConstraintInfo &info) const {
900 // FIXME: implement
901 return true;
902 }
903 virtual const char *getClobbers() const {
904 // FIXME: Is this really right?
905 return "";
906 }
907 virtual const char *getVAListDeclaration() const {
908 // FIXME: implement
909 return "typedef char* __builtin_va_list;";
910 }
911 };
912
913 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000914#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +0000915#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000916 ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +0000917#include "clang/Basic/BuiltinsPTX.def"
918 };
919
920 const char * const PTXTargetInfo::GCCRegNames[] = {
921 "r0"
922 };
923
924 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
925 unsigned &NumNames) const {
926 Names = GCCRegNames;
927 NumNames = llvm::array_lengthof(GCCRegNames);
928 }
929
930
931 class PTX32TargetInfo : public PTXTargetInfo {
932 public:
933 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
934 PointerWidth = PointerAlign = 32;
935 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
936 DescriptionString
937 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
938 }
939 };
940
941 class PTX64TargetInfo : public PTXTargetInfo {
942 public:
943 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
944 PointerWidth = PointerAlign = 64;
945 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
946 DescriptionString
947 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
948 }
949 };
950}
951
952namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +0000953// MBlaze abstract base class
954class MBlazeTargetInfo : public TargetInfo {
955 static const char * const GCCRegNames[];
956 static const TargetInfo::GCCRegAlias GCCRegAliases[];
957
958public:
959 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +0000960 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +0000961 }
962
963 virtual void getTargetBuiltins(const Builtin::Info *&Records,
964 unsigned &NumRecords) const {
965 // FIXME: Implement.
966 Records = 0;
967 NumRecords = 0;
968 }
969
970 virtual void getTargetDefines(const LangOptions &Opts,
971 MacroBuilder &Builder) const;
972
973 virtual const char *getVAListDeclaration() const {
974 return "typedef char* __builtin_va_list;";
975 }
976 virtual const char *getTargetPrefix() const {
977 return "mblaze";
978 }
979 virtual void getGCCRegNames(const char * const *&Names,
980 unsigned &NumNames) const;
981 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
982 unsigned &NumAliases) const;
983 virtual bool validateAsmConstraint(const char *&Name,
984 TargetInfo::ConstraintInfo &Info) const {
985 switch (*Name) {
986 default: return false;
987 case 'O': // Zero
988 return true;
989 case 'b': // Base register
990 case 'f': // Floating point register
991 Info.setAllowsRegister();
992 return true;
993 }
994 }
995 virtual const char *getClobbers() const {
996 return "";
997 }
998};
999
1000/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1001/// #defines that are not tied to a specific subtarget.
1002void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1003 MacroBuilder &Builder) const {
1004 // Target identification.
1005 Builder.defineMacro("__microblaze__");
1006 Builder.defineMacro("_ARCH_MICROBLAZE");
1007 Builder.defineMacro("__MICROBLAZE__");
1008
1009 // Target properties.
1010 Builder.defineMacro("_BIG_ENDIAN");
1011 Builder.defineMacro("__BIG_ENDIAN__");
1012
1013 // Subtarget options.
1014 Builder.defineMacro("__REGISTER_PREFIX__", "");
1015}
1016
1017
1018const char * const MBlazeTargetInfo::GCCRegNames[] = {
1019 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1020 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1021 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1022 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1023 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1024 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1025 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1026 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1027 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1028 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1029};
1030
1031void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1032 unsigned &NumNames) const {
1033 Names = GCCRegNames;
1034 NumNames = llvm::array_lengthof(GCCRegNames);
1035}
1036
1037const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1038 { {"f0"}, "r0" },
1039 { {"f1"}, "r1" },
1040 { {"f2"}, "r2" },
1041 { {"f3"}, "r3" },
1042 { {"f4"}, "r4" },
1043 { {"f5"}, "r5" },
1044 { {"f6"}, "r6" },
1045 { {"f7"}, "r7" },
1046 { {"f8"}, "r8" },
1047 { {"f9"}, "r9" },
1048 { {"f10"}, "r10" },
1049 { {"f11"}, "r11" },
1050 { {"f12"}, "r12" },
1051 { {"f13"}, "r13" },
1052 { {"f14"}, "r14" },
1053 { {"f15"}, "r15" },
1054 { {"f16"}, "r16" },
1055 { {"f17"}, "r17" },
1056 { {"f18"}, "r18" },
1057 { {"f19"}, "r19" },
1058 { {"f20"}, "r20" },
1059 { {"f21"}, "r21" },
1060 { {"f22"}, "r22" },
1061 { {"f23"}, "r23" },
1062 { {"f24"}, "r24" },
1063 { {"f25"}, "r25" },
1064 { {"f26"}, "r26" },
1065 { {"f27"}, "r27" },
1066 { {"f28"}, "r28" },
1067 { {"f29"}, "r29" },
1068 { {"f30"}, "r30" },
1069 { {"f31"}, "r31" },
1070};
1071
1072void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1073 unsigned &NumAliases) const {
1074 Aliases = GCCRegAliases;
1075 NumAliases = llvm::array_lengthof(GCCRegAliases);
1076}
1077} // end anonymous namespace.
1078
1079namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001080// Namespace for x86 abstract base class
1081const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001082#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001083#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001084 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +00001085#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +00001086};
Eli Friedman61538a72008-05-20 14:21:01 +00001087
Nuno Lopes2550d702009-12-23 17:49:57 +00001088static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +00001089 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1090 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001091 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman618234a2008-08-20 02:34:37 +00001092 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1093 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1094 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001095 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eli Friedman618234a2008-08-20 02:34:37 +00001096};
1097
Eric Christophercfd323d2011-06-21 00:05:20 +00001098const TargetInfo::AddlRegName AddlRegNames[] = {
1099 { { "al", "ah", "eax", "rax" }, 0 },
1100 { { "bl", "bh", "ebx", "rbx" }, 3 },
1101 { { "cl", "ch", "ecx", "rcx" }, 2 },
1102 { { "dl", "dh", "edx", "rdx" }, 1 },
1103 { { "esi", "rsi" }, 4 },
1104 { { "edi", "rdi" }, 5 },
1105 { { "esp", "rsp" }, 7 },
1106 { { "ebp", "rbp" }, 6 },
Eli Friedman618234a2008-08-20 02:34:37 +00001107};
1108
1109// X86 target abstract base class; x86-32 and x86-64 are very close, so
1110// most of the implementation can be shared.
1111class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001112 enum X86SSEEnum {
1113 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
1114 } SSELevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001115 enum AMD3DNowEnum {
1116 NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
1117 } AMD3DNowLevel;
1118
Eric Christophereea12d12010-04-02 23:50:19 +00001119 bool HasAES;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001120 bool HasAVX;
1121
Eli Friedman618234a2008-08-20 02:34:37 +00001122public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001123 X86TargetInfo(const std::string& triple)
Eric Christophereea12d12010-04-02 23:50:19 +00001124 : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001125 HasAES(false), HasAVX(false) {
Eli Friedman618234a2008-08-20 02:34:37 +00001126 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001127 }
1128 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1129 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001130 Records = BuiltinInfo;
1131 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001132 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001133 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001134 unsigned &NumNames) const {
1135 Names = GCCRegNames;
1136 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001137 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001138 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001139 unsigned &NumAliases) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001140 Aliases = 0;
1141 NumAliases = 0;
1142 }
1143 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1144 unsigned &NumNames) const {
1145 Names = AddlRegNames;
1146 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001147 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001148 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001149 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings002333f2011-06-07 23:45:05 +00001150 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001151 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001152 return "~{dirflag},~{fpsr},~{flags}";
1153 }
Chris Lattner33328642009-03-20 15:52:06 +00001154 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001155 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001156 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1157 const std::string &Name,
1158 bool Enabled) const;
Mike Stump1eb44332009-09-09 15:08:12 +00001159 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001160 llvm::StringMap<bool> &Features) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001161 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Reid Spencer5f016e22007-07-11 17:01:13 +00001162};
Chris Lattner3daed522009-03-02 22:20:04 +00001163
Mike Stump1eb44332009-09-09 15:08:12 +00001164void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001165 llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001166 // FIXME: This should not be here.
1167 Features["3dnow"] = false;
1168 Features["3dnowa"] = false;
1169 Features["mmx"] = false;
1170 Features["sse"] = false;
1171 Features["sse2"] = false;
1172 Features["sse3"] = false;
1173 Features["ssse3"] = false;
1174 Features["sse41"] = false;
1175 Features["sse42"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001176 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001177 Features["avx"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001178
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001179 // LLVM does not currently recognize this.
1180 // Features["sse4a"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001181
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001182 // FIXME: This *really* should not be here.
1183
1184 // X86_64 always has SSE2.
1185 if (PointerWidth == 64)
1186 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1187
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001188 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1189 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1190 ;
1191 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1192 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001193 else if (CPU == "pentium3")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001194 setFeatureEnabled(Features, "sse", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001195 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001196 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001197 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001198 setFeatureEnabled(Features, "sse3", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001199 else if (CPU == "core2")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001200 setFeatureEnabled(Features, "ssse3", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001201 else if (CPU == "penryn") {
1202 setFeatureEnabled(Features, "sse4", true);
1203 Features["sse42"] = false;
1204 } else if (CPU == "atom")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001205 setFeatureEnabled(Features, "sse3", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001206 else if (CPU == "corei7") {
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001207 setFeatureEnabled(Features, "sse4", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001208 setFeatureEnabled(Features, "aes", true);
Benjamin Kramerb65b6722011-05-20 15:11:23 +00001209 } else if (CPU == "corei7-avx") {
Roman Divackybcaa3b82011-04-05 20:32:44 +00001210 setFeatureEnabled(Features, "sse4", true);
1211 setFeatureEnabled(Features, "aes", true);
1212// setFeatureEnabled(Features, "avx", true);
1213 } else if (CPU == "k6" || CPU == "winchip-c6")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001214 setFeatureEnabled(Features, "mmx", true);
Mike Stump1eb44332009-09-09 15:08:12 +00001215 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001216 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
1217 setFeatureEnabled(Features, "mmx", true);
1218 setFeatureEnabled(Features, "3dnow", true);
1219 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1220 setFeatureEnabled(Features, "sse", true);
1221 setFeatureEnabled(Features, "3dnowa", true);
1222 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1223 CPU == "athlon-fx") {
Mike Stump1eb44332009-09-09 15:08:12 +00001224 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001225 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00001226 } else if (CPU == "k8-sse3") {
1227 setFeatureEnabled(Features, "sse3", true);
1228 setFeatureEnabled(Features, "3dnowa", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001229 } else if (CPU == "c3-2")
1230 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001231}
1232
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001233bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump1eb44332009-09-09 15:08:12 +00001234 const std::string &Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001235 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00001236 // FIXME: This *really* should not be here. We need some way of translating
1237 // options into llvm subtarget features.
1238 if (!Features.count(Name) &&
1239 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001240 return false;
1241
1242 if (Enabled) {
1243 if (Name == "mmx")
1244 Features["mmx"] = true;
1245 else if (Name == "sse")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001246 Features["mmx"] = Features["sse"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001247 else if (Name == "sse2")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001248 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001249 else if (Name == "sse3")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001250 Features["mmx"] = Features["sse"] = Features["sse2"] =
1251 Features["sse3"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001252 else if (Name == "ssse3")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001253 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001254 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001255 else if (Name == "sse4" || Name == "sse4.2")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001256 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001257 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001258 else if (Name == "sse4.1")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001259 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopherd39ebe22010-03-04 02:26:37 +00001260 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001261 else if (Name == "3dnow")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001262 Features["3dnowa"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001263 else if (Name == "3dnowa")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001264 Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00001265 else if (Name == "aes")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001266 Features["aes"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001267 else if (Name == "avx")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001268 Features["avx"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001269 } else {
1270 if (Name == "mmx")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001271 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] =
1272 Features["sse"] = Features["sse2"] = Features["sse3"] =
1273 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001274 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00001275 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001276 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001277 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00001278 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001279 Features["sse41"] = Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001280 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001281 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001282 Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001283 else if (Name == "ssse3")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001284 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencerb24bac92011-04-17 19:22:03 +00001285 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001286 Features["sse41"] = Features["sse42"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00001287 else if (Name == "sse4.2")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001288 Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001289 else if (Name == "3dnow")
1290 Features["3dnow"] = Features["3dnowa"] = false;
1291 else if (Name == "3dnowa")
1292 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001293 else if (Name == "aes")
1294 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001295 else if (Name == "avx")
1296 Features["avx"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001297 }
1298
1299 return true;
1300}
1301
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001302/// HandleTargetOptions - Perform initialization based on the user
1303/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001304void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001305 // Remember the maximum enabled sselevel.
1306 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1307 // Ignore disabled features.
1308 if (Features[i][0] == '-')
1309 continue;
1310
Eric Christophereea12d12010-04-02 23:50:19 +00001311 if (Features[i].substr(1) == "aes") {
1312 HasAES = true;
1313 continue;
1314 }
1315
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001316 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1317 // For now let it be enabled together with other SSE levels.
1318 if (Features[i].substr(1) == "avx") {
1319 HasAVX = true;
1320 continue;
1321 }
1322
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001323 assert(Features[i][0] == '+' && "Invalid target feature!");
1324 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1325 .Case("sse42", SSE42)
1326 .Case("sse41", SSE41)
1327 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00001328 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001329 .Case("sse2", SSE2)
1330 .Case("sse", SSE1)
1331 .Case("mmx", MMX)
1332 .Default(NoMMXSSE);
1333 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001334
1335 AMD3DNowEnum ThreeDNowLevel =
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001336 llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1337 .Case("3dnowa", AMD3DNowAthlon)
1338 .Case("3dnow", AMD3DNow)
1339 .Default(NoAMD3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001340
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001341 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001342 }
Chris Lattner3daed522009-03-02 22:20:04 +00001343}
Chris Lattnerc0f59212009-03-02 22:27:17 +00001344
1345/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1346/// that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00001347void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001348 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001349 // Target identification.
1350 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001351 Builder.defineMacro("_LP64");
1352 Builder.defineMacro("__LP64__");
1353 Builder.defineMacro("__amd64__");
1354 Builder.defineMacro("__amd64");
1355 Builder.defineMacro("__x86_64");
1356 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00001357 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00001358 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00001359 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001360
Eric Christophereea12d12010-04-02 23:50:19 +00001361 if (HasAES)
1362 Builder.defineMacro("__AES__");
1363
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001364 if (HasAVX)
1365 Builder.defineMacro("__AVX__");
1366
Chris Lattnerc0f59212009-03-02 22:27:17 +00001367 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00001368 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001369
Chris Lattnerc0f59212009-03-02 22:27:17 +00001370 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +00001371 Builder.defineMacro("__nocona");
1372 Builder.defineMacro("__nocona__");
1373 Builder.defineMacro("__tune_nocona__");
1374 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001375
Chris Lattner54175442009-04-19 17:32:33 +00001376 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1377 // functions in glibc header files that use FP Stack inline asm which the
1378 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00001379 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001380
Chris Lattner84f0ea82009-03-02 22:40:39 +00001381 // Each case falls through to the previous one here.
1382 switch (SSELevel) {
1383 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00001384 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001385 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00001386 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001387 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001388 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001389 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001390 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001391 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00001392 Builder.defineMacro("__SSE2__");
1393 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001394 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00001395 Builder.defineMacro("__SSE__");
1396 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001397 case MMX:
Benjamin Kramera9992772010-01-09 17:55:51 +00001398 Builder.defineMacro("__MMX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001399 case NoMMXSSE:
1400 break;
1401 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001402
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001403 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001404 switch (SSELevel) {
Michael J. Spencera764e832010-10-21 08:22:51 +00001405 case SSE42:
1406 case SSE41:
1407 case SSSE3:
1408 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001409 case SSE2:
1410 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1411 break;
1412 case SSE1:
1413 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1414 break;
1415 default:
1416 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1417 }
1418 }
1419
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001420 // Each case falls through to the previous one here.
1421 switch (AMD3DNowLevel) {
1422 case AMD3DNowAthlon:
1423 Builder.defineMacro("__3dNOW_A__");
1424 case AMD3DNow:
1425 Builder.defineMacro("__3dNOW__");
1426 case NoAMD3DNow:
1427 break;
1428 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00001429}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001430
1431
Eli Friedman618234a2008-08-20 02:34:37 +00001432bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001433X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00001434 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001435 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00001436 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00001437 case 'Y': // first letter of a pair:
1438 switch (*(Name+1)) {
1439 default: return false;
1440 case '0': // First SSE register.
1441 case 't': // Any SSE register, when SSE2 is enabled.
1442 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1443 case 'm': // any MMX register, when inter-unit moves enabled.
1444 break; // falls through to setAllowsRegister.
1445 }
Eli Friedman618234a2008-08-20 02:34:37 +00001446 case 'a': // eax.
1447 case 'b': // ebx.
1448 case 'c': // ecx.
1449 case 'd': // edx.
1450 case 'S': // esi.
1451 case 'D': // edi.
1452 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00001453 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00001454 case 't': // top of floating point stack.
1455 case 'u': // second from top of floating point stack.
1456 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00001457 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00001458 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00001459 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00001460 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1461 case 'l': // "Index" registers: any general register that can be used as an
1462 // index in a base+index memory access.
1463 Info.setAllowsRegister();
1464 return true;
1465 case 'C': // SSE floating point constant.
1466 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001467 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001468 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001469 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001470 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00001471 return true;
1472 }
Dale Johannesen545be512010-08-24 22:33:12 +00001473 return false;
Eli Friedman618234a2008-08-20 02:34:37 +00001474}
1475
Dale Johannesenf6e2c202010-10-29 23:12:32 +00001476
Eli Friedman618234a2008-08-20 02:34:37 +00001477std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00001478X86TargetInfo::convertConstraint(const char *&Constraint) const {
1479 switch (*Constraint) {
Eli Friedman618234a2008-08-20 02:34:37 +00001480 case 'a': return std::string("{ax}");
1481 case 'b': return std::string("{bx}");
1482 case 'c': return std::string("{cx}");
1483 case 'd': return std::string("{dx}");
1484 case 'S': return std::string("{si}");
1485 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00001486 case 'p': // address
1487 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00001488 case 't': // top of floating point stack.
1489 return std::string("{st}");
1490 case 'u': // second from top of floating point stack.
1491 return std::string("{st(1)}"); // second from top of floating point stack.
1492 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00001493 return std::string(1, *Constraint);
Eli Friedman618234a2008-08-20 02:34:37 +00001494 }
1495}
Eli Friedman618234a2008-08-20 02:34:37 +00001496} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00001497
1498namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001499// X86-32 generic target
1500class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001501public:
Eli Friedman618234a2008-08-20 02:34:37 +00001502 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1503 DoubleAlign = LongLongAlign = 32;
1504 LongDoubleWidth = 96;
1505 LongDoubleAlign = 32;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001506 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1507 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001508 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman1afabd92009-03-29 20:31:09 +00001509 SizeType = UnsignedInt;
1510 PtrDiffType = SignedInt;
1511 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001512 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00001513
1514 // Use fpret for all types.
1515 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1516 (1 << TargetInfo::Double) |
1517 (1 << TargetInfo::LongDouble));
Eli Friedman618234a2008-08-20 02:34:37 +00001518 }
1519 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001520 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +00001521 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00001522
Chris Lattner21fb98e2009-09-23 06:06:36 +00001523 int getEHDataRegisterNumber(unsigned RegNo) const {
1524 if (RegNo == 0) return 0;
1525 if (RegNo == 1) return 2;
1526 return -1;
1527 }
Eli Friedman618234a2008-08-20 02:34:37 +00001528};
1529} // end anonymous namespace
1530
1531namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00001532class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1533public:
1534 OpenBSDI386TargetInfo(const std::string& triple) :
1535 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1536 SizeType = UnsignedLong;
1537 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00001538 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00001539 }
1540};
1541} // end anonymous namespace
1542
1543namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00001544class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00001545public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00001546 DarwinI386TargetInfo(const std::string& triple) :
1547 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00001548 LongDoubleWidth = 128;
1549 LongDoubleAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +00001550 SizeType = UnsignedLong;
1551 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001552 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1553 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001554 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbar613fd672010-05-27 00:35:16 +00001555 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00001556 }
1557
Eli Friedman618234a2008-08-20 02:34:37 +00001558};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001559} // end anonymous namespace
1560
1561namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00001562// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001563class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00001564public:
1565 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001566 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00001567 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00001568 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00001569 DoubleAlign = LongLongAlign = 64;
1570 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 +00001571 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1572 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedman29a30502008-08-21 01:40:19 +00001573 }
Michael J. Spencera764e832010-10-21 08:22:51 +00001574 virtual void getTargetDefines(const LangOptions &Opts,
1575 MacroBuilder &Builder) const {
1576 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1577 }
1578};
1579} // end anonymous namespace
1580
1581namespace {
1582
1583// x86-32 Windows Visual Studio target
1584class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1585public:
1586 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1587 : WindowsX86_32TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00001588 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00001589 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1590 }
1591 virtual void getTargetDefines(const LangOptions &Opts,
1592 MacroBuilder &Builder) const {
1593 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1594 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1595 // The value of the following reflects processor type.
1596 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1597 // We lost the original triple, so we use the default.
1598 Builder.defineMacro("_M_IX86", "600");
1599 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001600};
1601} // end anonymous namespace
1602
1603namespace {
1604// x86-32 MinGW target
1605class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1606public:
1607 MinGWX86_32TargetInfo(const std::string& triple)
1608 : WindowsX86_32TargetInfo(triple) {
1609 }
1610 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001611 MacroBuilder &Builder) const {
1612 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00001613 DefineStd(Builder, "WIN32", Opts);
1614 DefineStd(Builder, "WINNT", Opts);
1615 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00001616 Builder.defineMacro("__MSVCRT__");
1617 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00001618
1619 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1620 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1621 if (Opts.Microsoft)
1622 // Provide "as-is" __declspec.
1623 Builder.defineMacro("__declspec", "__declspec");
1624 else
1625 // Provide alias of __attribute__ like mingw32-gcc.
1626 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001627 }
1628};
1629} // end anonymous namespace
1630
1631namespace {
1632// x86-32 Cygwin target
1633class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1634public:
1635 CygwinX86_32TargetInfo(const std::string& triple)
1636 : X86_32TargetInfo(triple) {
1637 TLSSupported = false;
1638 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001639 DoubleAlign = LongLongAlign = 64;
1640 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1641 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001642 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001643 }
1644 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001645 MacroBuilder &Builder) const {
1646 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1647 Builder.defineMacro("__CYGWIN__");
1648 Builder.defineMacro("__CYGWIN32__");
1649 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00001650 if (Opts.CPlusPlus)
1651 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00001652 }
Eli Friedman29a30502008-08-21 01:40:19 +00001653};
1654} // end anonymous namespace
1655
1656namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00001657// x86-32 Haiku target
1658class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1659public:
1660 HaikuX86_32TargetInfo(const std::string& triple)
1661 : X86_32TargetInfo(triple) {
1662 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00001663 IntPtrType = SignedLong;
1664 PtrDiffType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00001665 this->UserLabelPrefix = "";
Eli Friedmana7e68452010-08-22 01:00:03 +00001666 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00001667 virtual void getTargetDefines(const LangOptions &Opts,
1668 MacroBuilder &Builder) const {
1669 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1670 Builder.defineMacro("__INTEL__");
1671 Builder.defineMacro("__HAIKU__");
1672 }
1673};
1674} // end anonymous namespace
1675
Douglas Gregordca52262011-07-01 22:41:14 +00001676// RTEMS Target
1677template<typename Target>
1678class RTEMSTargetInfo : public OSTargetInfo<Target> {
1679protected:
1680 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
1681 MacroBuilder &Builder) const {
1682 // RTEMS defines; list based off of gcc output
1683
1684 // FIXME: Move version number handling to llvm::Triple.
1685 llvm::StringRef Release = Triple.getOSName().substr(strlen("rtems"), 1);
1686
1687 Builder.defineMacro("__rtems__");
1688 Builder.defineMacro("__ELF__");
1689 }
1690public:
1691 RTEMSTargetInfo(const std::string &triple)
1692 : OSTargetInfo<Target>(triple) {
1693 this->UserLabelPrefix = "";
1694
1695 llvm::Triple Triple(triple);
1696 switch (Triple.getArch()) {
1697 default:
1698 case llvm::Triple::x86:
1699 // this->MCountName = ".mcount";
1700 break;
1701 case llvm::Triple::mips:
1702 case llvm::Triple::mipsel:
1703 case llvm::Triple::ppc:
1704 case llvm::Triple::ppc64:
1705 // this->MCountName = "_mcount";
1706 break;
1707 case llvm::Triple::arm:
1708 // this->MCountName = "__mcount";
1709 break;
1710 }
1711
1712 }
1713};
1714
1715namespace {
1716// x86-32 RTEMS target
1717class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
1718public:
1719 RTEMSX86_32TargetInfo(const std::string& triple)
1720 : X86_32TargetInfo(triple) {
1721 SizeType = UnsignedLong;
1722 IntPtrType = SignedLong;
1723 PtrDiffType = SignedLong;
1724 this->UserLabelPrefix = "";
1725 }
1726 virtual void getTargetDefines(const LangOptions &Opts,
1727 MacroBuilder &Builder) const {
1728 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1729 Builder.defineMacro("__INTEL__");
1730 Builder.defineMacro("__rtems__");
1731 }
1732};
1733} // end anonymous namespace
1734
Chris Lattner86ed3a32010-04-11 19:29:39 +00001735namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001736// x86-64 generic target
1737class X86_64TargetInfo : public X86TargetInfo {
1738public:
Chris Lattner33328642009-03-20 15:52:06 +00001739 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00001740 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00001741 LongDoubleWidth = 128;
1742 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00001743 LargeArrayMinWidth = 128;
1744 LargeArrayAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00001745 IntMaxType = SignedLong;
1746 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001747 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001748 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00001749
Eli Friedmaned855cb2008-08-21 00:13:15 +00001750 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1751 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001752 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00001753
1754 // Use fpret only for long double.
1755 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Reid Spencer5f016e22007-07-11 17:01:13 +00001756 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001757 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001758 return "typedef struct __va_list_tag {"
1759 " unsigned gp_offset;"
1760 " unsigned fp_offset;"
1761 " void* overflow_arg_area;"
1762 " void* reg_save_area;"
John McCall2b7baf02010-05-28 18:25:28 +00001763 "} __va_list_tag;"
Eli Friedmandc043162009-07-03 00:45:06 +00001764 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +00001765 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001766
Chris Lattner21fb98e2009-09-23 06:06:36 +00001767 int getEHDataRegisterNumber(unsigned RegNo) const {
1768 if (RegNo == 0) return 0;
1769 if (RegNo == 1) return 1;
1770 return -1;
1771 }
Eli Friedman618234a2008-08-20 02:34:37 +00001772};
1773} // end anonymous namespace
1774
1775namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001776// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001777class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001778public:
1779 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001780 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001781 TLSSupported = false;
1782 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00001783 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00001784 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00001785 IntMaxType = SignedLongLong;
1786 UIntMaxType = UnsignedLongLong;
1787 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00001788 SizeType = UnsignedLongLong;
1789 PtrDiffType = SignedLongLong;
1790 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00001791 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001792 }
1793 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001794 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001795 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001796 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00001797 }
NAKAMURA Takumi79521992011-01-17 22:56:23 +00001798 virtual const char *getVAListDeclaration() const {
1799 return "typedef char* __builtin_va_list;";
1800 }
Michael J. Spencera764e832010-10-21 08:22:51 +00001801};
1802} // end anonymous namespace
1803
1804namespace {
1805// x86-64 Windows Visual Studio target
1806class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1807public:
1808 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1809 : WindowsX86_64TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00001810 LongDoubleWidth = LongDoubleAlign = 64;
1811 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00001812 }
1813 virtual void getTargetDefines(const LangOptions &Opts,
1814 MacroBuilder &Builder) const {
1815 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1816 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00001817 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001818 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001819 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001820};
1821} // end anonymous namespace
1822
1823namespace {
1824// x86-64 MinGW target
1825class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1826public:
1827 MinGWX86_64TargetInfo(const std::string& triple)
1828 : WindowsX86_64TargetInfo(triple) {
1829 }
1830 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001831 MacroBuilder &Builder) const {
1832 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00001833 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00001834 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00001835 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00001836 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00001837
1838 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1839 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1840 if (Opts.Microsoft)
1841 // Provide "as-is" __declspec.
1842 Builder.defineMacro("__declspec", "__declspec");
1843 else
1844 // Provide alias of __attribute__ like mingw32-gcc.
1845 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001846 }
1847};
1848} // end anonymous namespace
1849
1850namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001851class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1852public:
Mike Stump1eb44332009-09-09 15:08:12 +00001853 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001854 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1855 Int64Type = SignedLongLong;
1856 }
1857};
1858} // end anonymous namespace
1859
1860namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00001861class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1862public:
Mike Stump1eb44332009-09-09 15:08:12 +00001863 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00001864 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1865 IntMaxType = SignedLongLong;
1866 UIntMaxType = UnsignedLongLong;
1867 Int64Type = SignedLongLong;
1868 }
1869};
1870} // end anonymous namespace
1871
1872namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00001873class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001874 // Possible FPU choices.
1875 enum FPUMode {
1876 NoFPU,
1877 VFP2FPU,
1878 VFP3FPU,
1879 NeonFPU
1880 };
1881
1882 static bool FPUModeIsVFP(FPUMode Mode) {
1883 return Mode >= VFP2FPU && Mode <= NeonFPU;
1884 }
1885
1886 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1887 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001888
Daniel Dunbareac7c532009-12-18 18:42:37 +00001889 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001890
1891 unsigned FPU : 3;
1892
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001893 unsigned IsThumb : 1;
1894
1895 // Initialized via features.
1896 unsigned SoftFloat : 1;
1897 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001898
Chris Lattner2752c012010-03-03 19:03:45 +00001899 static const Builtin::Info BuiltinInfo[];
1900
Chris Lattner393ff042008-04-21 18:56:49 +00001901public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001902 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbareac7c532009-12-18 18:42:37 +00001903 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001904 {
Daniel Dunbara2a41612009-09-14 00:02:24 +00001905 SizeType = UnsignedInt;
1906 PtrDiffType = SignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001907
Chris Lattner9bffb072010-04-23 16:29:58 +00001908 // {} in inline assembly are neon specifiers, not assembly variant
1909 // specifiers.
1910 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00001911
Daniel Dunbareac7c532009-12-18 18:42:37 +00001912 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00001913 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001914 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00001915 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1916 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001917 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1918 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001919 "v64:64:64-v128:64:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001920 } else {
1921 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1922 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001923 "v64:64:64-v128:64:128-a0:0:64-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001924 }
John McCallee79a4c2010-08-21 22:46:04 +00001925
1926 // ARM targets default to using the ARM C++ ABI.
1927 CXXABI = CXXABI_ARM;
Eli Friedman61538a72008-05-20 14:21:01 +00001928 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001929 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00001930 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001931 ABI = Name;
1932
Daniel Dunbara2a41612009-09-14 00:02:24 +00001933 // The defaults (above) are for AAPCS, check if we need to change them.
1934 //
1935 // FIXME: We need support for -meabi... we could just mangle it into the
1936 // name.
1937 if (Name == "apcs-gnu") {
Daniel Dunbard410fa22010-01-27 20:23:08 +00001938 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbara2a41612009-09-14 00:02:24 +00001939 SizeType = UnsignedLong;
1940
Daniel Dunbar684de632010-04-22 16:14:54 +00001941 // Do not respect the alignment of bit-field types when laying out
1942 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1943 UseBitFieldTypeAlignment = false;
1944
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001945 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00001946 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1947 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001948 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 +00001949 "i64:32:64-f32:32:32-f64:32:64-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001950 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001951 } else {
1952 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 +00001953 "i64:32:64-f32:32:32-f64:32:64-"
1954 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001955 }
1956
Daniel Dunbara2a41612009-09-14 00:02:24 +00001957 // FIXME: Override "preferred align" for double and long long.
1958 } else if (Name == "aapcs") {
1959 // FIXME: Enumerated types are variable width in straight AAPCS.
1960 } else if (Name == "aapcs-linux") {
1961 ;
1962 } else
1963 return false;
1964
1965 return true;
1966 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001967
Daniel Dunbara91320b2009-12-21 23:28:17 +00001968 void getDefaultFeatures(const std::string &CPU,
1969 llvm::StringMap<bool> &Features) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001970 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1971 Features["vfp2"] = true;
1972 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1973 Features["neon"] = true;
1974 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00001975
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001976 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1977 const std::string &Name,
1978 bool Enabled) const {
Evan Chengf972b262011-07-08 06:40:11 +00001979 if (Name == "soft-float" || Name == "soft-float-abi" ||
1980 Name == "vfp2" || Name == "vfp3" || Name == "neon") {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001981 Features[Name] = Enabled;
1982 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001983 return false;
1984
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001985 return true;
1986 }
1987
1988 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001989 FPU = NoFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001990 SoftFloat = SoftFloatABI = false;
1991 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1992 if (Features[i] == "+soft-float")
1993 SoftFloat = true;
1994 else if (Features[i] == "+soft-float-abi")
1995 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001996 else if (Features[i] == "+vfp2")
1997 FPU = VFP2FPU;
1998 else if (Features[i] == "+vfp3")
1999 FPU = VFP3FPU;
2000 else if (Features[i] == "+neon")
2001 FPU = NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002002 }
2003
2004 // Remove front-end specific options which the backend handles differently.
2005 std::vector<std::string>::iterator it;
2006 it = std::find(Features.begin(), Features.end(), "+soft-float");
2007 if (it != Features.end())
2008 Features.erase(it);
2009 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2010 if (it != Features.end())
2011 Features.erase(it);
2012 }
2013
Daniel Dunbareac7c532009-12-18 18:42:37 +00002014 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
2015 return llvm::StringSwitch<const char*>(Name)
2016 .Cases("arm8", "arm810", "4")
2017 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2018 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2019 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2020 .Case("ep9312", "4T")
2021 .Cases("arm10tdmi", "arm1020t", "5T")
2022 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2023 .Case("arm926ej-s", "5TEJ")
2024 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2025 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002026 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002027 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002028 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002029 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2030 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson06f45632011-01-06 16:57:20 +00002031 .Case("cortex-m3", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00002032 .Case("cortex-m0", "6M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002033 .Default(0);
2034 }
2035 virtual bool setCPU(const std::string &Name) {
2036 if (!getCPUDefineSuffix(Name))
2037 return false;
2038
2039 CPU = Name;
2040 return true;
2041 }
Chris Lattner33328642009-03-20 15:52:06 +00002042 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002043 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00002044 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00002045 Builder.defineMacro("__arm");
2046 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002047
Chris Lattnerc0f59212009-03-02 22:27:17 +00002048 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00002049 Builder.defineMacro("__ARMEL__");
2050 Builder.defineMacro("__LITTLE_ENDIAN__");
2051 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002052
2053 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00002054 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002055
Mike Stump437bb4b2009-04-08 02:07:04 +00002056 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002057
Daniel Dunbareac7c532009-12-18 18:42:37 +00002058 // FIXME: It's more complicated than this and we don't really support
2059 // interworking.
2060 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00002061 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002062
Daniel Dunbareac7c532009-12-18 18:42:37 +00002063 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramera9992772010-01-09 17:55:51 +00002064 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002065
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002066 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00002067 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002068
2069 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00002070 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002071
Bob Wilson84f95cf2011-05-13 18:56:03 +00002072 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002073 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00002074 Builder.defineMacro("__THUMBEL__");
2075 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00002076 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002077 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002078 }
2079
2080 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00002081 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002082
2083 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramera9992772010-01-09 17:55:51 +00002084 Builder.defineMacro("__VFP_FP__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002085
2086 // This only gets set when Neon instructions are actually available, unlike
2087 // the VFP define, hence the soft float and arch check. This is subtly
2088 // different from gcc, we follow the intent which was that it should be set
2089 // when Neon instructions are actually available.
Bob Wilson84f95cf2011-05-13 18:56:03 +00002090 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002091 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00002092 }
2093 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2094 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00002095 Records = BuiltinInfo;
2096 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00002097 }
2098 virtual const char *getVAListDeclaration() const {
John McCall0e9972c2011-05-09 02:19:37 +00002099 return "typedef void* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +00002100 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002101 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002102 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002103 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002104 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002105 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002106 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002107 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002108 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00002109 default:
Nate Begemanad487f42008-04-22 05:03:19 +00002110 case 'l': // r0-r7
2111 case 'h': // r8-r15
2112 case 'w': // VFP Floating point register single precision
2113 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00002114 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00002115 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00002116 case 'U': // a memory reference...
2117 switch (Name[1]) {
2118 case 'q': // ...ARMV4 ldrsb
2119 case 'v': // ...VFP load/store (reg+constant offset)
2120 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00002121 case 't': // address valid for load/store opaque types wider
2122 // than 128-bits
2123 case 'n': // valid address for Neon doubleword vector load/store
2124 case 'm': // valid address for Neon element and structure load/store
2125 case 's': // valid address for non-offset loads/stores of quad-word
2126 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00002127 Info.setAllowsMemory();
2128 Name++;
2129 return true;
2130 }
Nate Begemanad487f42008-04-22 05:03:19 +00002131 }
Chris Lattner393ff042008-04-21 18:56:49 +00002132 return false;
2133 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00002134 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00002135 std::string R;
2136 switch (*Constraint) {
2137 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00002138 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00002139 Constraint++;
2140 break;
Eric Christopher283f4472011-06-17 00:40:18 +00002141 case 'p': // 'p' should be translated to 'r' by default.
2142 R = std::string("r");
2143 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00002144 default:
2145 return std::string(1, *Constraint);
2146 }
2147 return R;
2148 }
Chris Lattner393ff042008-04-21 18:56:49 +00002149 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002150 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00002151 return "";
2152 }
2153};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002154
2155const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002156 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002157 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002158 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2159
2160 // Float registers
2161 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2162 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2163 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002164 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002165
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002166 // Double registers
2167 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2168 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00002169 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2170 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002171
2172 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00002173 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2174 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002175};
2176
2177void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002178 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002179 Names = GCCRegNames;
2180 NumNames = llvm::array_lengthof(GCCRegNames);
2181}
2182
2183const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002184 { { "a1" }, "r0" },
2185 { { "a2" }, "r1" },
2186 { { "a3" }, "r2" },
2187 { { "a4" }, "r3" },
2188 { { "v1" }, "r4" },
2189 { { "v2" }, "r5" },
2190 { { "v3" }, "r6" },
2191 { { "v4" }, "r7" },
2192 { { "v5" }, "r8" },
2193 { { "v6", "rfp" }, "r9" },
2194 { { "sl" }, "r10" },
2195 { { "fp" }, "r11" },
2196 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002197 { { "r13" }, "sp" },
2198 { { "r14" }, "lr" },
2199 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002200 // The S, D and Q registers overlap, but aren't really aliases; we
2201 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002202};
2203
2204void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2205 unsigned &NumAliases) const {
2206 Aliases = GCCRegAliases;
2207 NumAliases = llvm::array_lengthof(GCCRegAliases);
2208}
Chris Lattner2752c012010-03-03 19:03:45 +00002209
2210const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00002211#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00002212#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00002213 ALL_LANGUAGES },
Chris Lattner2752c012010-03-03 19:03:45 +00002214#include "clang/Basic/BuiltinsARM.def"
2215};
Chris Lattner393ff042008-04-21 18:56:49 +00002216} // end anonymous namespace.
2217
Eli Friedmana9f54962008-08-20 07:44:10 +00002218
2219namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00002220class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002221 public DarwinTargetInfo<ARMTargetInfo> {
2222protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00002223 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00002224 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00002225 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00002226 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002227
Torok Edwin5f6c1942009-06-30 17:10:35 +00002228public:
Mike Stump1eb44332009-09-09 15:08:12 +00002229 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002230 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2231 HasAlignMac68kSupport = true;
2232 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002233};
2234} // end anonymous namespace.
2235
Reid Spencer5f016e22007-07-11 17:01:13 +00002236namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00002237class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00002238 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2239 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002240 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00002241public:
Eli Friedman01b86682008-08-20 07:28:14 +00002242 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2243 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00002244 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 +00002245 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00002246 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002247 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2248 const std::string &Name,
2249 bool Enabled) const {
2250 if (Name == "soft-float")
2251 Features[Name] = Enabled;
2252 else
2253 return false;
2254
2255 return true;
2256 }
2257 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2258 SoftFloat = false;
2259 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2260 if (Features[i] == "+soft-float")
2261 SoftFloat = true;
2262 }
Chris Lattner33328642009-03-20 15:52:06 +00002263 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002264 MacroBuilder &Builder) const {
2265 DefineStd(Builder, "sparc", Opts);
2266 Builder.defineMacro("__sparcv8");
2267 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002268
2269 if (SoftFloat)
2270 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00002271 }
2272 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2273 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002274 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00002275 }
2276 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002277 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00002278 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002279 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002280 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002281 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002282 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002283 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00002284 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002285 // FIXME: Implement!
2286 return false;
Gabor Greif26658672008-02-21 16:29:08 +00002287 }
2288 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002289 // FIXME: Implement!
2290 return "";
Gabor Greif26658672008-02-21 16:29:08 +00002291 }
2292};
2293
Chris Lattnere957f532009-01-27 01:58:38 +00002294const char * const SparcV8TargetInfo::GCCRegNames[] = {
2295 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2296 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2297 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2298 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2299};
2300
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002301void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002302 unsigned &NumNames) const {
2303 Names = GCCRegNames;
2304 NumNames = llvm::array_lengthof(GCCRegNames);
2305}
2306
2307const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002308 { { "g0" }, "r0" },
2309 { { "g1" }, "r1" },
2310 { { "g2" }, "r2" },
2311 { { "g3" }, "r3" },
2312 { { "g4" }, "r4" },
2313 { { "g5" }, "r5" },
2314 { { "g6" }, "r6" },
2315 { { "g7" }, "r7" },
2316 { { "o0" }, "r8" },
2317 { { "o1" }, "r9" },
2318 { { "o2" }, "r10" },
2319 { { "o3" }, "r11" },
2320 { { "o4" }, "r12" },
2321 { { "o5" }, "r13" },
2322 { { "o6", "sp" }, "r14" },
2323 { { "o7" }, "r15" },
2324 { { "l0" }, "r16" },
2325 { { "l1" }, "r17" },
2326 { { "l2" }, "r18" },
2327 { { "l3" }, "r19" },
2328 { { "l4" }, "r20" },
2329 { { "l5" }, "r21" },
2330 { { "l6" }, "r22" },
2331 { { "l7" }, "r23" },
2332 { { "i0" }, "r24" },
2333 { { "i1" }, "r25" },
2334 { { "i2" }, "r26" },
2335 { { "i3" }, "r27" },
2336 { { "i4" }, "r28" },
2337 { { "i5" }, "r29" },
2338 { { "i6", "fp" }, "r30" },
2339 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00002340};
2341
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002342void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002343 unsigned &NumAliases) const {
2344 Aliases = GCCRegAliases;
2345 NumAliases = llvm::array_lengthof(GCCRegAliases);
2346}
Gabor Greif26658672008-02-21 16:29:08 +00002347} // end anonymous namespace.
2348
Eli Friedman01b86682008-08-20 07:28:14 +00002349namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002350class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2351public:
2352 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2353 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2354 SizeType = UnsignedInt;
2355 PtrDiffType = SignedInt;
2356 }
2357};
Torok Edwin5f6c1942009-06-30 17:10:35 +00002358class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00002359public:
2360 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002361 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00002362 SizeType = UnsignedInt;
2363 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00002364 }
2365};
2366} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00002367
Chris Lattner2621fd12008-05-08 05:58:21 +00002368namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002369 class MSP430TargetInfo : public TargetInfo {
2370 static const char * const GCCRegNames[];
2371 public:
2372 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2373 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00002374 IntWidth = 16; IntAlign = 16;
2375 LongWidth = 32; LongLongWidth = 64;
2376 LongAlign = LongLongAlign = 16;
2377 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002378 SizeType = UnsignedInt;
2379 IntMaxType = SignedLong;
2380 UIntMaxType = UnsignedLong;
2381 IntPtrType = SignedShort;
2382 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00002383 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00002384 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002385 }
2386 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002387 MacroBuilder &Builder) const {
2388 Builder.defineMacro("MSP430");
2389 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002390 // FIXME: defines for different 'flavours' of MCU
2391 }
2392 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2393 unsigned &NumRecords) const {
2394 // FIXME: Implement.
2395 Records = 0;
2396 NumRecords = 0;
2397 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002398 virtual void getGCCRegNames(const char * const *&Names,
2399 unsigned &NumNames) const;
2400 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2401 unsigned &NumAliases) const {
2402 // No aliases.
2403 Aliases = 0;
2404 NumAliases = 0;
2405 }
2406 virtual bool validateAsmConstraint(const char *&Name,
2407 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00002408 // No target constraints for now.
2409 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002410 }
2411 virtual const char *getClobbers() const {
2412 // FIXME: Is this really right?
2413 return "";
2414 }
2415 virtual const char *getVAListDeclaration() const {
2416 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00002417 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002418 }
2419 };
2420
2421 const char * const MSP430TargetInfo::GCCRegNames[] = {
2422 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2423 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2424 };
2425
2426 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2427 unsigned &NumNames) const {
2428 Names = GCCRegNames;
2429 NumNames = llvm::array_lengthof(GCCRegNames);
2430 }
2431}
2432
2433
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002434namespace {
2435 class SystemZTargetInfo : public TargetInfo {
2436 static const char * const GCCRegNames[];
2437 public:
2438 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2439 TLSSupported = false;
2440 IntWidth = IntAlign = 32;
2441 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2442 PointerWidth = PointerAlign = 64;
Chris Lattner1932e122009-11-07 18:59:41 +00002443 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2444 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002445 }
2446 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002447 MacroBuilder &Builder) const {
2448 Builder.defineMacro("__s390__");
2449 Builder.defineMacro("__s390x__");
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002450 }
2451 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2452 unsigned &NumRecords) const {
2453 // FIXME: Implement.
2454 Records = 0;
2455 NumRecords = 0;
2456 }
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002457
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002458 virtual void getGCCRegNames(const char * const *&Names,
2459 unsigned &NumNames) const;
2460 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2461 unsigned &NumAliases) const {
2462 // No aliases.
2463 Aliases = 0;
2464 NumAliases = 0;
2465 }
2466 virtual bool validateAsmConstraint(const char *&Name,
2467 TargetInfo::ConstraintInfo &info) const {
2468 // FIXME: implement
2469 return true;
2470 }
2471 virtual const char *getClobbers() const {
2472 // FIXME: Is this really right?
2473 return "";
2474 }
2475 virtual const char *getVAListDeclaration() const {
2476 // FIXME: implement
2477 return "typedef char* __builtin_va_list;";
2478 }
2479 };
2480
2481 const char * const SystemZTargetInfo::GCCRegNames[] = {
2482 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2483 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2484 };
2485
2486 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2487 unsigned &NumNames) const {
2488 Names = GCCRegNames;
2489 NumNames = llvm::array_lengthof(GCCRegNames);
2490 }
2491}
2492
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002493namespace {
2494 class BlackfinTargetInfo : public TargetInfo {
2495 static const char * const GCCRegNames[];
2496 public:
2497 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2498 TLSSupported = false;
2499 DoubleAlign = 32;
2500 LongLongAlign = 32;
2501 LongDoubleAlign = 32;
Chris Lattner1932e122009-11-07 18:59:41 +00002502 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002503 }
2504
2505 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002506 MacroBuilder &Builder) const {
2507 DefineStd(Builder, "bfin", Opts);
2508 DefineStd(Builder, "BFIN", Opts);
2509 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002510 // FIXME: This one is really dependent on -mcpu
Benjamin Kramera9992772010-01-09 17:55:51 +00002511 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002512 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2513 }
2514
2515 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2516 unsigned &NumRecords) const {
2517 // FIXME: Implement.
2518 Records = 0;
2519 NumRecords = 0;
2520 }
2521
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002522 virtual void getGCCRegNames(const char * const *&Names,
2523 unsigned &NumNames) const;
2524
2525 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2526 unsigned &NumAliases) const {
2527 // No aliases.
2528 Aliases = 0;
2529 NumAliases = 0;
2530 }
2531
2532 virtual bool validateAsmConstraint(const char *&Name,
2533 TargetInfo::ConstraintInfo &Info) const {
2534 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2535 Info.setAllowsRegister();
2536 return true;
2537 }
2538 return false;
2539 }
2540
2541 virtual const char *getClobbers() const {
2542 return "";
2543 }
2544
2545 virtual const char *getVAListDeclaration() const {
2546 return "typedef char* __builtin_va_list;";
2547 }
2548 };
2549
2550 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2551 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2552 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2553 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2554 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2555 "a0", "a1", "cc",
2556 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2557 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2558 };
2559
2560 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2561 unsigned &NumNames) const {
2562 Names = GCCRegNames;
2563 NumNames = llvm::array_lengthof(GCCRegNames);
2564 }
2565}
2566
Eli Friedmanb63decf2009-08-19 20:47:07 +00002567namespace {
2568
Mike Stump1eb44332009-09-09 15:08:12 +00002569 // LLVM and Clang cannot be used directly to output native binaries for
2570 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00002571 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00002572 //
2573 // TCE uses the llvm bitcode as input and uses it for generating customized
2574 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00002575 // publicly available in http://tce.cs.tut.fi
2576
2577 class TCETargetInfo : public TargetInfo{
2578 public:
2579 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2580 TLSSupported = false;
2581 IntWidth = 32;
2582 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00002583 PointerWidth = 32;
2584 IntAlign = 32;
2585 LongAlign = LongLongAlign = 32;
2586 PointerAlign = 32;
2587 SizeType = UnsignedInt;
2588 IntMaxType = SignedLong;
2589 UIntMaxType = UnsignedLong;
2590 IntPtrType = SignedInt;
2591 PtrDiffType = SignedInt;
2592 FloatWidth = 32;
2593 FloatAlign = 32;
2594 DoubleWidth = 32;
2595 DoubleAlign = 32;
2596 LongDoubleWidth = 32;
2597 LongDoubleAlign = 32;
2598 FloatFormat = &llvm::APFloat::IEEEsingle;
2599 DoubleFormat = &llvm::APFloat::IEEEsingle;
2600 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00002601 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2602 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00002603 "f32:32:32-f64:32:32-v64:32:32-"
2604 "v128:32:32-a0:0:32-n32";
Eli Friedmanb63decf2009-08-19 20:47:07 +00002605 }
2606
2607 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002608 MacroBuilder &Builder) const {
2609 DefineStd(Builder, "tce", Opts);
2610 Builder.defineMacro("__TCE__");
2611 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00002612 }
2613 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2614 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00002615 virtual const char *getClobbers() const {
2616 return "";
2617 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002618 virtual const char *getVAListDeclaration() const {
2619 return "typedef void* __builtin_va_list;";
2620 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002621 virtual void getGCCRegNames(const char * const *&Names,
2622 unsigned &NumNames) const {}
2623 virtual bool validateAsmConstraint(const char *&Name,
2624 TargetInfo::ConstraintInfo &info) const {
2625 return true;
2626 }
2627 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2628 unsigned &NumAliases) const {}
2629 };
2630}
2631
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002632namespace {
2633class MipsTargetInfo : public TargetInfo {
Eric Christophered734732010-03-02 02:41:08 +00002634 std::string ABI, CPU;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002635 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2636 static const char * const GCCRegNames[];
2637public:
Eric Christophered734732010-03-02 02:41:08 +00002638 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002639 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 +00002640 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
2641 SizeType = UnsignedInt;
2642 PtrDiffType = SignedInt;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002643 }
Eric Christophered734732010-03-02 02:41:08 +00002644 virtual const char *getABI() const { return ABI.c_str(); }
2645 virtual bool setABI(const std::string &Name) {
2646
2647 if ((Name == "o32") || (Name == "eabi")) {
2648 ABI = Name;
2649 return true;
2650 } else
2651 return false;
2652 }
2653 virtual bool setCPU(const std::string &Name) {
2654 CPU = Name;
2655 return true;
2656 }
2657 void getDefaultFeatures(const std::string &CPU,
2658 llvm::StringMap<bool> &Features) const {
2659 Features[ABI] = true;
2660 Features[CPU] = true;
2661 }
2662 virtual void getArchDefines(const LangOptions &Opts,
2663 MacroBuilder &Builder) const {
2664 if (ABI == "o32")
2665 Builder.defineMacro("__mips_o32");
2666 else if (ABI == "eabi")
2667 Builder.defineMacro("__mips_eabi");
2668 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002669 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002670 MacroBuilder &Builder) const {
2671 DefineStd(Builder, "mips", Opts);
2672 Builder.defineMacro("_mips");
2673 DefineStd(Builder, "MIPSEB", Opts);
2674 Builder.defineMacro("_MIPSEB");
2675 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002676 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002677 }
2678 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2679 unsigned &NumRecords) const {
2680 // FIXME: Implement!
2681 }
2682 virtual const char *getVAListDeclaration() const {
2683 return "typedef void* __builtin_va_list;";
2684 }
2685 virtual void getGCCRegNames(const char * const *&Names,
2686 unsigned &NumNames) const;
2687 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2688 unsigned &NumAliases) const;
2689 virtual bool validateAsmConstraint(const char *&Name,
2690 TargetInfo::ConstraintInfo &Info) const {
2691 switch (*Name) {
2692 default:
2693 case 'r': // CPU registers.
2694 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2695 case 'y': // Equivalent to "r", backwards compatibility only.
2696 case 'f': // floating-point registers.
2697 Info.setAllowsRegister();
2698 return true;
2699 }
2700 return false;
2701 }
2702
2703 virtual const char *getClobbers() const {
2704 // FIXME: Implement!
2705 return "";
2706 }
2707};
2708
2709const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer20249a12010-10-21 03:16:25 +00002710 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002711 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2712 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2713 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2714 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2715 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2716 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2717 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2718 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2719 "$fcc5","$fcc6","$fcc7"
2720};
2721
2722void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2723 unsigned &NumNames) const {
2724 Names = GCCRegNames;
2725 NumNames = llvm::array_lengthof(GCCRegNames);
2726}
2727
2728const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2729 { { "at" }, "$1" },
2730 { { "v0" }, "$2" },
2731 { { "v1" }, "$3" },
2732 { { "a0" }, "$4" },
2733 { { "a1" }, "$5" },
2734 { { "a2" }, "$6" },
2735 { { "a3" }, "$7" },
2736 { { "t0" }, "$8" },
2737 { { "t1" }, "$9" },
2738 { { "t2" }, "$10" },
2739 { { "t3" }, "$11" },
2740 { { "t4" }, "$12" },
2741 { { "t5" }, "$13" },
2742 { { "t6" }, "$14" },
2743 { { "t7" }, "$15" },
2744 { { "s0" }, "$16" },
2745 { { "s1" }, "$17" },
2746 { { "s2" }, "$18" },
2747 { { "s3" }, "$19" },
2748 { { "s4" }, "$20" },
2749 { { "s5" }, "$21" },
2750 { { "s6" }, "$22" },
2751 { { "s7" }, "$23" },
2752 { { "t8" }, "$24" },
2753 { { "t9" }, "$25" },
2754 { { "k0" }, "$26" },
2755 { { "k1" }, "$27" },
2756 { { "gp" }, "$28" },
2757 { { "sp" }, "$29" },
2758 { { "fp" }, "$30" },
2759 { { "ra" }, "$31" }
2760};
2761
2762void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2763 unsigned &NumAliases) const {
2764 Aliases = GCCRegAliases;
2765 NumAliases = llvm::array_lengthof(GCCRegAliases);
2766}
2767} // end anonymous namespace.
2768
2769namespace {
2770class MipselTargetInfo : public MipsTargetInfo {
2771public:
2772 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2773 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 +00002774 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002775 }
2776
2777 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002778 MacroBuilder &Builder) const;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002779};
2780
2781void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002782 MacroBuilder &Builder) const {
2783 DefineStd(Builder, "mips", Opts);
2784 Builder.defineMacro("_mips");
2785 DefineStd(Builder, "MIPSEL", Opts);
2786 Builder.defineMacro("_MIPSEL");
2787 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002788 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002789}
2790} // end anonymous namespace.
2791
Reid Spencer5f016e22007-07-11 17:01:13 +00002792//===----------------------------------------------------------------------===//
2793// Driver code
2794//===----------------------------------------------------------------------===//
2795
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002796static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002797 llvm::Triple Triple(T);
2798 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00002799
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002800 switch (Triple.getArch()) {
2801 default:
2802 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00002803
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002804 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00002805 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002806 if (Triple.isOSDarwin())
2807 return new DarwinARMTargetInfo(T);
2808
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002809 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00002810 case llvm::Triple::Linux:
2811 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002812 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002813 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002814 case llvm::Triple::NetBSD:
2815 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Douglas Gregordca52262011-07-01 22:41:14 +00002816 case llvm::Triple::RTEMS:
2817 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002818 default:
2819 return new ARMTargetInfo(T);
2820 }
Eli Friedman61538a72008-05-20 14:21:01 +00002821
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002822 case llvm::Triple::bfin:
Douglas Gregordca52262011-07-01 22:41:14 +00002823 if ( os == llvm::Triple::RTEMS )
2824 return new RTEMSTargetInfo<BlackfinTargetInfo>(T);
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002825 return new BlackfinTargetInfo(T);
2826
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002827 case llvm::Triple::msp430:
2828 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00002829
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002830 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00002831 switch (os) {
2832 case llvm::Triple::Psp:
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002833 return new PSPTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00002834 case llvm::Triple::Linux:
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002835 return new LinuxTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00002836 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00002837 return new RTEMSTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00002838 case llvm::Triple::FreeBSD:
Joerg Sonnenberger8e627062011-07-07 17:01:45 +00002839 return new FreeBSDTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00002840 case llvm::Triple::NetBSD:
2841 return new NetBSDTargetInfo<MipsTargetInfo>(T);
2842 default:
2843 return new MipsTargetInfo(T);
2844 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002845
2846 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00002847 switch (os) {
2848 case llvm::Triple::Psp:
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002849 return new PSPTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00002850 case llvm::Triple::Linux:
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002851 return new LinuxTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00002852 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00002853 return new RTEMSTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00002854 case llvm::Triple::FreeBSD:
Joerg Sonnenbergercaf01c52011-07-06 11:00:56 +00002855 return new FreeBSDTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00002856 case llvm::Triple::NetBSD:
2857 return new NetBSDTargetInfo<MipselTargetInfo>(T);
2858 default:
2859 return new MipsTargetInfo(T);
2860 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002861
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002862 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002863 if (Triple.isOSDarwin())
Roman Divackyc81f2a22011-01-06 08:27:10 +00002864 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002865 switch (os) {
2866 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00002867 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002868 case llvm::Triple::NetBSD:
2869 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
2870 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00002871 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002872 default:
2873 return new PPC32TargetInfo(T);
2874 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002875
2876 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002877 if (Triple.isOSDarwin())
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00002878 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002879 switch (os) {
2880 case llvm::Triple::Lv2:
John Thompson3f6918a2009-11-19 17:18:50 +00002881 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002882 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00002883 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002884 case llvm::Triple::NetBSD:
2885 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
2886 default:
2887 return new PPC64TargetInfo(T);
2888 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002889
Justin Holewinski285dc652011-04-20 19:34:15 +00002890 case llvm::Triple::ptx32:
2891 return new PTX32TargetInfo(T);
2892 case llvm::Triple::ptx64:
2893 return new PTX64TargetInfo(T);
2894
Chris Lattner9cbeb632010-03-06 21:21:27 +00002895 case llvm::Triple::mblaze:
2896 return new MBlazeTargetInfo(T);
2897
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002898 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002899 switch (os) {
2900 case llvm::Triple::AuroraUX:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002901 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002902 case llvm::Triple::Solaris:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002903 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002904 case llvm::Triple::NetBSD:
2905 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
2906 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00002907 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002908 default:
2909 return new SparcV8TargetInfo(T);
2910 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002911
John Thompson3f6918a2009-11-19 17:18:50 +00002912 // FIXME: Need a real SPU target.
2913 case llvm::Triple::cellspu:
2914 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2915
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002916 case llvm::Triple::systemz:
2917 return new SystemZTargetInfo(T);
2918
Eli Friedmanb63decf2009-08-19 20:47:07 +00002919 case llvm::Triple::tce:
2920 return new TCETargetInfo(T);
2921
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002922 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002923 if (Triple.isOSDarwin())
2924 return new DarwinI386TargetInfo(T);
2925
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002926 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002927 case llvm::Triple::AuroraUX:
2928 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002929 case llvm::Triple::Linux:
2930 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2931 case llvm::Triple::DragonFly:
2932 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2933 case llvm::Triple::NetBSD:
2934 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2935 case llvm::Triple::OpenBSD:
2936 return new OpenBSDI386TargetInfo(T);
2937 case llvm::Triple::FreeBSD:
2938 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00002939 case llvm::Triple::Minix:
2940 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002941 case llvm::Triple::Solaris:
2942 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2943 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002944 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002945 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002946 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002947 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00002948 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00002949 case llvm::Triple::Haiku:
2950 return new HaikuX86_32TargetInfo(T);
Douglas Gregordca52262011-07-01 22:41:14 +00002951 case llvm::Triple::RTEMS:
2952 return new RTEMSX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002953 default:
2954 return new X86_32TargetInfo(T);
2955 }
2956
2957 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002958 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
2959 return new DarwinX86_64TargetInfo(T);
2960
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002961 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002962 case llvm::Triple::AuroraUX:
2963 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002964 case llvm::Triple::Linux:
2965 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00002966 case llvm::Triple::DragonFly:
2967 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002968 case llvm::Triple::NetBSD:
2969 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2970 case llvm::Triple::OpenBSD:
2971 return new OpenBSDX86_64TargetInfo(T);
2972 case llvm::Triple::FreeBSD:
2973 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2974 case llvm::Triple::Solaris:
2975 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00002976 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002977 return new MinGWX86_64TargetInfo(T);
2978 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002979 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002980 default:
2981 return new X86_64TargetInfo(T);
2982 }
2983 }
Reid Spencer5f016e22007-07-11 17:01:13 +00002984}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002985
2986/// CreateTargetInfo - Return the target info object for the specified target
2987/// triple.
2988TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002989 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002990 llvm::Triple Triple(Opts.Triple);
2991
2992 // Construct the target
2993 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2994 if (!Target) {
2995 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2996 return 0;
2997 }
2998
Daniel Dunbareac7c532009-12-18 18:42:37 +00002999 // Set the target CPU if specified.
3000 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
3001 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
3002 return 0;
3003 }
3004
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003005 // Set the target ABI if specified.
3006 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
3007 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
3008 return 0;
3009 }
3010
Charles Davis98b7c5c2010-06-11 01:06:47 +00003011 // Set the target C++ ABI.
John McCallee79a4c2010-08-21 22:46:04 +00003012 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis98b7c5c2010-06-11 01:06:47 +00003013 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
3014 return 0;
3015 }
3016
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003017 // Compute the default target features, we need the target to handle this
3018 // because features may have dependencies on one another.
3019 llvm::StringMap<bool> Features;
3020 Target->getDefaultFeatures(Opts.CPU, Features);
3021
3022 // Apply the user specified deltas.
3023 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
3024 ie = Opts.Features.end(); it != ie; ++it) {
3025 const char *Name = it->c_str();
3026
3027 // Apply the feature via the target.
3028 if ((Name[0] != '-' && Name[0] != '+') ||
3029 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
3030 Diags.Report(diag::err_target_invalid_feature) << Name;
3031 return 0;
3032 }
3033 }
3034
3035 // Add the features to the compile options.
3036 //
3037 // FIXME: If we are completely confident that we have the right set, we only
3038 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00003039 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003040 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
3041 ie = Features.end(); it != ie; ++it)
Daniel Dunbarb93292a2009-12-19 03:30:57 +00003042 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
3043 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003044
3045 return Target.take();
3046}