blob: 97109caf123757fb26d488f2fa9dd32a5f11f8c0 [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
Chris Lattner10d24272009-04-07 16:50:40 +000087 // __weak is always defined, for use in blocks and with objc pointers.
Benjamin Kramera9992772010-01-09 17:55:51 +000088 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000089
Chris Lattner10d24272009-04-07 16:50:40 +000090 // Darwin defines __strong even in C mode (just to nothing).
91 if (!Opts.ObjC1 || Opts.getGCMode() == LangOptions::NonGC)
Benjamin Kramera9992772010-01-09 17:55:51 +000092 Builder.defineMacro("__strong", "");
Chris Lattner10d24272009-04-07 16:50:40 +000093 else
Benjamin Kramera9992772010-01-09 17:55:51 +000094 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
Eli Friedman2de4fee2009-06-04 23:00:29 +000095
96 if (Opts.Static)
Benjamin Kramera9992772010-01-09 17:55:51 +000097 Builder.defineMacro("__STATIC__");
Eli Friedman2de4fee2009-06-04 23:00:29 +000098 else
Benjamin Kramera9992772010-01-09 17:55:51 +000099 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000100
101 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000102 Builder.defineMacro("_REENTRANT");
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000103
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000104 // Get the platform type and version number from the triple.
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000105 unsigned Maj, Min, Rev;
Mike Stump1eb44332009-09-09 15:08:12 +0000106
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000107 // If no version was given, default to to 10.4.0, for simplifying tests.
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000108 if (Triple.getOSName() == "darwin" || Triple.getOSName() == "osx") {
109 PlatformName = "macosx";
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000110 Min = Rev = 0;
111 Maj = 8;
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000112 } else {
113 // Otherwise, honor all three triple forms ("-darwinNNN[-iphoneos]",
114 // "-osxNNN", and "-iosNNN").
115
116 if (Triple.getOS() == llvm::Triple::Darwin) {
117 // For historical reasons that make little sense, the version passed here
118 // is the "darwin" version, which drops the 10 and offsets by 4.
119 Triple.getOSVersion(Maj, Min, Rev);
120
121 if (Triple.getEnvironmentName() == "iphoneos") {
122 PlatformName = "ios";
123 } else {
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000124 PlatformName = "macosx";
125 Rev = Min;
126 Min = Maj - 4;
127 Maj = 10;
128 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000129 } else {
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000130 Triple.getOSVersion(Maj, Min, Rev);
Daniel Dunbara4ff6482011-04-19 23:34:21 +0000131 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000132 }
133 }
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000134
135 // Set the appropriate OS version define.
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000136 if (PlatformName == "ios") {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000137 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000138 char Str[6];
139 Str[0] = '0' + Maj;
140 Str[1] = '0' + (Min / 10);
141 Str[2] = '0' + (Min % 10);
142 Str[3] = '0' + (Rev / 10);
143 Str[4] = '0' + (Rev % 10);
144 Str[5] = '\0';
145 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
146 } else {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000147 // Note that the Driver allows versions which aren't representable in the
148 // define (because we only get a single digit for the minor and micro
149 // revision numbers). So, we limit them to the maximum representable
150 // version.
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000151 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000152 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000153 char Str[5];
154 Str[0] = '0' + (Maj / 10);
155 Str[1] = '0' + (Maj % 10);
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000156 Str[2] = '0' + std::min(Min, 9U);
157 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000158 Str[4] = '\0';
159 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000160 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000161
162 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman618234a2008-08-20 02:34:37 +0000163}
Reid Spencer5f016e22007-07-11 17:01:13 +0000164
Chris Lattner797c3c42009-08-10 19:03:04 +0000165namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000166template<typename Target>
167class DarwinTargetInfo : public OSTargetInfo<Target> {
168protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000169 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000170 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000171 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
172 this->PlatformMinVersion);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000173 }
Mike Stump1eb44332009-09-09 15:08:12 +0000174
Torok Edwin5f6c1942009-06-30 17:10:35 +0000175public:
176 DarwinTargetInfo(const std::string& triple) :
177 OSTargetInfo<Target>(triple) {
Eric Christopherdd53ec92010-06-25 19:04:52 +0000178 this->TLSSupported = llvm::Triple(triple).getDarwinMajorNumber() > 10;
Daniel Dunbare177d3b2011-02-21 23:12:51 +0000179 this->MCountName = "\01mcount";
Torok Edwin5f6c1942009-06-30 17:10:35 +0000180 }
181
Anders Carlssonf959fb52010-01-30 18:33:31 +0000182 virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
Chris Lattner797c3c42009-08-10 19:03:04 +0000183 // Let MCSectionMachO validate this.
184 llvm::StringRef Segment, Section;
185 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000186 bool HasTAA;
Chris Lattner797c3c42009-08-10 19:03:04 +0000187 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000188 TAA, HasTAA, StubSize);
Chris Lattner797c3c42009-08-10 19:03:04 +0000189 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000190
Anders Carlsson18af3682010-06-08 22:47:50 +0000191 virtual const char *getStaticInitSectionSpecifier() const {
192 // FIXME: We should return 0 when building kexts.
193 return "__TEXT,__StaticInit,regular,pure_instructions";
194 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000195
Torok Edwin5f6c1942009-06-30 17:10:35 +0000196};
197
Chris Lattner797c3c42009-08-10 19:03:04 +0000198
Torok Edwin5f6c1942009-06-30 17:10:35 +0000199// DragonFlyBSD Target
200template<typename Target>
201class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
202protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000203 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000204 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000205 // DragonFly defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000206 Builder.defineMacro("__DragonFly__");
207 Builder.defineMacro("__DragonFly_cc_version", "100001");
208 Builder.defineMacro("__ELF__");
209 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
210 Builder.defineMacro("__tune_i386__");
211 DefineStd(Builder, "unix", Opts);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000212 }
213public:
Mike Stump1eb44332009-09-09 15:08:12 +0000214 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000215 : OSTargetInfo<Target>(triple) {}
216};
217
218// FreeBSD Target
219template<typename Target>
220class FreeBSDTargetInfo : public OSTargetInfo<Target> {
221protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000222 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000223 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000224 // FreeBSD defines; list based off of gcc output
225
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000226 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramer3bb65302010-01-30 19:55:01 +0000227 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000228
Benjamin Kramer3bb65302010-01-30 19:55:01 +0000229 Builder.defineMacro("__FreeBSD__", Release);
230 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramera9992772010-01-09 17:55:51 +0000231 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
232 DefineStd(Builder, "unix", Opts);
233 Builder.defineMacro("__ELF__");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000234 }
235public:
Mike Stump1eb44332009-09-09 15:08:12 +0000236 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands1e90faf2009-07-08 13:55:08 +0000237 : OSTargetInfo<Target>(triple) {
238 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000239
240 llvm::Triple Triple(triple);
241 switch (Triple.getArch()) {
242 default:
243 case llvm::Triple::x86:
244 case llvm::Triple::x86_64:
245 this->MCountName = ".mcount";
246 break;
247 case llvm::Triple::mips:
248 case llvm::Triple::mipsel:
249 case llvm::Triple::ppc:
250 case llvm::Triple::ppc64:
251 this->MCountName = "_mcount";
252 break;
253 case llvm::Triple::arm:
254 this->MCountName = "__mcount";
255 break;
256 }
257
Duncan Sands1e90faf2009-07-08 13:55:08 +0000258 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000259};
260
Chris Lattner38e317d2010-07-07 16:01:42 +0000261// Minix Target
262template<typename Target>
263class MinixTargetInfo : public OSTargetInfo<Target> {
264protected:
265 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
266 MacroBuilder &Builder) const {
267 // Minix defines
268
269 Builder.defineMacro("__minix", "3");
270 Builder.defineMacro("_EM_WSIZE", "4");
271 Builder.defineMacro("_EM_PSIZE", "4");
272 Builder.defineMacro("_EM_SSIZE", "2");
273 Builder.defineMacro("_EM_LSIZE", "4");
274 Builder.defineMacro("_EM_FSIZE", "4");
275 Builder.defineMacro("_EM_DSIZE", "8");
276 DefineStd(Builder, "unix", Opts);
277 }
278public:
279 MinixTargetInfo(const std::string &triple)
280 : OSTargetInfo<Target>(triple) {
281 this->UserLabelPrefix = "";
282 }
283};
284
Torok Edwin5f6c1942009-06-30 17:10:35 +0000285// Linux target
286template<typename Target>
287class LinuxTargetInfo : public OSTargetInfo<Target> {
288protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000289 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000290 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000291 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000292 DefineStd(Builder, "unix", Opts);
293 DefineStd(Builder, "linux", Opts);
294 Builder.defineMacro("__gnu_linux__");
295 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000296 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000297 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000298 if (Opts.CPlusPlus)
299 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000300 }
301public:
Mike Stump1eb44332009-09-09 15:08:12 +0000302 LinuxTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000303 : OSTargetInfo<Target>(triple) {
304 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000305 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000306 }
307};
308
Chris Lattnerb62bb282009-07-13 20:29:08 +0000309// NetBSD Target
310template<typename Target>
311class NetBSDTargetInfo : public OSTargetInfo<Target> {
312protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000313 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000314 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000315 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000316 Builder.defineMacro("__NetBSD__");
317 Builder.defineMacro("__unix__");
318 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000319 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000320 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000321 }
322public:
Mike Stump1eb44332009-09-09 15:08:12 +0000323 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerb62bb282009-07-13 20:29:08 +0000324 : OSTargetInfo<Target>(triple) {
325 this->UserLabelPrefix = "";
326 }
327};
328
Torok Edwin5f6c1942009-06-30 17:10:35 +0000329// OpenBSD Target
330template<typename Target>
331class OpenBSDTargetInfo : public OSTargetInfo<Target> {
332protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000333 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000334 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000335 // OpenBSD defines; list based off of gcc output
336
Benjamin Kramera9992772010-01-09 17:55:51 +0000337 Builder.defineMacro("__OpenBSD__");
338 DefineStd(Builder, "unix", Opts);
339 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000340 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000341 Builder.defineMacro("_POSIX_THREADS");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000342 }
343public:
Mike Stump1eb44332009-09-09 15:08:12 +0000344 OpenBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000345 : OSTargetInfo<Target>(triple) {}
346};
347
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000348// PSP Target
349template<typename Target>
350class PSPTargetInfo : public OSTargetInfo<Target> {
351protected:
352 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000353 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000354 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000355 Builder.defineMacro("PSP");
356 Builder.defineMacro("_PSP");
357 Builder.defineMacro("__psp__");
358 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000359 }
360public:
361 PSPTargetInfo(const std::string& triple)
362 : OSTargetInfo<Target>(triple) {
363 this->UserLabelPrefix = "";
364 }
365};
366
John Thompson3f6918a2009-11-19 17:18:50 +0000367// PS3 PPU Target
368template<typename Target>
369class PS3PPUTargetInfo : public OSTargetInfo<Target> {
370protected:
371 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000372 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000373 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000374 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000375 Builder.defineMacro("__PPU__");
376 Builder.defineMacro("__CELLOS_LV2__");
377 Builder.defineMacro("__ELF__");
378 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000379 Builder.defineMacro("_ARCH_PPC64");
380 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000381 }
382public:
383 PS3PPUTargetInfo(const std::string& triple)
384 : OSTargetInfo<Target>(triple) {
385 this->UserLabelPrefix = "";
John Thompsonec387af2009-12-18 14:21:08 +0000386 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000387 this->IntMaxType = TargetInfo::SignedLongLong;
388 this->UIntMaxType = TargetInfo::UnsignedLongLong;
389 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000390 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000391 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
392 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000393 }
394};
395
396// FIXME: Need a real SPU target.
397// PS3 SPU Target
398template<typename Target>
399class PS3SPUTargetInfo : public OSTargetInfo<Target> {
400protected:
401 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000402 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000403 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000404 Builder.defineMacro("__SPU__");
405 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000406 }
407public:
408 PS3SPUTargetInfo(const std::string& triple)
409 : OSTargetInfo<Target>(triple) {
410 this->UserLabelPrefix = "";
411 }
412};
413
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000414// AuroraUX target
415template<typename Target>
416class AuroraUXTargetInfo : public OSTargetInfo<Target> {
417protected:
418 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000419 MacroBuilder &Builder) const {
420 DefineStd(Builder, "sun", Opts);
421 DefineStd(Builder, "unix", Opts);
422 Builder.defineMacro("__ELF__");
423 Builder.defineMacro("__svr4__");
424 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000425 }
426public:
427 AuroraUXTargetInfo(const std::string& triple)
428 : OSTargetInfo<Target>(triple) {
429 this->UserLabelPrefix = "";
430 this->WCharType = this->SignedLong;
431 // FIXME: WIntType should be SignedLong
432 }
433};
434
Torok Edwin5f6c1942009-06-30 17:10:35 +0000435// Solaris target
436template<typename Target>
437class SolarisTargetInfo : public OSTargetInfo<Target> {
438protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000439 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000440 MacroBuilder &Builder) const {
441 DefineStd(Builder, "sun", Opts);
442 DefineStd(Builder, "unix", Opts);
443 Builder.defineMacro("__ELF__");
444 Builder.defineMacro("__svr4__");
445 Builder.defineMacro("__SVR4");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000446 }
447public:
Mike Stump1eb44332009-09-09 15:08:12 +0000448 SolarisTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000449 : OSTargetInfo<Target>(triple) {
450 this->UserLabelPrefix = "";
451 this->WCharType = this->SignedLong;
452 // FIXME: WIntType should be SignedLong
453 }
454};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000455
456// Windows target
457template<typename Target>
458class WindowsTargetInfo : public OSTargetInfo<Target> {
459protected:
460 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
461 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000462 Builder.defineMacro("_WIN32");
463 }
464 void getVisualStudioDefines(const LangOptions &Opts,
465 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000466 if (Opts.CPlusPlus) {
467 if (Opts.RTTI)
468 Builder.defineMacro("_CPPRTTI");
469
470 if (Opts.Exceptions)
471 Builder.defineMacro("_CPPUNWIND");
472 }
473
474 if (!Opts.CharIsSigned)
475 Builder.defineMacro("_CHAR_UNSIGNED");
476
477 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
478 // but it works for now.
479 if (Opts.POSIXThreads)
480 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000481
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000482 if (Opts.MSCVersion != 0)
483 Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
484
485 if (Opts.Microsoft) {
486 Builder.defineMacro("_MSC_EXTENSIONS");
487
488 if (Opts.CPlusPlus0x) {
489 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
490 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
491 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
492 }
493 }
494
495 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000496 }
497
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000498public:
499 WindowsTargetInfo(const std::string &triple)
500 : OSTargetInfo<Target>(triple) {}
501};
502
Mike Stump1eb44332009-09-09 15:08:12 +0000503} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000504
Chris Lattnerd29b6302008-10-05 21:50:58 +0000505//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000506// Specific target implementations.
507//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000508
Eli Friedmane4277982008-08-20 23:11:40 +0000509namespace {
510// PPC abstract base class
511class PPCTargetInfo : public TargetInfo {
512 static const Builtin::Info BuiltinInfo[];
513 static const char * const GCCRegNames[];
514 static const TargetInfo::GCCRegAlias GCCRegAliases[];
515
516public:
Eli Friedman15b91762009-06-05 07:05:05 +0000517 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
518
Eli Friedmane4277982008-08-20 23:11:40 +0000519 virtual void getTargetBuiltins(const Builtin::Info *&Records,
520 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000521 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000522 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000523 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000524
Chris Lattner33328642009-03-20 15:52:06 +0000525 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000526 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000527
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000528 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000529 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000530 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000531 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000532 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000533 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000534 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000535 default: return false;
536 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000537 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000538 case 'b': // Base register
539 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000540 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000541 break;
542 // FIXME: The following are added to allow parsing.
543 // I just took a guess at what the actions should be.
544 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000545 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000546 case 'v': // Altivec vector register
547 Info.setAllowsRegister();
548 break;
549 case 'w':
550 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000551 case 'd':// VSX vector register to hold vector double data
552 case 'f':// VSX vector register to hold vector float data
553 case 's':// VSX vector register to hold scalar float data
554 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000555 break;
556 default:
557 return false;
558 }
559 Info.setAllowsRegister();
560 Name++; // Skip over 'w'.
561 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000562 case 'h': // `MQ', `CTR', or `LINK' register
563 case 'q': // `MQ' register
564 case 'c': // `CTR' register
565 case 'l': // `LINK' register
566 case 'x': // `CR' register (condition register) number 0
567 case 'y': // `CR' register (condition register)
568 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000569 Info.setAllowsRegister();
570 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000571 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000572 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000573 // (use `L' instead for SImode constants)
574 case 'K': // Unsigned 16-bit constant
575 case 'L': // Signed 16-bit constant shifted left 16 bits
576 case 'M': // Constant larger than 31
577 case 'N': // Exact power of 2
578 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000579 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000580 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000581 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000582 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000583 break;
584 case 'm': // Memory operand. Note that on PowerPC targets, m can
585 // include addresses that update the base register. It
586 // is therefore only safe to use `m' in an asm statement
587 // if that asm statement accesses the operand exactly once.
588 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000589 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000590 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000591 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000592 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000593 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
594 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000595 // register to be updated.
596 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000597 if (Name[1] != 's')
598 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000599 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000600 // include any automodification of the base register. Unlike
601 // `m', this constraint can be used in asm statements that
602 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000603 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000604 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000605 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000606 break;
607 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000608 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000609 case 'Z': // Memory operand that is an indexed or indirect from a
610 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000611 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000612 Info.setAllowsMemory();
613 Info.setAllowsRegister();
614 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000615 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000616 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000617 // register (`p' is preferable for asm statements)
618 case 'S': // Constant suitable as a 64-bit mask operand
619 case 'T': // Constant suitable as a 32-bit mask operand
620 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000621 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000622 // instructions
623 case 'W': // Vector constant that does not require memory
624 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000625 break;
626 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000627 }
John Thompson8e6065a2010-06-24 22:44:13 +0000628 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000629 }
Eli Friedmane4277982008-08-20 23:11:40 +0000630 virtual const char *getClobbers() const {
631 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000632 }
Eli Friedmane4277982008-08-20 23:11:40 +0000633};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000634
Eli Friedmane4277982008-08-20 23:11:40 +0000635const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000636#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
637#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
638 ALL_LANGUAGES, false },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000639#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000640};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000641
642
Chris Lattnerc0f59212009-03-02 22:27:17 +0000643/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
644/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000645void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000646 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000647 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000648 Builder.defineMacro("__ppc__");
649 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000650 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000651 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000652 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000653 Builder.defineMacro("_ARCH_PPC64");
654 Builder.defineMacro("_LP64");
655 Builder.defineMacro("__LP64__");
Chris Lattnere03ae302010-02-16 18:14:57 +0000656 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000657 Builder.defineMacro("__ppc64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000658 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +0000659 Builder.defineMacro("__ppc__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000660 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000661
Chris Lattnerc0f59212009-03-02 22:27:17 +0000662 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +0000663 Builder.defineMacro("_BIG_ENDIAN");
664 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000665
Chris Lattnerc0f59212009-03-02 22:27:17 +0000666 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000667 Builder.defineMacro("__NATURAL_ALIGNMENT__");
668 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000669
Chris Lattnerc0f59212009-03-02 22:27:17 +0000670 // FIXME: Should be controlled by command line option.
Benjamin Kramera9992772010-01-09 17:55:51 +0000671 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000672
John Thompson3f6918a2009-11-19 17:18:50 +0000673 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000674 Builder.defineMacro("__VEC__", "10206");
675 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000676 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000677}
678
Chris Lattner393ff042008-04-21 18:56:49 +0000679
Eli Friedmane4277982008-08-20 23:11:40 +0000680const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +0000681 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
682 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
683 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
684 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
685 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
686 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
687 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
688 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +0000689 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000690 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +0000691 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000692 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
693 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
694 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
695 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +0000696 "vrsave", "vscr",
697 "spe_acc", "spefscr",
698 "sfp"
699};
Reid Spencer5f016e22007-07-11 17:01:13 +0000700
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000701void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000702 unsigned &NumNames) const {
703 Names = GCCRegNames;
704 NumNames = llvm::array_lengthof(GCCRegNames);
705}
Reid Spencer5f016e22007-07-11 17:01:13 +0000706
Eli Friedmane4277982008-08-20 23:11:40 +0000707const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
708 // While some of these aliases do map to different registers
709 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000710 { { "0" }, "r0" },
711 { { "1"}, "r1" },
712 { { "2" }, "r2" },
713 { { "3" }, "r3" },
714 { { "4" }, "r4" },
715 { { "5" }, "r5" },
716 { { "6" }, "r6" },
717 { { "7" }, "r7" },
718 { { "8" }, "r8" },
719 { { "9" }, "r9" },
720 { { "10" }, "r10" },
721 { { "11" }, "r11" },
722 { { "12" }, "r12" },
723 { { "13" }, "r13" },
724 { { "14" }, "r14" },
725 { { "15" }, "r15" },
726 { { "16" }, "r16" },
727 { { "17" }, "r17" },
728 { { "18" }, "r18" },
729 { { "19" }, "r19" },
730 { { "20" }, "r20" },
731 { { "21" }, "r21" },
732 { { "22" }, "r22" },
733 { { "23" }, "r23" },
734 { { "24" }, "r24" },
735 { { "25" }, "r25" },
736 { { "26" }, "r26" },
737 { { "27" }, "r27" },
738 { { "28" }, "r28" },
739 { { "29" }, "r29" },
740 { { "30" }, "r30" },
741 { { "31" }, "r31" },
742 { { "fr0" }, "f0" },
743 { { "fr1" }, "f1" },
744 { { "fr2" }, "f2" },
745 { { "fr3" }, "f3" },
746 { { "fr4" }, "f4" },
747 { { "fr5" }, "f5" },
748 { { "fr6" }, "f6" },
749 { { "fr7" }, "f7" },
750 { { "fr8" }, "f8" },
751 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +0000752 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000753 { { "fr11" }, "f11" },
754 { { "fr12" }, "f12" },
755 { { "fr13" }, "f13" },
756 { { "fr14" }, "f14" },
757 { { "fr15" }, "f15" },
758 { { "fr16" }, "f16" },
759 { { "fr17" }, "f17" },
760 { { "fr18" }, "f18" },
761 { { "fr19" }, "f19" },
762 { { "fr20" }, "f20" },
763 { { "fr21" }, "f21" },
764 { { "fr22" }, "f22" },
765 { { "fr23" }, "f23" },
766 { { "fr24" }, "f24" },
767 { { "fr25" }, "f25" },
768 { { "fr26" }, "f26" },
769 { { "fr27" }, "f27" },
770 { { "fr28" }, "f28" },
771 { { "fr29" }, "f29" },
772 { { "fr30" }, "f30" },
773 { { "fr31" }, "f31" },
774 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +0000775};
776
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000777void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000778 unsigned &NumAliases) const {
779 Aliases = GCCRegAliases;
780 NumAliases = llvm::array_lengthof(GCCRegAliases);
781}
782} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +0000783
784namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000785class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000786public:
Chris Lattnere03ae302010-02-16 18:14:57 +0000787 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +0000788 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 +0000789 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +0000790
791 if (getTriple().getOS() == llvm::Triple::FreeBSD)
Roman Divackyc81f2a22011-01-06 08:27:10 +0000792 SizeType = UnsignedInt;
793 }
794
795 virtual const char *getVAListDeclaration() const {
796 // This is the ELF definition, and is overridden by the Darwin sub-target
797 return "typedef struct __va_list_tag {"
798 " unsigned char gpr;"
799 " unsigned char fpr;"
800 " unsigned short reserved;"
801 " void* overflow_arg_area;"
802 " void* reg_save_area;"
803 "} __builtin_va_list[1];";
Eli Friedmaned855cb2008-08-21 00:13:15 +0000804 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000805};
806} // end anonymous namespace.
807
808namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000809class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000810public:
Eli Friedmane4277982008-08-20 23:11:40 +0000811 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000812 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +0000813 IntMaxType = SignedLong;
814 UIntMaxType = UnsignedLong;
815 Int64Type = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000816 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 +0000817 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerf291b102008-05-09 06:17:04 +0000818 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000819 virtual const char *getVAListDeclaration() const {
820 return "typedef char* __builtin_va_list;";
821 }
Eli Friedmane4277982008-08-20 23:11:40 +0000822};
823} // end anonymous namespace.
824
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000825
826namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +0000827class DarwinPPC32TargetInfo :
828 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000829public:
Roman Divackyc81f2a22011-01-06 08:27:10 +0000830 DarwinPPC32TargetInfo(const std::string& triple)
831 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000832 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +0000833 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
834 }
835 virtual const char *getVAListDeclaration() const {
836 return "typedef char* __builtin_va_list;";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000837 }
838};
839
840class DarwinPPC64TargetInfo :
841 public DarwinTargetInfo<PPC64TargetInfo> {
842public:
843 DarwinPPC64TargetInfo(const std::string& triple)
844 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
845 HasAlignMac68kSupport = true;
846 }
847};
848} // end anonymous namespace.
849
Reid Spencer5f016e22007-07-11 17:01:13 +0000850namespace {
Justin Holewinski285dc652011-04-20 19:34:15 +0000851 class PTXTargetInfo : public TargetInfo {
852 static const char * const GCCRegNames[];
853 static const Builtin::Info BuiltinInfo[];
854 public:
855 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
856 TLSSupported = false;
857 LongWidth = LongAlign = 64;
858 }
859 virtual void getTargetDefines(const LangOptions &Opts,
860 MacroBuilder &Builder) const {
861 Builder.defineMacro("__PTX__");
862 }
863 virtual void getTargetBuiltins(const Builtin::Info *&Records,
864 unsigned &NumRecords) const {
865 Records = BuiltinInfo;
866 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
867 }
868
869 virtual void getGCCRegNames(const char * const *&Names,
870 unsigned &NumNames) const;
871 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
872 unsigned &NumAliases) const {
873 // No aliases.
874 Aliases = 0;
875 NumAliases = 0;
876 }
877 virtual bool validateAsmConstraint(const char *&Name,
878 TargetInfo::ConstraintInfo &info) const {
879 // FIXME: implement
880 return true;
881 }
882 virtual const char *getClobbers() const {
883 // FIXME: Is this really right?
884 return "";
885 }
886 virtual const char *getVAListDeclaration() const {
887 // FIXME: implement
888 return "typedef char* __builtin_va_list;";
889 }
890 };
891
892 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
893#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
894#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
895 ALL_LANGUAGES, false },
896#include "clang/Basic/BuiltinsPTX.def"
897 };
898
899 const char * const PTXTargetInfo::GCCRegNames[] = {
900 "r0"
901 };
902
903 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
904 unsigned &NumNames) const {
905 Names = GCCRegNames;
906 NumNames = llvm::array_lengthof(GCCRegNames);
907 }
908
909
910 class PTX32TargetInfo : public PTXTargetInfo {
911 public:
912 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
913 PointerWidth = PointerAlign = 32;
914 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
915 DescriptionString
916 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
917 }
918 };
919
920 class PTX64TargetInfo : public PTXTargetInfo {
921 public:
922 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
923 PointerWidth = PointerAlign = 64;
924 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
925 DescriptionString
926 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
927 }
928 };
929}
930
931namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +0000932// MBlaze abstract base class
933class MBlazeTargetInfo : public TargetInfo {
934 static const char * const GCCRegNames[];
935 static const TargetInfo::GCCRegAlias GCCRegAliases[];
936
937public:
938 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +0000939 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +0000940 }
941
942 virtual void getTargetBuiltins(const Builtin::Info *&Records,
943 unsigned &NumRecords) const {
944 // FIXME: Implement.
945 Records = 0;
946 NumRecords = 0;
947 }
948
949 virtual void getTargetDefines(const LangOptions &Opts,
950 MacroBuilder &Builder) const;
951
952 virtual const char *getVAListDeclaration() const {
953 return "typedef char* __builtin_va_list;";
954 }
955 virtual const char *getTargetPrefix() const {
956 return "mblaze";
957 }
958 virtual void getGCCRegNames(const char * const *&Names,
959 unsigned &NumNames) const;
960 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
961 unsigned &NumAliases) const;
962 virtual bool validateAsmConstraint(const char *&Name,
963 TargetInfo::ConstraintInfo &Info) const {
964 switch (*Name) {
965 default: return false;
966 case 'O': // Zero
967 return true;
968 case 'b': // Base register
969 case 'f': // Floating point register
970 Info.setAllowsRegister();
971 return true;
972 }
973 }
974 virtual const char *getClobbers() const {
975 return "";
976 }
977};
978
979/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
980/// #defines that are not tied to a specific subtarget.
981void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
982 MacroBuilder &Builder) const {
983 // Target identification.
984 Builder.defineMacro("__microblaze__");
985 Builder.defineMacro("_ARCH_MICROBLAZE");
986 Builder.defineMacro("__MICROBLAZE__");
987
988 // Target properties.
989 Builder.defineMacro("_BIG_ENDIAN");
990 Builder.defineMacro("__BIG_ENDIAN__");
991
992 // Subtarget options.
993 Builder.defineMacro("__REGISTER_PREFIX__", "");
994}
995
996
997const char * const MBlazeTargetInfo::GCCRegNames[] = {
998 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
999 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1000 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1001 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1002 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1003 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1004 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1005 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1006 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1007 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1008};
1009
1010void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1011 unsigned &NumNames) const {
1012 Names = GCCRegNames;
1013 NumNames = llvm::array_lengthof(GCCRegNames);
1014}
1015
1016const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1017 { {"f0"}, "r0" },
1018 { {"f1"}, "r1" },
1019 { {"f2"}, "r2" },
1020 { {"f3"}, "r3" },
1021 { {"f4"}, "r4" },
1022 { {"f5"}, "r5" },
1023 { {"f6"}, "r6" },
1024 { {"f7"}, "r7" },
1025 { {"f8"}, "r8" },
1026 { {"f9"}, "r9" },
1027 { {"f10"}, "r10" },
1028 { {"f11"}, "r11" },
1029 { {"f12"}, "r12" },
1030 { {"f13"}, "r13" },
1031 { {"f14"}, "r14" },
1032 { {"f15"}, "r15" },
1033 { {"f16"}, "r16" },
1034 { {"f17"}, "r17" },
1035 { {"f18"}, "r18" },
1036 { {"f19"}, "r19" },
1037 { {"f20"}, "r20" },
1038 { {"f21"}, "r21" },
1039 { {"f22"}, "r22" },
1040 { {"f23"}, "r23" },
1041 { {"f24"}, "r24" },
1042 { {"f25"}, "r25" },
1043 { {"f26"}, "r26" },
1044 { {"f27"}, "r27" },
1045 { {"f28"}, "r28" },
1046 { {"f29"}, "r29" },
1047 { {"f30"}, "r30" },
1048 { {"f31"}, "r31" },
1049};
1050
1051void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1052 unsigned &NumAliases) const {
1053 Aliases = GCCRegAliases;
1054 NumAliases = llvm::array_lengthof(GCCRegAliases);
1055}
1056} // end anonymous namespace.
1057
1058namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001059// Namespace for x86 abstract base class
1060const Builtin::Info BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001061#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
1062#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1063 ALL_LANGUAGES, false },
Chris Lattner6b15cdc2009-06-14 01:05:48 +00001064#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +00001065};
Eli Friedman61538a72008-05-20 14:21:01 +00001066
Nuno Lopes2550d702009-12-23 17:49:57 +00001067static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +00001068 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1069 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
1070 "argp", "flags", "fspr", "dirflag", "frame",
1071 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1072 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1073 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1074 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
1075};
1076
1077const TargetInfo::GCCRegAlias GCCRegAliases[] = {
1078 { { "al", "ah", "eax", "rax" }, "ax" },
1079 { { "bl", "bh", "ebx", "rbx" }, "bx" },
1080 { { "cl", "ch", "ecx", "rcx" }, "cx" },
1081 { { "dl", "dh", "edx", "rdx" }, "dx" },
1082 { { "esi", "rsi" }, "si" },
1083 { { "edi", "rdi" }, "di" },
1084 { { "esp", "rsp" }, "sp" },
1085 { { "ebp", "rbp" }, "bp" },
1086};
1087
1088// X86 target abstract base class; x86-32 and x86-64 are very close, so
1089// most of the implementation can be shared.
1090class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001091 enum X86SSEEnum {
1092 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
1093 } SSELevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001094 enum AMD3DNowEnum {
1095 NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
1096 } AMD3DNowLevel;
1097
Eric Christophereea12d12010-04-02 23:50:19 +00001098 bool HasAES;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001099 bool HasAVX;
1100
Eli Friedman618234a2008-08-20 02:34:37 +00001101public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001102 X86TargetInfo(const std::string& triple)
Eric Christophereea12d12010-04-02 23:50:19 +00001103 : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001104 HasAES(false), HasAVX(false) {
Eli Friedman618234a2008-08-20 02:34:37 +00001105 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001106 }
1107 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1108 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001109 Records = BuiltinInfo;
1110 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001111 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001112 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001113 unsigned &NumNames) const {
1114 Names = GCCRegNames;
1115 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001116 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001117 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001118 unsigned &NumAliases) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001119 Aliases = GCCRegAliases;
1120 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001121 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001122 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001123 TargetInfo::ConstraintInfo &info) const;
1124 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001125 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001126 return "~{dirflag},~{fpsr},~{flags}";
1127 }
Chris Lattner33328642009-03-20 15:52:06 +00001128 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001129 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001130 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1131 const std::string &Name,
1132 bool Enabled) const;
Mike Stump1eb44332009-09-09 15:08:12 +00001133 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001134 llvm::StringMap<bool> &Features) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001135 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Reid Spencer5f016e22007-07-11 17:01:13 +00001136};
Chris Lattner3daed522009-03-02 22:20:04 +00001137
Mike Stump1eb44332009-09-09 15:08:12 +00001138void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001139 llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001140 // FIXME: This should not be here.
1141 Features["3dnow"] = false;
1142 Features["3dnowa"] = false;
1143 Features["mmx"] = false;
1144 Features["sse"] = false;
1145 Features["sse2"] = false;
1146 Features["sse3"] = false;
1147 Features["ssse3"] = false;
1148 Features["sse41"] = false;
1149 Features["sse42"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001150 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001151 Features["avx"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001152
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001153 // LLVM does not currently recognize this.
1154 // Features["sse4a"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001155
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001156 // FIXME: This *really* should not be here.
1157
1158 // X86_64 always has SSE2.
1159 if (PointerWidth == 64)
1160 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1161
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001162 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1163 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1164 ;
1165 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1166 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001167 else if (CPU == "pentium3")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001168 setFeatureEnabled(Features, "sse", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001169 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001170 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001171 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001172 setFeatureEnabled(Features, "sse3", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001173 else if (CPU == "core2")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001174 setFeatureEnabled(Features, "ssse3", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001175 else if (CPU == "penryn") {
1176 setFeatureEnabled(Features, "sse4", true);
1177 Features["sse42"] = false;
1178 } else if (CPU == "atom")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001179 setFeatureEnabled(Features, "sse3", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001180 else if (CPU == "corei7") {
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001181 setFeatureEnabled(Features, "sse4", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001182 setFeatureEnabled(Features, "aes", true);
Roman Divackybcaa3b82011-04-05 20:32:44 +00001183 } else if (CPU == "sandybridge") {
1184 setFeatureEnabled(Features, "sse4", true);
1185 setFeatureEnabled(Features, "aes", true);
1186// setFeatureEnabled(Features, "avx", true);
1187 } else if (CPU == "k6" || CPU == "winchip-c6")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001188 setFeatureEnabled(Features, "mmx", true);
Mike Stump1eb44332009-09-09 15:08:12 +00001189 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001190 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
1191 setFeatureEnabled(Features, "mmx", true);
1192 setFeatureEnabled(Features, "3dnow", true);
1193 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1194 setFeatureEnabled(Features, "sse", true);
1195 setFeatureEnabled(Features, "3dnowa", true);
1196 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1197 CPU == "athlon-fx") {
Mike Stump1eb44332009-09-09 15:08:12 +00001198 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001199 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00001200 } else if (CPU == "k8-sse3") {
1201 setFeatureEnabled(Features, "sse3", true);
1202 setFeatureEnabled(Features, "3dnowa", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001203 } else if (CPU == "c3-2")
1204 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001205}
1206
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001207bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump1eb44332009-09-09 15:08:12 +00001208 const std::string &Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001209 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00001210 // FIXME: This *really* should not be here. We need some way of translating
1211 // options into llvm subtarget features.
1212 if (!Features.count(Name) &&
1213 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001214 return false;
1215
1216 if (Enabled) {
1217 if (Name == "mmx")
1218 Features["mmx"] = true;
1219 else if (Name == "sse")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001220 Features["mmx"] = Features["sse"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001221 else if (Name == "sse2")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001222 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001223 else if (Name == "sse3")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001224 Features["mmx"] = Features["sse"] = Features["sse2"] =
1225 Features["sse3"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001226 else if (Name == "ssse3")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001227 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001228 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001229 else if (Name == "sse4" || Name == "sse4.2")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001230 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001231 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001232 else if (Name == "sse4.1")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001233 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopherd39ebe22010-03-04 02:26:37 +00001234 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001235 else if (Name == "3dnow")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001236 Features["3dnowa"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001237 else if (Name == "3dnowa")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001238 Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00001239 else if (Name == "aes")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001240 Features["aes"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001241 else if (Name == "avx")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001242 Features["avx"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001243 } else {
1244 if (Name == "mmx")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001245 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] =
1246 Features["sse"] = Features["sse2"] = Features["sse3"] =
1247 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001248 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00001249 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001250 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001251 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00001252 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001253 Features["sse41"] = Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001254 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001255 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001256 Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001257 else if (Name == "ssse3")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001258 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencerb24bac92011-04-17 19:22:03 +00001259 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001260 Features["sse41"] = Features["sse42"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00001261 else if (Name == "sse4.2")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001262 Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001263 else if (Name == "3dnow")
1264 Features["3dnow"] = Features["3dnowa"] = false;
1265 else if (Name == "3dnowa")
1266 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001267 else if (Name == "aes")
1268 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001269 else if (Name == "avx")
1270 Features["avx"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001271 }
1272
1273 return true;
1274}
1275
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001276/// HandleTargetOptions - Perform initialization based on the user
1277/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001278void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001279 // Remember the maximum enabled sselevel.
1280 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1281 // Ignore disabled features.
1282 if (Features[i][0] == '-')
1283 continue;
1284
Eric Christophereea12d12010-04-02 23:50:19 +00001285 if (Features[i].substr(1) == "aes") {
1286 HasAES = true;
1287 continue;
1288 }
1289
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001290 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1291 // For now let it be enabled together with other SSE levels.
1292 if (Features[i].substr(1) == "avx") {
1293 HasAVX = true;
1294 continue;
1295 }
1296
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001297 assert(Features[i][0] == '+' && "Invalid target feature!");
1298 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1299 .Case("sse42", SSE42)
1300 .Case("sse41", SSE41)
1301 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00001302 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001303 .Case("sse2", SSE2)
1304 .Case("sse", SSE1)
1305 .Case("mmx", MMX)
1306 .Default(NoMMXSSE);
1307 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001308
1309 AMD3DNowEnum ThreeDNowLevel =
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001310 llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1311 .Case("3dnowa", AMD3DNowAthlon)
1312 .Case("3dnow", AMD3DNow)
1313 .Default(NoAMD3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001314
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001315 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001316 }
Chris Lattner3daed522009-03-02 22:20:04 +00001317}
Chris Lattnerc0f59212009-03-02 22:27:17 +00001318
1319/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1320/// that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00001321void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001322 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001323 // Target identification.
1324 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001325 Builder.defineMacro("_LP64");
1326 Builder.defineMacro("__LP64__");
1327 Builder.defineMacro("__amd64__");
1328 Builder.defineMacro("__amd64");
1329 Builder.defineMacro("__x86_64");
1330 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00001331 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00001332 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00001333 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001334
Eric Christophereea12d12010-04-02 23:50:19 +00001335 if (HasAES)
1336 Builder.defineMacro("__AES__");
1337
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001338 if (HasAVX)
1339 Builder.defineMacro("__AVX__");
1340
Chris Lattnerc0f59212009-03-02 22:27:17 +00001341 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00001342 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001343
Chris Lattnerc0f59212009-03-02 22:27:17 +00001344 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +00001345 Builder.defineMacro("__nocona");
1346 Builder.defineMacro("__nocona__");
1347 Builder.defineMacro("__tune_nocona__");
1348 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001349
Chris Lattner54175442009-04-19 17:32:33 +00001350 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1351 // functions in glibc header files that use FP Stack inline asm which the
1352 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00001353 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001354
Chris Lattner84f0ea82009-03-02 22:40:39 +00001355 // Each case falls through to the previous one here.
1356 switch (SSELevel) {
1357 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00001358 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001359 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00001360 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001361 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001362 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001363 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001364 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001365 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00001366 Builder.defineMacro("__SSE2__");
1367 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001368 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00001369 Builder.defineMacro("__SSE__");
1370 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001371 case MMX:
Benjamin Kramera9992772010-01-09 17:55:51 +00001372 Builder.defineMacro("__MMX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001373 case NoMMXSSE:
1374 break;
1375 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001376
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001377 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001378 switch (SSELevel) {
Michael J. Spencera764e832010-10-21 08:22:51 +00001379 case SSE42:
1380 case SSE41:
1381 case SSSE3:
1382 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001383 case SSE2:
1384 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1385 break;
1386 case SSE1:
1387 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1388 break;
1389 default:
1390 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1391 }
1392 }
1393
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001394 // Each case falls through to the previous one here.
1395 switch (AMD3DNowLevel) {
1396 case AMD3DNowAthlon:
1397 Builder.defineMacro("__3dNOW_A__");
1398 case AMD3DNow:
1399 Builder.defineMacro("__3dNOW__");
1400 case NoAMD3DNow:
1401 break;
1402 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00001403}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001404
1405
Eli Friedman618234a2008-08-20 02:34:37 +00001406bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001407X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00001408 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001409 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00001410 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00001411 case 'Y': // first letter of a pair:
1412 switch (*(Name+1)) {
1413 default: return false;
1414 case '0': // First SSE register.
1415 case 't': // Any SSE register, when SSE2 is enabled.
1416 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1417 case 'm': // any MMX register, when inter-unit moves enabled.
1418 break; // falls through to setAllowsRegister.
1419 }
Eli Friedman618234a2008-08-20 02:34:37 +00001420 case 'a': // eax.
1421 case 'b': // ebx.
1422 case 'c': // ecx.
1423 case 'd': // edx.
1424 case 'S': // esi.
1425 case 'D': // edi.
1426 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00001427 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00001428 case 't': // top of floating point stack.
1429 case 'u': // second from top of floating point stack.
1430 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00001431 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00001432 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00001433 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00001434 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1435 case 'l': // "Index" registers: any general register that can be used as an
1436 // index in a base+index memory access.
1437 Info.setAllowsRegister();
1438 return true;
1439 case 'C': // SSE floating point constant.
1440 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001441 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001442 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001443 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001444 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00001445 return true;
1446 }
Dale Johannesen545be512010-08-24 22:33:12 +00001447 return false;
Eli Friedman618234a2008-08-20 02:34:37 +00001448}
1449
Dale Johannesenf6e2c202010-10-29 23:12:32 +00001450
Eli Friedman618234a2008-08-20 02:34:37 +00001451std::string
1452X86TargetInfo::convertConstraint(const char Constraint) const {
1453 switch (Constraint) {
1454 case 'a': return std::string("{ax}");
1455 case 'b': return std::string("{bx}");
1456 case 'c': return std::string("{cx}");
1457 case 'd': return std::string("{dx}");
1458 case 'S': return std::string("{si}");
1459 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00001460 case 'p': // address
1461 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00001462 case 't': // top of floating point stack.
1463 return std::string("{st}");
1464 case 'u': // second from top of floating point stack.
1465 return std::string("{st(1)}"); // second from top of floating point stack.
1466 default:
1467 return std::string(1, Constraint);
1468 }
1469}
Eli Friedman618234a2008-08-20 02:34:37 +00001470} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00001471
1472namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001473// X86-32 generic target
1474class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001475public:
Eli Friedman618234a2008-08-20 02:34:37 +00001476 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1477 DoubleAlign = LongLongAlign = 32;
1478 LongDoubleWidth = 96;
1479 LongDoubleAlign = 32;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001480 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1481 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001482 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman1afabd92009-03-29 20:31:09 +00001483 SizeType = UnsignedInt;
1484 PtrDiffType = SignedInt;
1485 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001486 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00001487
1488 // Use fpret for all types.
1489 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1490 (1 << TargetInfo::Double) |
1491 (1 << TargetInfo::LongDouble));
Eli Friedman618234a2008-08-20 02:34:37 +00001492 }
1493 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001494 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +00001495 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00001496
Chris Lattner21fb98e2009-09-23 06:06:36 +00001497 int getEHDataRegisterNumber(unsigned RegNo) const {
1498 if (RegNo == 0) return 0;
1499 if (RegNo == 1) return 2;
1500 return -1;
1501 }
Eli Friedman618234a2008-08-20 02:34:37 +00001502};
1503} // end anonymous namespace
1504
1505namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00001506class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1507public:
1508 OpenBSDI386TargetInfo(const std::string& triple) :
1509 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1510 SizeType = UnsignedLong;
1511 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00001512 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00001513 }
1514};
1515} // end anonymous namespace
1516
1517namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00001518class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00001519public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00001520 DarwinI386TargetInfo(const std::string& triple) :
1521 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00001522 LongDoubleWidth = 128;
1523 LongDoubleAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +00001524 SizeType = UnsignedLong;
1525 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001526 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1527 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001528 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbar613fd672010-05-27 00:35:16 +00001529 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00001530 }
1531
Eli Friedman618234a2008-08-20 02:34:37 +00001532};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001533} // end anonymous namespace
1534
1535namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00001536// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001537class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00001538public:
1539 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001540 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00001541 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00001542 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00001543 DoubleAlign = LongLongAlign = 64;
1544 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 +00001545 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1546 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedman29a30502008-08-21 01:40:19 +00001547 }
Michael J. Spencera764e832010-10-21 08:22:51 +00001548 virtual void getTargetDefines(const LangOptions &Opts,
1549 MacroBuilder &Builder) const {
1550 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1551 }
1552};
1553} // end anonymous namespace
1554
1555namespace {
1556
1557// x86-32 Windows Visual Studio target
1558class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1559public:
1560 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1561 : WindowsX86_32TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00001562 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00001563 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1564 }
1565 virtual void getTargetDefines(const LangOptions &Opts,
1566 MacroBuilder &Builder) const {
1567 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1568 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1569 // The value of the following reflects processor type.
1570 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1571 // We lost the original triple, so we use the default.
1572 Builder.defineMacro("_M_IX86", "600");
1573 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001574};
1575} // end anonymous namespace
1576
1577namespace {
1578// x86-32 MinGW target
1579class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1580public:
1581 MinGWX86_32TargetInfo(const std::string& triple)
1582 : WindowsX86_32TargetInfo(triple) {
1583 }
1584 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001585 MacroBuilder &Builder) const {
1586 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00001587 DefineStd(Builder, "WIN32", Opts);
1588 DefineStd(Builder, "WINNT", Opts);
1589 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00001590 Builder.defineMacro("__MSVCRT__");
1591 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00001592
1593 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1594 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1595 if (Opts.Microsoft)
1596 // Provide "as-is" __declspec.
1597 Builder.defineMacro("__declspec", "__declspec");
1598 else
1599 // Provide alias of __attribute__ like mingw32-gcc.
1600 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001601 }
1602};
1603} // end anonymous namespace
1604
1605namespace {
1606// x86-32 Cygwin target
1607class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1608public:
1609 CygwinX86_32TargetInfo(const std::string& triple)
1610 : X86_32TargetInfo(triple) {
1611 TLSSupported = false;
1612 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001613 DoubleAlign = LongLongAlign = 64;
1614 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1615 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001616 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001617 }
1618 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001619 MacroBuilder &Builder) const {
1620 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1621 Builder.defineMacro("__CYGWIN__");
1622 Builder.defineMacro("__CYGWIN32__");
1623 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00001624 if (Opts.CPlusPlus)
1625 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00001626 }
Eli Friedman29a30502008-08-21 01:40:19 +00001627};
1628} // end anonymous namespace
1629
1630namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00001631// x86-32 Haiku target
1632class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1633public:
1634 HaikuX86_32TargetInfo(const std::string& triple)
1635 : X86_32TargetInfo(triple) {
1636 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00001637 IntPtrType = SignedLong;
1638 PtrDiffType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00001639 this->UserLabelPrefix = "";
Eli Friedmana7e68452010-08-22 01:00:03 +00001640 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00001641 virtual void getTargetDefines(const LangOptions &Opts,
1642 MacroBuilder &Builder) const {
1643 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1644 Builder.defineMacro("__INTEL__");
1645 Builder.defineMacro("__HAIKU__");
1646 }
1647};
1648} // end anonymous namespace
1649
1650namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001651// x86-64 generic target
1652class X86_64TargetInfo : public X86TargetInfo {
1653public:
Chris Lattner33328642009-03-20 15:52:06 +00001654 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00001655 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00001656 LongDoubleWidth = 128;
1657 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00001658 LargeArrayMinWidth = 128;
1659 LargeArrayAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00001660 IntMaxType = SignedLong;
1661 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001662 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001663 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00001664
Eli Friedmaned855cb2008-08-21 00:13:15 +00001665 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1666 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001667 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00001668
1669 // Use fpret only for long double.
1670 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Reid Spencer5f016e22007-07-11 17:01:13 +00001671 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001672 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001673 return "typedef struct __va_list_tag {"
1674 " unsigned gp_offset;"
1675 " unsigned fp_offset;"
1676 " void* overflow_arg_area;"
1677 " void* reg_save_area;"
John McCall2b7baf02010-05-28 18:25:28 +00001678 "} __va_list_tag;"
Eli Friedmandc043162009-07-03 00:45:06 +00001679 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +00001680 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001681
Chris Lattner21fb98e2009-09-23 06:06:36 +00001682 int getEHDataRegisterNumber(unsigned RegNo) const {
1683 if (RegNo == 0) return 0;
1684 if (RegNo == 1) return 1;
1685 return -1;
1686 }
Eli Friedman618234a2008-08-20 02:34:37 +00001687};
1688} // end anonymous namespace
1689
1690namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001691// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001692class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001693public:
1694 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001695 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001696 TLSSupported = false;
1697 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00001698 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00001699 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00001700 IntMaxType = SignedLongLong;
1701 UIntMaxType = UnsignedLongLong;
1702 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00001703 SizeType = UnsignedLongLong;
1704 PtrDiffType = SignedLongLong;
1705 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00001706 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001707 }
1708 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001709 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001710 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001711 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00001712 }
NAKAMURA Takumi79521992011-01-17 22:56:23 +00001713 virtual const char *getVAListDeclaration() const {
1714 return "typedef char* __builtin_va_list;";
1715 }
Michael J. Spencera764e832010-10-21 08:22:51 +00001716};
1717} // end anonymous namespace
1718
1719namespace {
1720// x86-64 Windows Visual Studio target
1721class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1722public:
1723 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1724 : WindowsX86_64TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00001725 LongDoubleWidth = LongDoubleAlign = 64;
1726 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00001727 }
1728 virtual void getTargetDefines(const LangOptions &Opts,
1729 MacroBuilder &Builder) const {
1730 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1731 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00001732 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001733 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001734 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001735};
1736} // end anonymous namespace
1737
1738namespace {
1739// x86-64 MinGW target
1740class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1741public:
1742 MinGWX86_64TargetInfo(const std::string& triple)
1743 : WindowsX86_64TargetInfo(triple) {
1744 }
1745 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001746 MacroBuilder &Builder) const {
1747 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00001748 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00001749 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00001750 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00001751 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00001752
1753 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1754 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1755 if (Opts.Microsoft)
1756 // Provide "as-is" __declspec.
1757 Builder.defineMacro("__declspec", "__declspec");
1758 else
1759 // Provide alias of __attribute__ like mingw32-gcc.
1760 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001761 }
1762};
1763} // end anonymous namespace
1764
1765namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001766class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1767public:
Mike Stump1eb44332009-09-09 15:08:12 +00001768 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001769 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1770 Int64Type = SignedLongLong;
1771 }
1772};
1773} // end anonymous namespace
1774
1775namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00001776class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1777public:
Mike Stump1eb44332009-09-09 15:08:12 +00001778 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00001779 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1780 IntMaxType = SignedLongLong;
1781 UIntMaxType = UnsignedLongLong;
1782 Int64Type = SignedLongLong;
1783 }
1784};
1785} // end anonymous namespace
1786
1787namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00001788class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001789 // Possible FPU choices.
1790 enum FPUMode {
1791 NoFPU,
1792 VFP2FPU,
1793 VFP3FPU,
1794 NeonFPU
1795 };
1796
1797 static bool FPUModeIsVFP(FPUMode Mode) {
1798 return Mode >= VFP2FPU && Mode <= NeonFPU;
1799 }
1800
1801 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1802 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001803
Daniel Dunbareac7c532009-12-18 18:42:37 +00001804 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001805
1806 unsigned FPU : 3;
1807
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001808 unsigned IsThumb : 1;
1809
1810 // Initialized via features.
1811 unsigned SoftFloat : 1;
1812 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001813
Chris Lattner2752c012010-03-03 19:03:45 +00001814 static const Builtin::Info BuiltinInfo[];
1815
Chris Lattner393ff042008-04-21 18:56:49 +00001816public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001817 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbareac7c532009-12-18 18:42:37 +00001818 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001819 {
Daniel Dunbara2a41612009-09-14 00:02:24 +00001820 SizeType = UnsignedInt;
1821 PtrDiffType = SignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001822
Chris Lattner9bffb072010-04-23 16:29:58 +00001823 // {} in inline assembly are neon specifiers, not assembly variant
1824 // specifiers.
1825 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00001826
Daniel Dunbareac7c532009-12-18 18:42:37 +00001827 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00001828 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001829 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00001830 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1831 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001832 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1833 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001834 "v64:64:64-v128:64:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001835 } else {
1836 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1837 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001838 "v64:64:64-v128:64:128-a0:0:64-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001839 }
John McCallee79a4c2010-08-21 22:46:04 +00001840
1841 // ARM targets default to using the ARM C++ ABI.
1842 CXXABI = CXXABI_ARM;
Eli Friedman61538a72008-05-20 14:21:01 +00001843 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001844 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00001845 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001846 ABI = Name;
1847
Daniel Dunbara2a41612009-09-14 00:02:24 +00001848 // The defaults (above) are for AAPCS, check if we need to change them.
1849 //
1850 // FIXME: We need support for -meabi... we could just mangle it into the
1851 // name.
1852 if (Name == "apcs-gnu") {
Daniel Dunbard410fa22010-01-27 20:23:08 +00001853 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbara2a41612009-09-14 00:02:24 +00001854 SizeType = UnsignedLong;
1855
Daniel Dunbar684de632010-04-22 16:14:54 +00001856 // Do not respect the alignment of bit-field types when laying out
1857 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1858 UseBitFieldTypeAlignment = false;
1859
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001860 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00001861 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1862 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001863 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1864 "i64:32:32-f32:32:32-f64:32:32-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001865 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001866 } else {
1867 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 +00001868 "i64:32:64-f32:32:32-f64:32:64-"
1869 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001870 }
1871
Daniel Dunbara2a41612009-09-14 00:02:24 +00001872 // FIXME: Override "preferred align" for double and long long.
1873 } else if (Name == "aapcs") {
1874 // FIXME: Enumerated types are variable width in straight AAPCS.
1875 } else if (Name == "aapcs-linux") {
1876 ;
1877 } else
1878 return false;
1879
1880 return true;
1881 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001882
Daniel Dunbara91320b2009-12-21 23:28:17 +00001883 void getDefaultFeatures(const std::string &CPU,
1884 llvm::StringMap<bool> &Features) const {
1885 // FIXME: This should not be here.
1886 Features["vfp2"] = false;
1887 Features["vfp3"] = false;
1888 Features["neon"] = false;
1889
1890 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1891 Features["vfp2"] = true;
1892 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1893 Features["neon"] = true;
1894 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00001895
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001896 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1897 const std::string &Name,
1898 bool Enabled) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001899 if (Name == "soft-float" || Name == "soft-float-abi") {
1900 Features[Name] = Enabled;
1901 } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1902 // These effectively are a single option, reset them when any is enabled.
1903 if (Enabled)
1904 Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1905 Features[Name] = Enabled;
1906 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001907 return false;
1908
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001909 return true;
1910 }
1911
1912 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001913 FPU = NoFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001914 SoftFloat = SoftFloatABI = false;
1915 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1916 if (Features[i] == "+soft-float")
1917 SoftFloat = true;
1918 else if (Features[i] == "+soft-float-abi")
1919 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001920 else if (Features[i] == "+vfp2")
1921 FPU = VFP2FPU;
1922 else if (Features[i] == "+vfp3")
1923 FPU = VFP3FPU;
1924 else if (Features[i] == "+neon")
1925 FPU = NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001926 }
1927
1928 // Remove front-end specific options which the backend handles differently.
1929 std::vector<std::string>::iterator it;
1930 it = std::find(Features.begin(), Features.end(), "+soft-float");
1931 if (it != Features.end())
1932 Features.erase(it);
1933 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
1934 if (it != Features.end())
1935 Features.erase(it);
1936 }
1937
Daniel Dunbareac7c532009-12-18 18:42:37 +00001938 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
1939 return llvm::StringSwitch<const char*>(Name)
1940 .Cases("arm8", "arm810", "4")
1941 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
1942 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
1943 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
1944 .Case("ep9312", "4T")
1945 .Cases("arm10tdmi", "arm1020t", "5T")
1946 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
1947 .Case("arm926ej-s", "5TEJ")
1948 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
1949 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00001950 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001951 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00001952 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001953 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1954 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson06f45632011-01-06 16:57:20 +00001955 .Case("cortex-m3", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00001956 .Case("cortex-m0", "6M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001957 .Default(0);
1958 }
1959 virtual bool setCPU(const std::string &Name) {
1960 if (!getCPUDefineSuffix(Name))
1961 return false;
1962
1963 CPU = Name;
1964 return true;
1965 }
Chris Lattner33328642009-03-20 15:52:06 +00001966 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001967 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001968 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00001969 Builder.defineMacro("__arm");
1970 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001971
Chris Lattnerc0f59212009-03-02 22:27:17 +00001972 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00001973 Builder.defineMacro("__ARMEL__");
1974 Builder.defineMacro("__LITTLE_ENDIAN__");
1975 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001976
1977 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00001978 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001979
Mike Stump437bb4b2009-04-08 02:07:04 +00001980 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001981
Daniel Dunbareac7c532009-12-18 18:42:37 +00001982 // FIXME: It's more complicated than this and we don't really support
1983 // interworking.
1984 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00001985 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001986
Daniel Dunbareac7c532009-12-18 18:42:37 +00001987 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramera9992772010-01-09 17:55:51 +00001988 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001989
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001990 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00001991 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001992
1993 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00001994 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001995
Daniel Dunbara91320b2009-12-21 23:28:17 +00001996 bool IsThumb2 = IsThumb && (CPUArch == "6T2" || CPUArch.startswith("7"));
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001997 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001998 Builder.defineMacro("__THUMBEL__");
1999 Builder.defineMacro("__thumb__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002000 if (IsThumb2)
Benjamin Kramera9992772010-01-09 17:55:51 +00002001 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002002 }
2003
2004 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00002005 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002006
2007 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramera9992772010-01-09 17:55:51 +00002008 Builder.defineMacro("__VFP_FP__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002009
2010 // This only gets set when Neon instructions are actually available, unlike
2011 // the VFP define, hence the soft float and arch check. This is subtly
2012 // different from gcc, we follow the intent which was that it should be set
2013 // when Neon instructions are actually available.
2014 if (FPU == NeonFPU && !SoftFloat && IsThumb2)
Benjamin Kramera9992772010-01-09 17:55:51 +00002015 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00002016 }
2017 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2018 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00002019 Records = BuiltinInfo;
2020 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00002021 }
2022 virtual const char *getVAListDeclaration() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002023 return "typedef char* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +00002024 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002025 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002026 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002027 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002028 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002029 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002030 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002031 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002032 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00002033 default:
Nate Begemanad487f42008-04-22 05:03:19 +00002034 case 'l': // r0-r7
2035 case 'h': // r8-r15
2036 case 'w': // VFP Floating point register single precision
2037 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00002038 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00002039 return true;
2040 }
Chris Lattner393ff042008-04-21 18:56:49 +00002041 return false;
2042 }
2043 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002044 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00002045 return "";
2046 }
2047};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002048
2049const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002050 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002051 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002052 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2053
2054 // Float registers
2055 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2056 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2057 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002058 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002059
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002060 // Double registers
2061 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2062 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00002063 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2064 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002065
2066 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00002067 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2068 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002069};
2070
2071void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002072 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002073 Names = GCCRegNames;
2074 NumNames = llvm::array_lengthof(GCCRegNames);
2075}
2076
2077const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002078 { { "a1" }, "r0" },
2079 { { "a2" }, "r1" },
2080 { { "a3" }, "r2" },
2081 { { "a4" }, "r3" },
2082 { { "v1" }, "r4" },
2083 { { "v2" }, "r5" },
2084 { { "v3" }, "r6" },
2085 { { "v4" }, "r7" },
2086 { { "v5" }, "r8" },
2087 { { "v6", "rfp" }, "r9" },
2088 { { "sl" }, "r10" },
2089 { { "fp" }, "r11" },
2090 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002091 { { "r13" }, "sp" },
2092 { { "r14" }, "lr" },
2093 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002094 // The S, D and Q registers overlap, but aren't really aliases; we
2095 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002096};
2097
2098void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2099 unsigned &NumAliases) const {
2100 Aliases = GCCRegAliases;
2101 NumAliases = llvm::array_lengthof(GCCRegAliases);
2102}
Chris Lattner2752c012010-03-03 19:03:45 +00002103
2104const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +00002105#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
2106#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
2107 ALL_LANGUAGES, false },
Chris Lattner2752c012010-03-03 19:03:45 +00002108#include "clang/Basic/BuiltinsARM.def"
2109};
Chris Lattner393ff042008-04-21 18:56:49 +00002110} // end anonymous namespace.
2111
Eli Friedmana9f54962008-08-20 07:44:10 +00002112
2113namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00002114class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002115 public DarwinTargetInfo<ARMTargetInfo> {
2116protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00002117 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00002118 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00002119 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00002120 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002121
Torok Edwin5f6c1942009-06-30 17:10:35 +00002122public:
Mike Stump1eb44332009-09-09 15:08:12 +00002123 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002124 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2125 HasAlignMac68kSupport = true;
2126 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002127};
2128} // end anonymous namespace.
2129
Reid Spencer5f016e22007-07-11 17:01:13 +00002130namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00002131class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00002132 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2133 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002134 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00002135public:
Eli Friedman01b86682008-08-20 07:28:14 +00002136 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2137 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00002138 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 +00002139 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00002140 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002141 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2142 const std::string &Name,
2143 bool Enabled) const {
2144 if (Name == "soft-float")
2145 Features[Name] = Enabled;
2146 else
2147 return false;
2148
2149 return true;
2150 }
2151 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2152 SoftFloat = false;
2153 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2154 if (Features[i] == "+soft-float")
2155 SoftFloat = true;
2156 }
Chris Lattner33328642009-03-20 15:52:06 +00002157 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002158 MacroBuilder &Builder) const {
2159 DefineStd(Builder, "sparc", Opts);
2160 Builder.defineMacro("__sparcv8");
2161 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002162
2163 if (SoftFloat)
2164 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00002165 }
2166 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2167 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002168 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00002169 }
2170 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002171 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00002172 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002173 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002174 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002175 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002176 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002177 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00002178 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002179 // FIXME: Implement!
2180 return false;
Gabor Greif26658672008-02-21 16:29:08 +00002181 }
2182 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002183 // FIXME: Implement!
2184 return "";
Gabor Greif26658672008-02-21 16:29:08 +00002185 }
2186};
2187
Chris Lattnere957f532009-01-27 01:58:38 +00002188const char * const SparcV8TargetInfo::GCCRegNames[] = {
2189 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2190 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2191 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2192 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2193};
2194
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002195void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002196 unsigned &NumNames) const {
2197 Names = GCCRegNames;
2198 NumNames = llvm::array_lengthof(GCCRegNames);
2199}
2200
2201const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002202 { { "g0" }, "r0" },
2203 { { "g1" }, "r1" },
2204 { { "g2" }, "r2" },
2205 { { "g3" }, "r3" },
2206 { { "g4" }, "r4" },
2207 { { "g5" }, "r5" },
2208 { { "g6" }, "r6" },
2209 { { "g7" }, "r7" },
2210 { { "o0" }, "r8" },
2211 { { "o1" }, "r9" },
2212 { { "o2" }, "r10" },
2213 { { "o3" }, "r11" },
2214 { { "o4" }, "r12" },
2215 { { "o5" }, "r13" },
2216 { { "o6", "sp" }, "r14" },
2217 { { "o7" }, "r15" },
2218 { { "l0" }, "r16" },
2219 { { "l1" }, "r17" },
2220 { { "l2" }, "r18" },
2221 { { "l3" }, "r19" },
2222 { { "l4" }, "r20" },
2223 { { "l5" }, "r21" },
2224 { { "l6" }, "r22" },
2225 { { "l7" }, "r23" },
2226 { { "i0" }, "r24" },
2227 { { "i1" }, "r25" },
2228 { { "i2" }, "r26" },
2229 { { "i3" }, "r27" },
2230 { { "i4" }, "r28" },
2231 { { "i5" }, "r29" },
2232 { { "i6", "fp" }, "r30" },
2233 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00002234};
2235
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002236void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002237 unsigned &NumAliases) const {
2238 Aliases = GCCRegAliases;
2239 NumAliases = llvm::array_lengthof(GCCRegAliases);
2240}
Gabor Greif26658672008-02-21 16:29:08 +00002241} // end anonymous namespace.
2242
Eli Friedman01b86682008-08-20 07:28:14 +00002243namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002244class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2245public:
2246 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2247 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2248 SizeType = UnsignedInt;
2249 PtrDiffType = SignedInt;
2250 }
2251};
Torok Edwin5f6c1942009-06-30 17:10:35 +00002252class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00002253public:
2254 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002255 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00002256 SizeType = UnsignedInt;
2257 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00002258 }
2259};
2260} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00002261
Chris Lattner2621fd12008-05-08 05:58:21 +00002262namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002263 class MSP430TargetInfo : public TargetInfo {
2264 static const char * const GCCRegNames[];
2265 public:
2266 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2267 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00002268 IntWidth = 16; IntAlign = 16;
2269 LongWidth = 32; LongLongWidth = 64;
2270 LongAlign = LongLongAlign = 16;
2271 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002272 SizeType = UnsignedInt;
2273 IntMaxType = SignedLong;
2274 UIntMaxType = UnsignedLong;
2275 IntPtrType = SignedShort;
2276 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00002277 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00002278 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002279 }
2280 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002281 MacroBuilder &Builder) const {
2282 Builder.defineMacro("MSP430");
2283 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002284 // FIXME: defines for different 'flavours' of MCU
2285 }
2286 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2287 unsigned &NumRecords) const {
2288 // FIXME: Implement.
2289 Records = 0;
2290 NumRecords = 0;
2291 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002292 virtual void getGCCRegNames(const char * const *&Names,
2293 unsigned &NumNames) const;
2294 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2295 unsigned &NumAliases) const {
2296 // No aliases.
2297 Aliases = 0;
2298 NumAliases = 0;
2299 }
2300 virtual bool validateAsmConstraint(const char *&Name,
2301 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00002302 // No target constraints for now.
2303 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002304 }
2305 virtual const char *getClobbers() const {
2306 // FIXME: Is this really right?
2307 return "";
2308 }
2309 virtual const char *getVAListDeclaration() const {
2310 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00002311 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002312 }
2313 };
2314
2315 const char * const MSP430TargetInfo::GCCRegNames[] = {
2316 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2317 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2318 };
2319
2320 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2321 unsigned &NumNames) const {
2322 Names = GCCRegNames;
2323 NumNames = llvm::array_lengthof(GCCRegNames);
2324 }
2325}
2326
2327
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002328namespace {
2329 class SystemZTargetInfo : public TargetInfo {
2330 static const char * const GCCRegNames[];
2331 public:
2332 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2333 TLSSupported = false;
2334 IntWidth = IntAlign = 32;
2335 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2336 PointerWidth = PointerAlign = 64;
Chris Lattner1932e122009-11-07 18:59:41 +00002337 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2338 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002339 }
2340 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002341 MacroBuilder &Builder) const {
2342 Builder.defineMacro("__s390__");
2343 Builder.defineMacro("__s390x__");
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002344 }
2345 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2346 unsigned &NumRecords) const {
2347 // FIXME: Implement.
2348 Records = 0;
2349 NumRecords = 0;
2350 }
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002351
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002352 virtual void getGCCRegNames(const char * const *&Names,
2353 unsigned &NumNames) const;
2354 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2355 unsigned &NumAliases) const {
2356 // No aliases.
2357 Aliases = 0;
2358 NumAliases = 0;
2359 }
2360 virtual bool validateAsmConstraint(const char *&Name,
2361 TargetInfo::ConstraintInfo &info) const {
2362 // FIXME: implement
2363 return true;
2364 }
2365 virtual const char *getClobbers() const {
2366 // FIXME: Is this really right?
2367 return "";
2368 }
2369 virtual const char *getVAListDeclaration() const {
2370 // FIXME: implement
2371 return "typedef char* __builtin_va_list;";
2372 }
2373 };
2374
2375 const char * const SystemZTargetInfo::GCCRegNames[] = {
2376 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2377 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2378 };
2379
2380 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2381 unsigned &NumNames) const {
2382 Names = GCCRegNames;
2383 NumNames = llvm::array_lengthof(GCCRegNames);
2384 }
2385}
2386
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002387namespace {
2388 class BlackfinTargetInfo : public TargetInfo {
2389 static const char * const GCCRegNames[];
2390 public:
2391 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2392 TLSSupported = false;
2393 DoubleAlign = 32;
2394 LongLongAlign = 32;
2395 LongDoubleAlign = 32;
Chris Lattner1932e122009-11-07 18:59:41 +00002396 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002397 }
2398
2399 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002400 MacroBuilder &Builder) const {
2401 DefineStd(Builder, "bfin", Opts);
2402 DefineStd(Builder, "BFIN", Opts);
2403 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002404 // FIXME: This one is really dependent on -mcpu
Benjamin Kramera9992772010-01-09 17:55:51 +00002405 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002406 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2407 }
2408
2409 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2410 unsigned &NumRecords) const {
2411 // FIXME: Implement.
2412 Records = 0;
2413 NumRecords = 0;
2414 }
2415
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002416 virtual void getGCCRegNames(const char * const *&Names,
2417 unsigned &NumNames) const;
2418
2419 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2420 unsigned &NumAliases) const {
2421 // No aliases.
2422 Aliases = 0;
2423 NumAliases = 0;
2424 }
2425
2426 virtual bool validateAsmConstraint(const char *&Name,
2427 TargetInfo::ConstraintInfo &Info) const {
2428 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2429 Info.setAllowsRegister();
2430 return true;
2431 }
2432 return false;
2433 }
2434
2435 virtual const char *getClobbers() const {
2436 return "";
2437 }
2438
2439 virtual const char *getVAListDeclaration() const {
2440 return "typedef char* __builtin_va_list;";
2441 }
2442 };
2443
2444 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2445 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2446 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2447 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2448 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2449 "a0", "a1", "cc",
2450 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2451 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2452 };
2453
2454 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2455 unsigned &NumNames) const {
2456 Names = GCCRegNames;
2457 NumNames = llvm::array_lengthof(GCCRegNames);
2458 }
2459}
2460
Eli Friedmanb63decf2009-08-19 20:47:07 +00002461namespace {
2462
Mike Stump1eb44332009-09-09 15:08:12 +00002463 // LLVM and Clang cannot be used directly to output native binaries for
2464 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00002465 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00002466 //
2467 // TCE uses the llvm bitcode as input and uses it for generating customized
2468 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00002469 // publicly available in http://tce.cs.tut.fi
2470
2471 class TCETargetInfo : public TargetInfo{
2472 public:
2473 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2474 TLSSupported = false;
2475 IntWidth = 32;
2476 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00002477 PointerWidth = 32;
2478 IntAlign = 32;
2479 LongAlign = LongLongAlign = 32;
2480 PointerAlign = 32;
2481 SizeType = UnsignedInt;
2482 IntMaxType = SignedLong;
2483 UIntMaxType = UnsignedLong;
2484 IntPtrType = SignedInt;
2485 PtrDiffType = SignedInt;
2486 FloatWidth = 32;
2487 FloatAlign = 32;
2488 DoubleWidth = 32;
2489 DoubleAlign = 32;
2490 LongDoubleWidth = 32;
2491 LongDoubleAlign = 32;
2492 FloatFormat = &llvm::APFloat::IEEEsingle;
2493 DoubleFormat = &llvm::APFloat::IEEEsingle;
2494 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00002495 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2496 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00002497 "f32:32:32-f64:32:32-v64:32:32-"
2498 "v128:32:32-a0:0:32-n32";
Eli Friedmanb63decf2009-08-19 20:47:07 +00002499 }
2500
2501 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002502 MacroBuilder &Builder) const {
2503 DefineStd(Builder, "tce", Opts);
2504 Builder.defineMacro("__TCE__");
2505 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00002506 }
2507 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2508 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00002509 virtual const char *getClobbers() const {
2510 return "";
2511 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002512 virtual const char *getVAListDeclaration() const {
2513 return "typedef void* __builtin_va_list;";
2514 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002515 virtual void getGCCRegNames(const char * const *&Names,
2516 unsigned &NumNames) const {}
2517 virtual bool validateAsmConstraint(const char *&Name,
2518 TargetInfo::ConstraintInfo &info) const {
2519 return true;
2520 }
2521 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2522 unsigned &NumAliases) const {}
2523 };
2524}
2525
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002526namespace {
2527class MipsTargetInfo : public TargetInfo {
Eric Christophered734732010-03-02 02:41:08 +00002528 std::string ABI, CPU;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002529 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2530 static const char * const GCCRegNames[];
2531public:
Eric Christophered734732010-03-02 02:41:08 +00002532 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002533 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2534 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2535 }
Eric Christophered734732010-03-02 02:41:08 +00002536 virtual const char *getABI() const { return ABI.c_str(); }
2537 virtual bool setABI(const std::string &Name) {
2538
2539 if ((Name == "o32") || (Name == "eabi")) {
2540 ABI = Name;
2541 return true;
2542 } else
2543 return false;
2544 }
2545 virtual bool setCPU(const std::string &Name) {
2546 CPU = Name;
2547 return true;
2548 }
2549 void getDefaultFeatures(const std::string &CPU,
2550 llvm::StringMap<bool> &Features) const {
2551 Features[ABI] = true;
2552 Features[CPU] = true;
2553 }
2554 virtual void getArchDefines(const LangOptions &Opts,
2555 MacroBuilder &Builder) const {
2556 if (ABI == "o32")
2557 Builder.defineMacro("__mips_o32");
2558 else if (ABI == "eabi")
2559 Builder.defineMacro("__mips_eabi");
2560 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002561 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002562 MacroBuilder &Builder) const {
2563 DefineStd(Builder, "mips", Opts);
2564 Builder.defineMacro("_mips");
2565 DefineStd(Builder, "MIPSEB", Opts);
2566 Builder.defineMacro("_MIPSEB");
2567 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002568 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002569 }
2570 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2571 unsigned &NumRecords) const {
2572 // FIXME: Implement!
2573 }
2574 virtual const char *getVAListDeclaration() const {
2575 return "typedef void* __builtin_va_list;";
2576 }
2577 virtual void getGCCRegNames(const char * const *&Names,
2578 unsigned &NumNames) const;
2579 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2580 unsigned &NumAliases) const;
2581 virtual bool validateAsmConstraint(const char *&Name,
2582 TargetInfo::ConstraintInfo &Info) const {
2583 switch (*Name) {
2584 default:
2585 case 'r': // CPU registers.
2586 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2587 case 'y': // Equivalent to "r", backwards compatibility only.
2588 case 'f': // floating-point registers.
2589 Info.setAllowsRegister();
2590 return true;
2591 }
2592 return false;
2593 }
2594
2595 virtual const char *getClobbers() const {
2596 // FIXME: Implement!
2597 return "";
2598 }
2599};
2600
2601const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer20249a12010-10-21 03:16:25 +00002602 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002603 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2604 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2605 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2606 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2607 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2608 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2609 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2610 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2611 "$fcc5","$fcc6","$fcc7"
2612};
2613
2614void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2615 unsigned &NumNames) const {
2616 Names = GCCRegNames;
2617 NumNames = llvm::array_lengthof(GCCRegNames);
2618}
2619
2620const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2621 { { "at" }, "$1" },
2622 { { "v0" }, "$2" },
2623 { { "v1" }, "$3" },
2624 { { "a0" }, "$4" },
2625 { { "a1" }, "$5" },
2626 { { "a2" }, "$6" },
2627 { { "a3" }, "$7" },
2628 { { "t0" }, "$8" },
2629 { { "t1" }, "$9" },
2630 { { "t2" }, "$10" },
2631 { { "t3" }, "$11" },
2632 { { "t4" }, "$12" },
2633 { { "t5" }, "$13" },
2634 { { "t6" }, "$14" },
2635 { { "t7" }, "$15" },
2636 { { "s0" }, "$16" },
2637 { { "s1" }, "$17" },
2638 { { "s2" }, "$18" },
2639 { { "s3" }, "$19" },
2640 { { "s4" }, "$20" },
2641 { { "s5" }, "$21" },
2642 { { "s6" }, "$22" },
2643 { { "s7" }, "$23" },
2644 { { "t8" }, "$24" },
2645 { { "t9" }, "$25" },
2646 { { "k0" }, "$26" },
2647 { { "k1" }, "$27" },
2648 { { "gp" }, "$28" },
2649 { { "sp" }, "$29" },
2650 { { "fp" }, "$30" },
2651 { { "ra" }, "$31" }
2652};
2653
2654void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2655 unsigned &NumAliases) const {
2656 Aliases = GCCRegAliases;
2657 NumAliases = llvm::array_lengthof(GCCRegAliases);
2658}
2659} // end anonymous namespace.
2660
2661namespace {
2662class MipselTargetInfo : public MipsTargetInfo {
2663public:
2664 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2665 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2666 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2667 }
2668
2669 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002670 MacroBuilder &Builder) const;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002671};
2672
2673void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002674 MacroBuilder &Builder) const {
2675 DefineStd(Builder, "mips", Opts);
2676 Builder.defineMacro("_mips");
2677 DefineStd(Builder, "MIPSEL", Opts);
2678 Builder.defineMacro("_MIPSEL");
2679 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002680 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002681}
2682} // end anonymous namespace.
2683
Reid Spencer5f016e22007-07-11 17:01:13 +00002684//===----------------------------------------------------------------------===//
2685// Driver code
2686//===----------------------------------------------------------------------===//
2687
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002688static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002689 llvm::Triple Triple(T);
2690 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00002691
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002692 switch (Triple.getArch()) {
2693 default:
2694 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00002695
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002696 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00002697 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002698 if (Triple.isOSDarwin())
2699 return new DarwinARMTargetInfo(T);
2700
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002701 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00002702 case llvm::Triple::Linux:
2703 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002704 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002705 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002706 default:
2707 return new ARMTargetInfo(T);
2708 }
Eli Friedman61538a72008-05-20 14:21:01 +00002709
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002710 case llvm::Triple::bfin:
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002711 return new BlackfinTargetInfo(T);
2712
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002713 case llvm::Triple::msp430:
2714 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00002715
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002716 case llvm::Triple::mips:
2717 if (os == llvm::Triple::Psp)
2718 return new PSPTargetInfo<MipsTargetInfo>(T);
2719 if (os == llvm::Triple::Linux)
2720 return new LinuxTargetInfo<MipsTargetInfo>(T);
2721 return new MipsTargetInfo(T);
2722
2723 case llvm::Triple::mipsel:
2724 if (os == llvm::Triple::Psp)
2725 return new PSPTargetInfo<MipselTargetInfo>(T);
2726 if (os == llvm::Triple::Linux)
2727 return new LinuxTargetInfo<MipselTargetInfo>(T);
2728 return new MipselTargetInfo(T);
2729
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002730 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002731 if (Triple.isOSDarwin())
Roman Divackyc81f2a22011-01-06 08:27:10 +00002732 return new DarwinPPC32TargetInfo(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002733 else if (os == llvm::Triple::FreeBSD)
2734 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002735 return new PPC32TargetInfo(T);
2736
2737 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002738 if (Triple.isOSDarwin())
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00002739 return new DarwinPPC64TargetInfo(T);
John Thompson3f6918a2009-11-19 17:18:50 +00002740 else if (os == llvm::Triple::Lv2)
2741 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002742 else if (os == llvm::Triple::FreeBSD)
2743 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002744 return new PPC64TargetInfo(T);
2745
Justin Holewinski285dc652011-04-20 19:34:15 +00002746 case llvm::Triple::ptx32:
2747 return new PTX32TargetInfo(T);
2748 case llvm::Triple::ptx64:
2749 return new PTX64TargetInfo(T);
2750
Chris Lattner9cbeb632010-03-06 21:21:27 +00002751 case llvm::Triple::mblaze:
2752 return new MBlazeTargetInfo(T);
2753
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002754 case llvm::Triple::sparc:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002755 if (os == llvm::Triple::AuroraUX)
2756 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002757 if (os == llvm::Triple::Solaris)
2758 return new SolarisSparcV8TargetInfo(T);
2759 return new SparcV8TargetInfo(T);
2760
John Thompson3f6918a2009-11-19 17:18:50 +00002761 // FIXME: Need a real SPU target.
2762 case llvm::Triple::cellspu:
2763 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2764
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002765 case llvm::Triple::systemz:
2766 return new SystemZTargetInfo(T);
2767
Eli Friedmanb63decf2009-08-19 20:47:07 +00002768 case llvm::Triple::tce:
2769 return new TCETargetInfo(T);
2770
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002771 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002772 if (Triple.isOSDarwin())
2773 return new DarwinI386TargetInfo(T);
2774
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002775 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002776 case llvm::Triple::AuroraUX:
2777 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002778 case llvm::Triple::Linux:
2779 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2780 case llvm::Triple::DragonFly:
2781 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2782 case llvm::Triple::NetBSD:
2783 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2784 case llvm::Triple::OpenBSD:
2785 return new OpenBSDI386TargetInfo(T);
2786 case llvm::Triple::FreeBSD:
2787 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00002788 case llvm::Triple::Minix:
2789 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002790 case llvm::Triple::Solaris:
2791 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2792 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002793 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002794 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002795 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002796 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00002797 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00002798 case llvm::Triple::Haiku:
2799 return new HaikuX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002800 default:
2801 return new X86_32TargetInfo(T);
2802 }
2803
2804 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002805 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
2806 return new DarwinX86_64TargetInfo(T);
2807
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002808 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002809 case llvm::Triple::AuroraUX:
2810 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002811 case llvm::Triple::Linux:
2812 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00002813 case llvm::Triple::DragonFly:
2814 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002815 case llvm::Triple::NetBSD:
2816 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2817 case llvm::Triple::OpenBSD:
2818 return new OpenBSDX86_64TargetInfo(T);
2819 case llvm::Triple::FreeBSD:
2820 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2821 case llvm::Triple::Solaris:
2822 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00002823 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002824 return new MinGWX86_64TargetInfo(T);
2825 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002826 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002827 default:
2828 return new X86_64TargetInfo(T);
2829 }
2830 }
Reid Spencer5f016e22007-07-11 17:01:13 +00002831}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002832
2833/// CreateTargetInfo - Return the target info object for the specified target
2834/// triple.
2835TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002836 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002837 llvm::Triple Triple(Opts.Triple);
2838
2839 // Construct the target
2840 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2841 if (!Target) {
2842 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2843 return 0;
2844 }
2845
Daniel Dunbareac7c532009-12-18 18:42:37 +00002846 // Set the target CPU if specified.
2847 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2848 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2849 return 0;
2850 }
2851
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002852 // Set the target ABI if specified.
2853 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2854 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2855 return 0;
2856 }
2857
Charles Davis98b7c5c2010-06-11 01:06:47 +00002858 // Set the target C++ ABI.
John McCallee79a4c2010-08-21 22:46:04 +00002859 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis98b7c5c2010-06-11 01:06:47 +00002860 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2861 return 0;
2862 }
2863
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002864 // Compute the default target features, we need the target to handle this
2865 // because features may have dependencies on one another.
2866 llvm::StringMap<bool> Features;
2867 Target->getDefaultFeatures(Opts.CPU, Features);
2868
2869 // Apply the user specified deltas.
2870 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2871 ie = Opts.Features.end(); it != ie; ++it) {
2872 const char *Name = it->c_str();
2873
2874 // Apply the feature via the target.
2875 if ((Name[0] != '-' && Name[0] != '+') ||
2876 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2877 Diags.Report(diag::err_target_invalid_feature) << Name;
2878 return 0;
2879 }
2880 }
2881
2882 // Add the features to the compile options.
2883 //
2884 // FIXME: If we are completely confident that we have the right set, we only
2885 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002886 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002887 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2888 ie = Features.end(); it != ie; ++it)
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002889 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2890 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002891
2892 return Target.take();
2893}