blob: dd167dca47b23b81da08220b83b401fec72c1fa2 [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;
Stuart Hastings002333f2011-06-07 23:45:05 +00001124 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);
Benjamin Kramerb65b6722011-05-20 15:11:23 +00001183 } else if (CPU == "corei7-avx") {
Roman Divackybcaa3b82011-04-05 20:32:44 +00001184 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
Stuart Hastings002333f2011-06-07 23:45:05 +00001452X86TargetInfo::convertConstraint(const char *&Constraint) const {
1453 switch (*Constraint) {
Eli Friedman618234a2008-08-20 02:34:37 +00001454 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:
Stuart Hastings002333f2011-06-07 23:45:05 +00001467 return std::string(1, *Constraint);
Eli Friedman618234a2008-08-20 02:34:37 +00001468 }
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
Bob Wilson84f95cf2011-05-13 18:56:03 +00001996 bool IsARMv7 = 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__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00002000 if (CPUArch == "6T2" || IsARMv7)
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.
Bob Wilson84f95cf2011-05-13 18:56:03 +00002014 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
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 {
John McCall0e9972c2011-05-09 02:19:37 +00002023 return "typedef void* __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;
Stuart Hastings002333f2011-06-07 23:45:05 +00002040 case 'U': // a memory reference...
2041 switch (Name[1]) {
2042 case 'q': // ...ARMV4 ldrsb
2043 case 'v': // ...VFP load/store (reg+constant offset)
2044 case 'y': // ...iWMMXt load/store
2045 Info.setAllowsMemory();
2046 Name++;
2047 return true;
2048 }
Nate Begemanad487f42008-04-22 05:03:19 +00002049 }
Chris Lattner393ff042008-04-21 18:56:49 +00002050 return false;
2051 }
Stuart Hastings002333f2011-06-07 23:45:05 +00002052 std::string
2053 virtual convertConstraint(const char *&Constraint) const {
2054 std::string R;
2055 switch (*Constraint) {
2056 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00002057 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00002058 Constraint++;
2059 break;
2060 default:
2061 return std::string(1, *Constraint);
2062 }
2063 return R;
2064 }
Chris Lattner393ff042008-04-21 18:56:49 +00002065 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002066 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00002067 return "";
2068 }
2069};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002070
2071const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002072 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002073 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002074 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2075
2076 // Float registers
2077 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2078 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2079 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002080 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002081
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002082 // Double registers
2083 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2084 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00002085 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2086 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002087
2088 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00002089 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2090 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002091};
2092
2093void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002094 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002095 Names = GCCRegNames;
2096 NumNames = llvm::array_lengthof(GCCRegNames);
2097}
2098
2099const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002100 { { "a1" }, "r0" },
2101 { { "a2" }, "r1" },
2102 { { "a3" }, "r2" },
2103 { { "a4" }, "r3" },
2104 { { "v1" }, "r4" },
2105 { { "v2" }, "r5" },
2106 { { "v3" }, "r6" },
2107 { { "v4" }, "r7" },
2108 { { "v5" }, "r8" },
2109 { { "v6", "rfp" }, "r9" },
2110 { { "sl" }, "r10" },
2111 { { "fp" }, "r11" },
2112 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002113 { { "r13" }, "sp" },
2114 { { "r14" }, "lr" },
2115 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002116 // The S, D and Q registers overlap, but aren't really aliases; we
2117 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002118};
2119
2120void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2121 unsigned &NumAliases) const {
2122 Aliases = GCCRegAliases;
2123 NumAliases = llvm::array_lengthof(GCCRegAliases);
2124}
Chris Lattner2752c012010-03-03 19:03:45 +00002125
2126const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +00002127#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
2128#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
2129 ALL_LANGUAGES, false },
Chris Lattner2752c012010-03-03 19:03:45 +00002130#include "clang/Basic/BuiltinsARM.def"
2131};
Chris Lattner393ff042008-04-21 18:56:49 +00002132} // end anonymous namespace.
2133
Eli Friedmana9f54962008-08-20 07:44:10 +00002134
2135namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00002136class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002137 public DarwinTargetInfo<ARMTargetInfo> {
2138protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00002139 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00002140 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00002141 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00002142 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002143
Torok Edwin5f6c1942009-06-30 17:10:35 +00002144public:
Mike Stump1eb44332009-09-09 15:08:12 +00002145 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002146 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2147 HasAlignMac68kSupport = true;
2148 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002149};
2150} // end anonymous namespace.
2151
Reid Spencer5f016e22007-07-11 17:01:13 +00002152namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00002153class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00002154 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2155 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002156 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00002157public:
Eli Friedman01b86682008-08-20 07:28:14 +00002158 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2159 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00002160 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 +00002161 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00002162 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002163 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2164 const std::string &Name,
2165 bool Enabled) const {
2166 if (Name == "soft-float")
2167 Features[Name] = Enabled;
2168 else
2169 return false;
2170
2171 return true;
2172 }
2173 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2174 SoftFloat = false;
2175 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2176 if (Features[i] == "+soft-float")
2177 SoftFloat = true;
2178 }
Chris Lattner33328642009-03-20 15:52:06 +00002179 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002180 MacroBuilder &Builder) const {
2181 DefineStd(Builder, "sparc", Opts);
2182 Builder.defineMacro("__sparcv8");
2183 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002184
2185 if (SoftFloat)
2186 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00002187 }
2188 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2189 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002190 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00002191 }
2192 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002193 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00002194 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002195 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002196 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002197 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002198 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002199 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00002200 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002201 // FIXME: Implement!
2202 return false;
Gabor Greif26658672008-02-21 16:29:08 +00002203 }
2204 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002205 // FIXME: Implement!
2206 return "";
Gabor Greif26658672008-02-21 16:29:08 +00002207 }
2208};
2209
Chris Lattnere957f532009-01-27 01:58:38 +00002210const char * const SparcV8TargetInfo::GCCRegNames[] = {
2211 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2212 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2213 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2214 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2215};
2216
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002217void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002218 unsigned &NumNames) const {
2219 Names = GCCRegNames;
2220 NumNames = llvm::array_lengthof(GCCRegNames);
2221}
2222
2223const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002224 { { "g0" }, "r0" },
2225 { { "g1" }, "r1" },
2226 { { "g2" }, "r2" },
2227 { { "g3" }, "r3" },
2228 { { "g4" }, "r4" },
2229 { { "g5" }, "r5" },
2230 { { "g6" }, "r6" },
2231 { { "g7" }, "r7" },
2232 { { "o0" }, "r8" },
2233 { { "o1" }, "r9" },
2234 { { "o2" }, "r10" },
2235 { { "o3" }, "r11" },
2236 { { "o4" }, "r12" },
2237 { { "o5" }, "r13" },
2238 { { "o6", "sp" }, "r14" },
2239 { { "o7" }, "r15" },
2240 { { "l0" }, "r16" },
2241 { { "l1" }, "r17" },
2242 { { "l2" }, "r18" },
2243 { { "l3" }, "r19" },
2244 { { "l4" }, "r20" },
2245 { { "l5" }, "r21" },
2246 { { "l6" }, "r22" },
2247 { { "l7" }, "r23" },
2248 { { "i0" }, "r24" },
2249 { { "i1" }, "r25" },
2250 { { "i2" }, "r26" },
2251 { { "i3" }, "r27" },
2252 { { "i4" }, "r28" },
2253 { { "i5" }, "r29" },
2254 { { "i6", "fp" }, "r30" },
2255 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00002256};
2257
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002258void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002259 unsigned &NumAliases) const {
2260 Aliases = GCCRegAliases;
2261 NumAliases = llvm::array_lengthof(GCCRegAliases);
2262}
Gabor Greif26658672008-02-21 16:29:08 +00002263} // end anonymous namespace.
2264
Eli Friedman01b86682008-08-20 07:28:14 +00002265namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002266class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2267public:
2268 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2269 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2270 SizeType = UnsignedInt;
2271 PtrDiffType = SignedInt;
2272 }
2273};
Torok Edwin5f6c1942009-06-30 17:10:35 +00002274class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00002275public:
2276 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002277 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00002278 SizeType = UnsignedInt;
2279 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00002280 }
2281};
2282} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00002283
Chris Lattner2621fd12008-05-08 05:58:21 +00002284namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002285 class MSP430TargetInfo : public TargetInfo {
2286 static const char * const GCCRegNames[];
2287 public:
2288 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2289 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00002290 IntWidth = 16; IntAlign = 16;
2291 LongWidth = 32; LongLongWidth = 64;
2292 LongAlign = LongLongAlign = 16;
2293 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002294 SizeType = UnsignedInt;
2295 IntMaxType = SignedLong;
2296 UIntMaxType = UnsignedLong;
2297 IntPtrType = SignedShort;
2298 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00002299 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00002300 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002301 }
2302 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002303 MacroBuilder &Builder) const {
2304 Builder.defineMacro("MSP430");
2305 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002306 // FIXME: defines for different 'flavours' of MCU
2307 }
2308 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2309 unsigned &NumRecords) const {
2310 // FIXME: Implement.
2311 Records = 0;
2312 NumRecords = 0;
2313 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002314 virtual void getGCCRegNames(const char * const *&Names,
2315 unsigned &NumNames) const;
2316 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2317 unsigned &NumAliases) const {
2318 // No aliases.
2319 Aliases = 0;
2320 NumAliases = 0;
2321 }
2322 virtual bool validateAsmConstraint(const char *&Name,
2323 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00002324 // No target constraints for now.
2325 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002326 }
2327 virtual const char *getClobbers() const {
2328 // FIXME: Is this really right?
2329 return "";
2330 }
2331 virtual const char *getVAListDeclaration() const {
2332 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00002333 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002334 }
2335 };
2336
2337 const char * const MSP430TargetInfo::GCCRegNames[] = {
2338 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2339 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2340 };
2341
2342 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2343 unsigned &NumNames) const {
2344 Names = GCCRegNames;
2345 NumNames = llvm::array_lengthof(GCCRegNames);
2346 }
2347}
2348
2349
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002350namespace {
2351 class SystemZTargetInfo : public TargetInfo {
2352 static const char * const GCCRegNames[];
2353 public:
2354 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2355 TLSSupported = false;
2356 IntWidth = IntAlign = 32;
2357 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2358 PointerWidth = PointerAlign = 64;
Chris Lattner1932e122009-11-07 18:59:41 +00002359 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2360 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002361 }
2362 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002363 MacroBuilder &Builder) const {
2364 Builder.defineMacro("__s390__");
2365 Builder.defineMacro("__s390x__");
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002366 }
2367 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2368 unsigned &NumRecords) const {
2369 // FIXME: Implement.
2370 Records = 0;
2371 NumRecords = 0;
2372 }
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002373
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002374 virtual void getGCCRegNames(const char * const *&Names,
2375 unsigned &NumNames) const;
2376 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2377 unsigned &NumAliases) const {
2378 // No aliases.
2379 Aliases = 0;
2380 NumAliases = 0;
2381 }
2382 virtual bool validateAsmConstraint(const char *&Name,
2383 TargetInfo::ConstraintInfo &info) const {
2384 // FIXME: implement
2385 return true;
2386 }
2387 virtual const char *getClobbers() const {
2388 // FIXME: Is this really right?
2389 return "";
2390 }
2391 virtual const char *getVAListDeclaration() const {
2392 // FIXME: implement
2393 return "typedef char* __builtin_va_list;";
2394 }
2395 };
2396
2397 const char * const SystemZTargetInfo::GCCRegNames[] = {
2398 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2399 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2400 };
2401
2402 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2403 unsigned &NumNames) const {
2404 Names = GCCRegNames;
2405 NumNames = llvm::array_lengthof(GCCRegNames);
2406 }
2407}
2408
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002409namespace {
2410 class BlackfinTargetInfo : public TargetInfo {
2411 static const char * const GCCRegNames[];
2412 public:
2413 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2414 TLSSupported = false;
2415 DoubleAlign = 32;
2416 LongLongAlign = 32;
2417 LongDoubleAlign = 32;
Chris Lattner1932e122009-11-07 18:59:41 +00002418 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002419 }
2420
2421 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002422 MacroBuilder &Builder) const {
2423 DefineStd(Builder, "bfin", Opts);
2424 DefineStd(Builder, "BFIN", Opts);
2425 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002426 // FIXME: This one is really dependent on -mcpu
Benjamin Kramera9992772010-01-09 17:55:51 +00002427 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002428 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2429 }
2430
2431 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2432 unsigned &NumRecords) const {
2433 // FIXME: Implement.
2434 Records = 0;
2435 NumRecords = 0;
2436 }
2437
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002438 virtual void getGCCRegNames(const char * const *&Names,
2439 unsigned &NumNames) const;
2440
2441 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2442 unsigned &NumAliases) const {
2443 // No aliases.
2444 Aliases = 0;
2445 NumAliases = 0;
2446 }
2447
2448 virtual bool validateAsmConstraint(const char *&Name,
2449 TargetInfo::ConstraintInfo &Info) const {
2450 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2451 Info.setAllowsRegister();
2452 return true;
2453 }
2454 return false;
2455 }
2456
2457 virtual const char *getClobbers() const {
2458 return "";
2459 }
2460
2461 virtual const char *getVAListDeclaration() const {
2462 return "typedef char* __builtin_va_list;";
2463 }
2464 };
2465
2466 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2467 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2468 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2469 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2470 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2471 "a0", "a1", "cc",
2472 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2473 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2474 };
2475
2476 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2477 unsigned &NumNames) const {
2478 Names = GCCRegNames;
2479 NumNames = llvm::array_lengthof(GCCRegNames);
2480 }
2481}
2482
Eli Friedmanb63decf2009-08-19 20:47:07 +00002483namespace {
2484
Mike Stump1eb44332009-09-09 15:08:12 +00002485 // LLVM and Clang cannot be used directly to output native binaries for
2486 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00002487 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00002488 //
2489 // TCE uses the llvm bitcode as input and uses it for generating customized
2490 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00002491 // publicly available in http://tce.cs.tut.fi
2492
2493 class TCETargetInfo : public TargetInfo{
2494 public:
2495 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2496 TLSSupported = false;
2497 IntWidth = 32;
2498 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00002499 PointerWidth = 32;
2500 IntAlign = 32;
2501 LongAlign = LongLongAlign = 32;
2502 PointerAlign = 32;
2503 SizeType = UnsignedInt;
2504 IntMaxType = SignedLong;
2505 UIntMaxType = UnsignedLong;
2506 IntPtrType = SignedInt;
2507 PtrDiffType = SignedInt;
2508 FloatWidth = 32;
2509 FloatAlign = 32;
2510 DoubleWidth = 32;
2511 DoubleAlign = 32;
2512 LongDoubleWidth = 32;
2513 LongDoubleAlign = 32;
2514 FloatFormat = &llvm::APFloat::IEEEsingle;
2515 DoubleFormat = &llvm::APFloat::IEEEsingle;
2516 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00002517 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2518 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00002519 "f32:32:32-f64:32:32-v64:32:32-"
2520 "v128:32:32-a0:0:32-n32";
Eli Friedmanb63decf2009-08-19 20:47:07 +00002521 }
2522
2523 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002524 MacroBuilder &Builder) const {
2525 DefineStd(Builder, "tce", Opts);
2526 Builder.defineMacro("__TCE__");
2527 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00002528 }
2529 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2530 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00002531 virtual const char *getClobbers() const {
2532 return "";
2533 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002534 virtual const char *getVAListDeclaration() const {
2535 return "typedef void* __builtin_va_list;";
2536 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002537 virtual void getGCCRegNames(const char * const *&Names,
2538 unsigned &NumNames) const {}
2539 virtual bool validateAsmConstraint(const char *&Name,
2540 TargetInfo::ConstraintInfo &info) const {
2541 return true;
2542 }
2543 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2544 unsigned &NumAliases) const {}
2545 };
2546}
2547
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002548namespace {
2549class MipsTargetInfo : public TargetInfo {
Eric Christophered734732010-03-02 02:41:08 +00002550 std::string ABI, CPU;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002551 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2552 static const char * const GCCRegNames[];
2553public:
Eric Christophered734732010-03-02 02:41:08 +00002554 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002555 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanaka619e8872011-06-02 00:09:17 +00002556 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
2557 SizeType = UnsignedInt;
2558 PtrDiffType = SignedInt;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002559 }
Eric Christophered734732010-03-02 02:41:08 +00002560 virtual const char *getABI() const { return ABI.c_str(); }
2561 virtual bool setABI(const std::string &Name) {
2562
2563 if ((Name == "o32") || (Name == "eabi")) {
2564 ABI = Name;
2565 return true;
2566 } else
2567 return false;
2568 }
2569 virtual bool setCPU(const std::string &Name) {
2570 CPU = Name;
2571 return true;
2572 }
2573 void getDefaultFeatures(const std::string &CPU,
2574 llvm::StringMap<bool> &Features) const {
2575 Features[ABI] = true;
2576 Features[CPU] = true;
2577 }
2578 virtual void getArchDefines(const LangOptions &Opts,
2579 MacroBuilder &Builder) const {
2580 if (ABI == "o32")
2581 Builder.defineMacro("__mips_o32");
2582 else if (ABI == "eabi")
2583 Builder.defineMacro("__mips_eabi");
2584 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002585 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002586 MacroBuilder &Builder) const {
2587 DefineStd(Builder, "mips", Opts);
2588 Builder.defineMacro("_mips");
2589 DefineStd(Builder, "MIPSEB", Opts);
2590 Builder.defineMacro("_MIPSEB");
2591 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002592 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002593 }
2594 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2595 unsigned &NumRecords) const {
2596 // FIXME: Implement!
2597 }
2598 virtual const char *getVAListDeclaration() const {
2599 return "typedef void* __builtin_va_list;";
2600 }
2601 virtual void getGCCRegNames(const char * const *&Names,
2602 unsigned &NumNames) const;
2603 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2604 unsigned &NumAliases) const;
2605 virtual bool validateAsmConstraint(const char *&Name,
2606 TargetInfo::ConstraintInfo &Info) const {
2607 switch (*Name) {
2608 default:
2609 case 'r': // CPU registers.
2610 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2611 case 'y': // Equivalent to "r", backwards compatibility only.
2612 case 'f': // floating-point registers.
2613 Info.setAllowsRegister();
2614 return true;
2615 }
2616 return false;
2617 }
2618
2619 virtual const char *getClobbers() const {
2620 // FIXME: Implement!
2621 return "";
2622 }
2623};
2624
2625const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer20249a12010-10-21 03:16:25 +00002626 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002627 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2628 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2629 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2630 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2631 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2632 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2633 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2634 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2635 "$fcc5","$fcc6","$fcc7"
2636};
2637
2638void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2639 unsigned &NumNames) const {
2640 Names = GCCRegNames;
2641 NumNames = llvm::array_lengthof(GCCRegNames);
2642}
2643
2644const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2645 { { "at" }, "$1" },
2646 { { "v0" }, "$2" },
2647 { { "v1" }, "$3" },
2648 { { "a0" }, "$4" },
2649 { { "a1" }, "$5" },
2650 { { "a2" }, "$6" },
2651 { { "a3" }, "$7" },
2652 { { "t0" }, "$8" },
2653 { { "t1" }, "$9" },
2654 { { "t2" }, "$10" },
2655 { { "t3" }, "$11" },
2656 { { "t4" }, "$12" },
2657 { { "t5" }, "$13" },
2658 { { "t6" }, "$14" },
2659 { { "t7" }, "$15" },
2660 { { "s0" }, "$16" },
2661 { { "s1" }, "$17" },
2662 { { "s2" }, "$18" },
2663 { { "s3" }, "$19" },
2664 { { "s4" }, "$20" },
2665 { { "s5" }, "$21" },
2666 { { "s6" }, "$22" },
2667 { { "s7" }, "$23" },
2668 { { "t8" }, "$24" },
2669 { { "t9" }, "$25" },
2670 { { "k0" }, "$26" },
2671 { { "k1" }, "$27" },
2672 { { "gp" }, "$28" },
2673 { { "sp" }, "$29" },
2674 { { "fp" }, "$30" },
2675 { { "ra" }, "$31" }
2676};
2677
2678void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2679 unsigned &NumAliases) const {
2680 Aliases = GCCRegAliases;
2681 NumAliases = llvm::array_lengthof(GCCRegAliases);
2682}
2683} // end anonymous namespace.
2684
2685namespace {
2686class MipselTargetInfo : public MipsTargetInfo {
2687public:
2688 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2689 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanaka619e8872011-06-02 00:09:17 +00002690 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002691 }
2692
2693 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002694 MacroBuilder &Builder) const;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002695};
2696
2697void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002698 MacroBuilder &Builder) const {
2699 DefineStd(Builder, "mips", Opts);
2700 Builder.defineMacro("_mips");
2701 DefineStd(Builder, "MIPSEL", Opts);
2702 Builder.defineMacro("_MIPSEL");
2703 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002704 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002705}
2706} // end anonymous namespace.
2707
Reid Spencer5f016e22007-07-11 17:01:13 +00002708//===----------------------------------------------------------------------===//
2709// Driver code
2710//===----------------------------------------------------------------------===//
2711
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002712static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002713 llvm::Triple Triple(T);
2714 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00002715
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002716 switch (Triple.getArch()) {
2717 default:
2718 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00002719
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002720 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00002721 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002722 if (Triple.isOSDarwin())
2723 return new DarwinARMTargetInfo(T);
2724
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002725 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00002726 case llvm::Triple::Linux:
2727 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002728 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002729 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002730 default:
2731 return new ARMTargetInfo(T);
2732 }
Eli Friedman61538a72008-05-20 14:21:01 +00002733
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002734 case llvm::Triple::bfin:
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002735 return new BlackfinTargetInfo(T);
2736
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002737 case llvm::Triple::msp430:
2738 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00002739
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002740 case llvm::Triple::mips:
2741 if (os == llvm::Triple::Psp)
2742 return new PSPTargetInfo<MipsTargetInfo>(T);
2743 if (os == llvm::Triple::Linux)
2744 return new LinuxTargetInfo<MipsTargetInfo>(T);
2745 return new MipsTargetInfo(T);
2746
2747 case llvm::Triple::mipsel:
2748 if (os == llvm::Triple::Psp)
2749 return new PSPTargetInfo<MipselTargetInfo>(T);
2750 if (os == llvm::Triple::Linux)
2751 return new LinuxTargetInfo<MipselTargetInfo>(T);
2752 return new MipselTargetInfo(T);
2753
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002754 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002755 if (Triple.isOSDarwin())
Roman Divackyc81f2a22011-01-06 08:27:10 +00002756 return new DarwinPPC32TargetInfo(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002757 else if (os == llvm::Triple::FreeBSD)
2758 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002759 return new PPC32TargetInfo(T);
2760
2761 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002762 if (Triple.isOSDarwin())
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00002763 return new DarwinPPC64TargetInfo(T);
John Thompson3f6918a2009-11-19 17:18:50 +00002764 else if (os == llvm::Triple::Lv2)
2765 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002766 else if (os == llvm::Triple::FreeBSD)
2767 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002768 return new PPC64TargetInfo(T);
2769
Justin Holewinski285dc652011-04-20 19:34:15 +00002770 case llvm::Triple::ptx32:
2771 return new PTX32TargetInfo(T);
2772 case llvm::Triple::ptx64:
2773 return new PTX64TargetInfo(T);
2774
Chris Lattner9cbeb632010-03-06 21:21:27 +00002775 case llvm::Triple::mblaze:
2776 return new MBlazeTargetInfo(T);
2777
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002778 case llvm::Triple::sparc:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002779 if (os == llvm::Triple::AuroraUX)
2780 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002781 if (os == llvm::Triple::Solaris)
2782 return new SolarisSparcV8TargetInfo(T);
2783 return new SparcV8TargetInfo(T);
2784
John Thompson3f6918a2009-11-19 17:18:50 +00002785 // FIXME: Need a real SPU target.
2786 case llvm::Triple::cellspu:
2787 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2788
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002789 case llvm::Triple::systemz:
2790 return new SystemZTargetInfo(T);
2791
Eli Friedmanb63decf2009-08-19 20:47:07 +00002792 case llvm::Triple::tce:
2793 return new TCETargetInfo(T);
2794
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002795 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002796 if (Triple.isOSDarwin())
2797 return new DarwinI386TargetInfo(T);
2798
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002799 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002800 case llvm::Triple::AuroraUX:
2801 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002802 case llvm::Triple::Linux:
2803 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2804 case llvm::Triple::DragonFly:
2805 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2806 case llvm::Triple::NetBSD:
2807 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2808 case llvm::Triple::OpenBSD:
2809 return new OpenBSDI386TargetInfo(T);
2810 case llvm::Triple::FreeBSD:
2811 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00002812 case llvm::Triple::Minix:
2813 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002814 case llvm::Triple::Solaris:
2815 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2816 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002817 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002818 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002819 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002820 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00002821 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00002822 case llvm::Triple::Haiku:
2823 return new HaikuX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002824 default:
2825 return new X86_32TargetInfo(T);
2826 }
2827
2828 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002829 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
2830 return new DarwinX86_64TargetInfo(T);
2831
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002832 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002833 case llvm::Triple::AuroraUX:
2834 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002835 case llvm::Triple::Linux:
2836 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00002837 case llvm::Triple::DragonFly:
2838 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002839 case llvm::Triple::NetBSD:
2840 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2841 case llvm::Triple::OpenBSD:
2842 return new OpenBSDX86_64TargetInfo(T);
2843 case llvm::Triple::FreeBSD:
2844 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2845 case llvm::Triple::Solaris:
2846 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00002847 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002848 return new MinGWX86_64TargetInfo(T);
2849 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002850 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002851 default:
2852 return new X86_64TargetInfo(T);
2853 }
2854 }
Reid Spencer5f016e22007-07-11 17:01:13 +00002855}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002856
2857/// CreateTargetInfo - Return the target info object for the specified target
2858/// triple.
2859TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002860 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002861 llvm::Triple Triple(Opts.Triple);
2862
2863 // Construct the target
2864 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2865 if (!Target) {
2866 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2867 return 0;
2868 }
2869
Daniel Dunbareac7c532009-12-18 18:42:37 +00002870 // Set the target CPU if specified.
2871 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2872 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2873 return 0;
2874 }
2875
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002876 // Set the target ABI if specified.
2877 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2878 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2879 return 0;
2880 }
2881
Charles Davis98b7c5c2010-06-11 01:06:47 +00002882 // Set the target C++ ABI.
John McCallee79a4c2010-08-21 22:46:04 +00002883 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis98b7c5c2010-06-11 01:06:47 +00002884 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2885 return 0;
2886 }
2887
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002888 // Compute the default target features, we need the target to handle this
2889 // because features may have dependencies on one another.
2890 llvm::StringMap<bool> Features;
2891 Target->getDefaultFeatures(Opts.CPU, Features);
2892
2893 // Apply the user specified deltas.
2894 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2895 ie = Opts.Features.end(); it != ie; ++it) {
2896 const char *Name = it->c_str();
2897
2898 // Apply the feature via the target.
2899 if ((Name[0] != '-' && Name[0] != '+') ||
2900 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2901 Diags.Report(diag::err_target_invalid_feature) << Name;
2902 return 0;
2903 }
2904 }
2905
2906 // Add the features to the compile options.
2907 //
2908 // FIXME: If we are completely confident that we have the right set, we only
2909 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002910 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002911 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2912 ie = Features.end(); it != ie; ++it)
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002913 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2914 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002915
2916 return Target.take();
2917}