blob: 779c99532cb2c507a9ed5e5dc8f504748e5845a2 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000023#include "llvm/ADT/OwningPtr.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
Dale Johannesen182addf2010-10-29 23:24:33 +000029#include "llvm/Type.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000030#include <algorithm>
Chris Lattner5ba61f02006-10-14 07:39:34 +000031using namespace clang;
32
Chris Lattner5ba61f02006-10-14 07:39:34 +000033//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000034// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000035//===----------------------------------------------------------------------===//
36
Chris Lattner1e1c0b92009-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 Kramer2d6fda32010-01-09 17:55:51 +000040static void DefineStd(MacroBuilder &Builder, llvm::StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041 const LangOptions &Opts) {
42 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000043
Chris Lattner1e1c0b92009-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 Kramer2d6fda32010-01-09 17:55:51 +000047 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000048
Chris Lattner1e1c0b92009-03-20 16:06:38 +000049 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000050 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000051
Chris Lattner1e1c0b92009-03-20 16:06:38 +000052 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054}
55
Chris Lattner09d98f52008-10-05 21:50:58 +000056//===----------------------------------------------------------------------===//
57// Defines specific to certain operating systems.
58//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000059
Torok Edwinb2b37c62009-06-30 17:10:35 +000060namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000061template<typename TgtInfo>
62class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000063protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000064 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000065 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000066public:
Douglas Gregorc05d2a12009-07-01 15:12:53 +000067 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Torok Edwinb2b37c62009-06-30 17:10:35 +000068 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000069 MacroBuilder &Builder) const {
70 TgtInfo::getTargetDefines(Opts, Builder);
71 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000072 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000073
74};
Chris Lattner859c37a2009-08-12 06:24:27 +000075} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000076
Chris Lattner30ba6742009-08-10 19:03:04 +000077
Daniel Dunbard86666f2010-01-26 01:44:04 +000078static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000079 const llvm::Triple &Triple,
80 llvm::StringRef &PlatformName,
81 VersionTuple &PlatformMinVersion) {
Benjamin Kramer2d6fda32010-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 Korobeynikov9d026dd2009-05-03 13:42:53 +000086
Chris Lattner2a5c0a32009-04-07 16:50:40 +000087 // __weak is always defined, for use in blocks and with objc pointers.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000089
Chris Lattner2a5c0a32009-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 Kramer2d6fda32010-01-09 17:55:51 +000092 Builder.defineMacro("__strong", "");
Chris Lattner2a5c0a32009-04-07 16:50:40 +000093 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000094 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
Eli Friedmanfd4b1552009-06-04 23:00:29 +000095
96 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000097 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +000098 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000099 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000100
101 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000102 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000103
Daniel Dunbarecf13562011-04-19 21:40:34 +0000104 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000105 unsigned Maj, Min, Rev;
Mike Stump11289f42009-09-09 15:08:12 +0000106
Daniel Dunbard86666f2010-01-26 01:44:04 +0000107 // If no version was given, default to to 10.4.0, for simplifying tests.
Daniel Dunbarecf13562011-04-19 21:40:34 +0000108 if (Triple.getOSName() == "darwin" || Triple.getOSName() == "osx") {
109 PlatformName = "macosx";
Daniel Dunbard86666f2010-01-26 01:44:04 +0000110 Min = Rev = 0;
111 Maj = 8;
Daniel Dunbarecf13562011-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 Dunbarecf13562011-04-19 21:40:34 +0000124 PlatformName = "macosx";
125 Rev = Min;
126 Min = Maj - 4;
127 Maj = 10;
128 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000129 } else {
Daniel Dunbarecf13562011-04-19 21:40:34 +0000130 Triple.getOSVersion(Maj, Min, Rev);
Daniel Dunbarfcd23892011-04-19 23:34:21 +0000131 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000132 }
133 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000134
135 // Set the appropriate OS version define.
Daniel Dunbarecf13562011-04-19 21:40:34 +0000136 if (PlatformName == "ios") {
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000137 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbard86666f2010-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 Dunbarbbd48222011-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 Dunbard86666f2010-01-26 01:44:04 +0000151 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000152 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbard86666f2010-01-26 01:44:04 +0000153 char Str[5];
154 Str[0] = '0' + (Maj / 10);
155 Str[1] = '0' + (Maj % 10);
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000156 Str[2] = '0' + std::min(Min, 9U);
157 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbard86666f2010-01-26 01:44:04 +0000158 Str[4] = '\0';
159 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000160 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000161
162 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000163}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000164
Chris Lattner30ba6742009-08-10 19:03:04 +0000165namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000166template<typename Target>
167class DarwinTargetInfo : public OSTargetInfo<Target> {
168protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000169 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000170 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000171 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
172 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000173 }
Mike Stump11289f42009-09-09 15:08:12 +0000174
Torok Edwinb2b37c62009-06-30 17:10:35 +0000175public:
176 DarwinTargetInfo(const std::string& triple) :
177 OSTargetInfo<Target>(triple) {
Eric Christopher17c7b892010-06-25 19:04:52 +0000178 this->TLSSupported = llvm::Triple(triple).getDarwinMajorNumber() > 10;
Daniel Dunbar13adc7f2011-02-21 23:12:51 +0000179 this->MCountName = "\01mcount";
Torok Edwinb2b37c62009-06-30 17:10:35 +0000180 }
181
Anders Carlsson0b0a1222010-01-30 18:33:31 +0000182 virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000183 // Let MCSectionMachO validate this.
184 llvm::StringRef Segment, Section;
185 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000186 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000187 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000188 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000189 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000190
Anders Carlsson851318a2010-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. Spencer4c0ffa82010-10-21 03:16:25 +0000195
Torok Edwinb2b37c62009-06-30 17:10:35 +0000196};
197
Chris Lattner30ba6742009-08-10 19:03:04 +0000198
Torok Edwinb2b37c62009-06-30 17:10:35 +0000199// DragonFlyBSD Target
200template<typename Target>
201class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
202protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000203 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000204 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000205 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-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 Edwinb2b37c62009-06-30 17:10:35 +0000212 }
213public:
Mike Stump11289f42009-09-09 15:08:12 +0000214 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000215 : OSTargetInfo<Target>(triple) {}
216};
217
218// FreeBSD Target
219template<typename Target>
220class FreeBSDTargetInfo : public OSTargetInfo<Target> {
221protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000222 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000223 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000224 // FreeBSD defines; list based off of gcc output
225
Daniel Dunbar40165182009-08-24 09:10:05 +0000226 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000227 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000228
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000229 Builder.defineMacro("__FreeBSD__", Release);
230 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000231 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
232 DefineStd(Builder, "unix", Opts);
233 Builder.defineMacro("__ELF__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234 }
235public:
Mike Stump11289f42009-09-09 15:08:12 +0000236 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands9cb27e92009-07-08 13:55:08 +0000237 : OSTargetInfo<Target>(triple) {
238 this->UserLabelPrefix = "";
Roman Divacky178e01602011-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 Sands9cb27e92009-07-08 13:55:08 +0000258 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000259};
260
Chris Lattner3e2ee142010-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 Edwinb2b37c62009-06-30 17:10:35 +0000285// Linux target
286template<typename Target>
287class LinuxTargetInfo : public OSTargetInfo<Target> {
288protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000289 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000290 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000291 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-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 Dunbara77eaeb2009-09-03 04:54:28 +0000296 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000297 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000298 if (Opts.CPlusPlus)
299 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000300 }
301public:
Mike Stump11289f42009-09-09 15:08:12 +0000302 LinuxTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 : OSTargetInfo<Target>(triple) {
304 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000305 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000306 }
307};
308
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000309// NetBSD Target
310template<typename Target>
311class NetBSDTargetInfo : public OSTargetInfo<Target> {
312protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000313 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000314 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000315 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000316 Builder.defineMacro("__NetBSD__");
317 Builder.defineMacro("__unix__");
318 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000319 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000320 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000321 }
322public:
Mike Stump11289f42009-09-09 15:08:12 +0000323 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000324 : OSTargetInfo<Target>(triple) {
325 this->UserLabelPrefix = "";
326 }
327};
328
Torok Edwinb2b37c62009-06-30 17:10:35 +0000329// OpenBSD Target
330template<typename Target>
331class OpenBSDTargetInfo : public OSTargetInfo<Target> {
332protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000333 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000334 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000335 // OpenBSD defines; list based off of gcc output
336
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000337 Builder.defineMacro("__OpenBSD__");
338 DefineStd(Builder, "unix", Opts);
339 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000340 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000341 Builder.defineMacro("_POSIX_THREADS");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342 }
343public:
Mike Stump11289f42009-09-09 15:08:12 +0000344 OpenBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000345 : OSTargetInfo<Target>(triple) {}
346};
347
Edward O'Callaghane9a58b12009-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 Kramer2d6fda32010-01-09 17:55:51 +0000353 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000354 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000355 Builder.defineMacro("PSP");
356 Builder.defineMacro("_PSP");
357 Builder.defineMacro("__psp__");
358 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000359 }
360public:
361 PSPTargetInfo(const std::string& triple)
362 : OSTargetInfo<Target>(triple) {
363 this->UserLabelPrefix = "";
364 }
365};
366
John Thompsone467e192009-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 Kramer2d6fda32010-01-09 17:55:51 +0000372 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000373 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000374 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000375 Builder.defineMacro("__PPU__");
376 Builder.defineMacro("__CELLOS_LV2__");
377 Builder.defineMacro("__ELF__");
378 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000379 Builder.defineMacro("_ARCH_PPC64");
380 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000381 }
382public:
383 PS3PPUTargetInfo(const std::string& triple)
384 : OSTargetInfo<Target>(triple) {
385 this->UserLabelPrefix = "";
John Thompson6f8dba72009-12-18 14:21:08 +0000386 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000387 this->IntMaxType = TargetInfo::SignedLongLong;
388 this->UIntMaxType = TargetInfo::UnsignedLongLong;
389 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000390 this->SizeType = TargetInfo::UnsignedInt;
John Thompson07a61a42010-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 Thompsone467e192009-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 Kramer2d6fda32010-01-09 17:55:51 +0000402 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000403 // PS3 PPU defines.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000404 Builder.defineMacro("__SPU__");
405 Builder.defineMacro("__ELF__");
John Thompsone467e192009-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'Callaghan9dda8e982009-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 Kramer2d6fda32010-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'Callaghan9dda8e982009-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 Edwinb2b37c62009-06-30 17:10:35 +0000435// Solaris target
436template<typename Target>
437class SolarisTargetInfo : public OSTargetInfo<Target> {
438protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000439 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-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 Edwinb2b37c62009-06-30 17:10:35 +0000446 }
447public:
Mike Stump11289f42009-09-09 15:08:12 +0000448 SolarisTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-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. Spencer4992ca4b2010-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. Spencer54bf3c32010-10-21 08:22:51 +0000462 Builder.defineMacro("_WIN32");
463 }
464 void getVisualStudioDefines(const LangOptions &Opts,
465 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-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. Spencer54bf3c32010-10-21 08:22:51 +0000481
Michael J. Spencer4992ca4b2010-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. Spencer4992ca4b2010-10-21 05:21:48 +0000496 }
497
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000498public:
499 WindowsTargetInfo(const std::string &triple)
500 : OSTargetInfo<Target>(triple) {}
501};
502
Mike Stump11289f42009-09-09 15:08:12 +0000503} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000504
Chris Lattner09d98f52008-10-05 21:50:58 +0000505//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000506// Specific target implementations.
507//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000508
Eli Friedmanb9e5bed2008-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 Friedman9ffd4a92009-06-05 07:05:05 +0000517 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
518
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000519 virtual void getTargetBuiltins(const Builtin::Info *&Records,
520 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000521 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000522 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000523 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000524
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000525 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000526 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000527
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000528 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000529 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000530 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000531 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000532 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000533 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000534 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000535 default: return false;
536 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000537 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000538 case 'b': // Base register
539 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000540 Info.setAllowsRegister();
John Thompson07a61a42010-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. Spencer4c0ffa82010-10-21 03:16:25 +0000545 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-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. Spencer4c0ffa82010-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 Thompson07a61a42010-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. Spencer4c0ffa82010-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 Thompson07a61a42010-06-24 22:44:13 +0000569 Info.setAllowsRegister();
570 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000571 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000572 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-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 Thompson07a61a42010-06-24 22:44:13 +0000579 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000580 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000581 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000582 // into a register using three instructions
John Thompson07a61a42010-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 Redldd008712010-08-17 22:42:34 +0000589 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000590 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000591 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000592 // is correct but:
John Thompson07a61a42010-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. Spencer4c0ffa82010-10-21 03:16:25 +0000595 // register to be updated.
596 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000597 if (Name[1] != 's')
598 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000599 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-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 Thompsonceebdf12010-06-25 00:02:05 +0000603 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000604 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000605 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000606 break;
607 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000608 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-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. Spencer4c0ffa82010-10-21 03:16:25 +0000611 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000612 Info.setAllowsMemory();
613 Info.setAllowsRegister();
614 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000615 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000616 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-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 Thompson07a61a42010-06-24 22:44:13 +0000621 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-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 Thompson07a61a42010-06-24 22:44:13 +0000625 break;
626 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000627 }
John Thompson07a61a42010-06-24 22:44:13 +0000628 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000629 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000630 virtual const char *getClobbers() const {
631 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000632 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000633};
Anders Carlssonf511f642007-11-27 04:11:28 +0000634
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000635const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-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 Lattner5abdec72009-06-14 01:05:48 +0000639#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000640};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000641
642
Chris Lattnerecd49032009-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 Lattner4ba73aa02009-03-20 15:52:06 +0000645void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000646 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000647 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000648 Builder.defineMacro("__ppc__");
649 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000650 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000651 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000652 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000653 Builder.defineMacro("_ARCH_PPC64");
654 Builder.defineMacro("_LP64");
655 Builder.defineMacro("__LP64__");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000656 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000657 Builder.defineMacro("__ppc64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000658 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000659 Builder.defineMacro("__ppc__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000660 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000661
Chris Lattnerecd49032009-03-02 22:27:17 +0000662 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000663 Builder.defineMacro("_BIG_ENDIAN");
664 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000665
Chris Lattnerecd49032009-03-02 22:27:17 +0000666 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000667 Builder.defineMacro("__NATURAL_ALIGNMENT__");
668 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000669
Chris Lattnerecd49032009-03-02 22:27:17 +0000670 // FIXME: Should be controlled by command line option.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000671 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000672
John Thompsone467e192009-11-19 17:18:50 +0000673 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000674 Builder.defineMacro("__VEC__", "10206");
675 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000676 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000677}
678
Chris Lattner17df24e2008-04-21 18:56:49 +0000679
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000680const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-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 Friedmanb9e5bed2008-08-20 23:11:40 +0000689 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000690 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000691 "xer",
Chris Lattnerf7ff53d2009-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 Friedmanb9e5bed2008-08-20 23:11:40 +0000696 "vrsave", "vscr",
697 "spe_acc", "spefscr",
698 "sfp"
699};
Chris Lattner10a5b382007-01-29 05:24:35 +0000700
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000701void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000702 unsigned &NumNames) const {
703 Names = GCCRegNames;
704 NumNames = llvm::array_lengthof(GCCRegNames);
705}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000706
Eli Friedmanb9e5bed2008-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 Dunbar1da76c42009-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 Stumpfaacf012009-09-17 21:15:00 +0000752 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-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 Friedmanb9e5bed2008-08-20 23:11:40 +0000775};
776
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000777void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000778 unsigned &NumAliases) const {
779 Aliases = GCCRegAliases;
780 NumAliases = llvm::array_lengthof(GCCRegAliases);
781}
782} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000783
Chris Lattner5ba61f02006-10-14 07:39:34 +0000784namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000785class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000786public:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000787 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedman873f65a2008-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 Lattner5c67237f2009-11-07 18:59:41 +0000789 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000790
791 if (getTriple().getOS() == llvm::Triple::FreeBSD)
Roman Divacky965b0b72011-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 Friedman873f65a2008-08-21 00:13:15 +0000804 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000805};
806} // end anonymous namespace.
807
808namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000809class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000810public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000811 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000812 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +0000813 IntMaxType = SignedLong;
814 UIntMaxType = UnsignedLong;
815 Int64Type = SignedLong;
Eli Friedman873f65a2008-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 Lattner5c67237f2009-11-07 18:59:41 +0000817 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000818 }
Roman Divacky965b0b72011-01-06 08:27:10 +0000819 virtual const char *getVAListDeclaration() const {
820 return "typedef char* __builtin_va_list;";
821 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000822};
823} // end anonymous namespace.
824
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000825
826namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +0000827class DarwinPPC32TargetInfo :
828 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000829public:
Roman Divacky965b0b72011-01-06 08:27:10 +0000830 DarwinPPC32TargetInfo(const std::string& triple)
831 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000832 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-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 Dunbar0e15c9a2010-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
Chris Lattner5ba61f02006-10-14 07:39:34 +0000850namespace {
Justin Holewinski514cce82011-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 Lattner5178f562010-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 Peck69bf1282010-12-12 20:56:47 +0000939 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner5178f562010-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 Friedman3fd920a2008-08-20 02:34:37 +00001059// Namespace for x86 abstract base class
1060const Builtin::Info BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-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 Lattner5abdec72009-06-14 01:05:48 +00001064#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001065};
Eli Friedmanb5366062008-05-20 14:21:01 +00001066
Nuno Lopescfca1f02009-12-23 17:49:57 +00001067static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-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 Lattner96e43572009-03-02 22:40:39 +00001091 enum X86SSEEnum {
1092 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
1093 } SSELevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001094 enum AMD3DNowEnum {
1095 NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
1096 } AMD3DNowLevel;
1097
Eric Christophere1ddaf92010-04-02 23:50:19 +00001098 bool HasAES;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001099 bool HasAVX;
1100
Eli Friedman3fd920a2008-08-20 02:34:37 +00001101public:
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001102 X86TargetInfo(const std::string& triple)
Eric Christophere1ddaf92010-04-02 23:50:19 +00001103 : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001104 HasAES(false), HasAVX(false) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001105 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001106 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001107 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1108 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001109 Records = BuiltinInfo;
1110 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001111 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001112 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001113 unsigned &NumNames) const {
1114 Names = GCCRegNames;
1115 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001116 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001117 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001118 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001119 Aliases = GCCRegAliases;
1120 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +00001121 }
Anders Carlsson58436352009-02-28 17:11:49 +00001122 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001123 TargetInfo::ConstraintInfo &info) const;
1124 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001125 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001126 return "~{dirflag},~{fpsr},~{flags}";
1127 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001128 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001129 MacroBuilder &Builder) const;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001130 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1131 const std::string &Name,
1132 bool Enabled) const;
Mike Stump11289f42009-09-09 15:08:12 +00001133 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001134 llvm::StringMap<bool> &Features) const;
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001135 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Chris Lattner5ba61f02006-10-14 07:39:34 +00001136};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001137
Mike Stump11289f42009-09-09 15:08:12 +00001138void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001139 llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-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 Christophere1ddaf92010-04-02 23:50:19 +00001150 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001151 Features["avx"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001152
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001153 // LLVM does not currently recognize this.
1154 // Features["sse4a"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001155
Daniel Dunbar4dbaaa62009-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 Dunbarf9d90272009-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 Dunbarea1f0982011-05-03 15:34:01 +00001167 else if (CPU == "pentium3")
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001168 setFeatureEnabled(Features, "sse", true);
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001169 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001170 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001171 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001172 setFeatureEnabled(Features, "sse3", true);
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001173 else if (CPU == "core2")
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001174 setFeatureEnabled(Features, "ssse3", true);
Daniel Dunbarea1f0982011-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 Dunbarf9d90272009-05-06 21:56:32 +00001179 setFeatureEnabled(Features, "sse3", true);
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001180 else if (CPU == "corei7") {
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001181 setFeatureEnabled(Features, "sse4", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001182 setFeatureEnabled(Features, "aes", true);
Benjamin Kramer85e16642011-05-20 15:11:23 +00001183 } else if (CPU == "corei7-avx") {
Roman Divacky27ec14f2011-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 Dunbarf9d90272009-05-06 21:56:32 +00001188 setFeatureEnabled(Features, "mmx", true);
Mike Stump11289f42009-09-09 15:08:12 +00001189 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbarf9d90272009-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 Stump11289f42009-09-09 15:08:12 +00001198 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001199 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackydacbfe42010-12-29 13:28:29 +00001200 } else if (CPU == "k8-sse3") {
1201 setFeatureEnabled(Features, "sse3", true);
1202 setFeatureEnabled(Features, "3dnowa", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001203 } else if (CPU == "c3-2")
1204 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001205}
1206
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001207bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump11289f42009-09-09 15:08:12 +00001208 const std::string &Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001209 bool Enabled) const {
Eric Christopher399ffa52010-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 Dunbarbb36aed2009-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 Dunbarea1f0982011-05-03 15:34:01 +00001220 Features["mmx"] = Features["sse"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001221 else if (Name == "sse2")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001222 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001223 else if (Name == "sse3")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001224 Features["mmx"] = Features["sse"] = Features["sse2"] =
1225 Features["sse3"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001226 else if (Name == "ssse3")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001227 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001228 Features["ssse3"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001229 else if (Name == "sse4" || Name == "sse4.2")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001230 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001231 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001232 else if (Name == "sse4.1")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001233 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopher399ffa52010-03-04 02:26:37 +00001234 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001235 else if (Name == "3dnow")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001236 Features["3dnowa"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001237 else if (Name == "3dnowa")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001238 Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001239 else if (Name == "aes")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001240 Features["aes"] = true;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001241 else if (Name == "avx")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001242 Features["avx"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001243 } else {
1244 if (Name == "mmx")
Daniel Dunbarea1f0982011-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 Dunbarbb36aed2009-05-06 21:07:50 +00001248 else if (Name == "sse")
Mike Stump11289f42009-09-09 15:08:12 +00001249 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001250 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001251 else if (Name == "sse2")
Mike Stump11289f42009-09-09 15:08:12 +00001252 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001253 Features["sse41"] = Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001254 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001255 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001256 Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001257 else if (Name == "ssse3")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001258 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencera9e41172011-04-17 19:22:03 +00001259 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001260 Features["sse41"] = Features["sse42"] = false;
Eric Christophercfeceff2010-03-04 02:31:44 +00001261 else if (Name == "sse4.2")
Daniel Dunbarea1f0982011-05-03 15:34:01 +00001262 Features["sse42"] = false;
Daniel Dunbarbb36aed2009-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 Christophere1ddaf92010-04-02 23:50:19 +00001267 else if (Name == "aes")
1268 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001269 else if (Name == "avx")
1270 Features["avx"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001271 }
1272
1273 return true;
1274}
1275
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001276/// HandleTargetOptions - Perform initialization based on the user
1277/// configured set of features.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001278void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar979586e2009-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 Christophere1ddaf92010-04-02 23:50:19 +00001285 if (Features[i].substr(1) == "aes") {
1286 HasAES = true;
1287 continue;
1288 }
1289
Bruno Cardoso Lopesd81ef1c2010-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 Dunbar979586e2009-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 Lopes4cbc8bd2010-03-12 10:20:09 +00001302 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-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. Spencer4c0ffa82010-10-21 03:16:25 +00001308
1309 AMD3DNowEnum ThreeDNowLevel =
Anders Carlssone437c682010-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. Spencer4c0ffa82010-10-21 03:16:25 +00001314
Anders Carlssone437c682010-01-27 03:47:49 +00001315 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001316 }
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001317}
Chris Lattnerecd49032009-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 Lattner4ba73aa02009-03-20 15:52:06 +00001321void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001322 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001323 // Target identification.
1324 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-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 Lattnerecd49032009-03-02 22:27:17 +00001331 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001332 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00001333 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001334
Eric Christophere1ddaf92010-04-02 23:50:19 +00001335 if (HasAES)
1336 Builder.defineMacro("__AES__");
1337
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001338 if (HasAVX)
1339 Builder.defineMacro("__AVX__");
1340
Chris Lattnerecd49032009-03-02 22:27:17 +00001341 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001342 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001343
Chris Lattnerecd49032009-03-02 22:27:17 +00001344 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001345 Builder.defineMacro("__nocona");
1346 Builder.defineMacro("__nocona__");
1347 Builder.defineMacro("__tune_nocona__");
1348 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner96e43572009-03-02 22:40:39 +00001349
Chris Lattner6df41af2009-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 Kramer2d6fda32010-01-09 17:55:51 +00001353 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001354
Chris Lattner96e43572009-03-02 22:40:39 +00001355 // Each case falls through to the previous one here.
1356 switch (SSELevel) {
1357 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001358 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00001359 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001360 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00001361 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001362 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001363 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001364 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001365 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001366 Builder.defineMacro("__SSE2__");
1367 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001368 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001369 Builder.defineMacro("__SSE__");
1370 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001371 case MMX:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001372 Builder.defineMacro("__MMX__");
Chris Lattner96e43572009-03-02 22:40:39 +00001373 case NoMMXSSE:
1374 break;
1375 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001376
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001377 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001378 switch (SSELevel) {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001379 case SSE42:
1380 case SSE41:
1381 case SSSE3:
1382 case SSE3:
Michael J. Spencer4992ca4b2010-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 Carlssone437c682010-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 Lattnerecd49032009-03-02 22:27:17 +00001403}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001404
1405
Eli Friedman3fd920a2008-08-20 02:34:37 +00001406bool
Anders Carlsson58436352009-02-28 17:11:49 +00001407X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001408 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00001409 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001410 default: return false;
Dale Johannesen46742a42010-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 Friedman3fd920a2008-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 Johannesen46742a42010-08-24 22:33:12 +00001427 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-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 Carlsson83661ac2008-10-06 00:41:45 +00001431 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00001432 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001433 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-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 Korobeynikov9d026dd2009-05-03 13:42:53 +00001441 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001442 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001443 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001444 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001445 return true;
1446 }
Dale Johannesen46742a42010-08-24 22:33:12 +00001447 return false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001448}
1449
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00001450
Eli Friedman3fd920a2008-08-20 02:34:37 +00001451std::string
1452X86TargetInfo::convertConstraint(const char Constraint) const {
1453 switch (Constraint) {
1454 case 'a': return std::string("{ax}");
1455 case 'b': return std::string("{bx}");
1456 case 'c': return std::string("{cx}");
1457 case 'd': return std::string("{dx}");
1458 case 'S': return std::string("{si}");
1459 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00001460 case 'p': // address
1461 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00001462 case 't': // top of floating point stack.
1463 return std::string("{st}");
1464 case 'u': // second from top of floating point stack.
1465 return std::string("{st(1)}"); // second from top of floating point stack.
1466 default:
1467 return std::string(1, Constraint);
1468 }
1469}
Eli Friedman3fd920a2008-08-20 02:34:37 +00001470} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00001471
1472namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001473// X86-32 generic target
1474class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001475public:
Eli Friedman3fd920a2008-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 Friedman873f65a2008-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 Lattner5c67237f2009-11-07 18:59:41 +00001482 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman32ca82a2009-03-29 20:31:09 +00001483 SizeType = UnsignedInt;
1484 PtrDiffType = SignedInt;
1485 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001486 RegParmMax = 3;
Daniel Dunbar6f2e8392010-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 Friedman3fd920a2008-08-20 02:34:37 +00001492 }
1493 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001494 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +00001495 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001496
Chris Lattnerd545ad12009-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 Friedman3fd920a2008-08-20 02:34:37 +00001502};
1503} // end anonymous namespace
1504
1505namespace {
Eli Friedmane3aa4542009-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 Friedman245f2292009-07-05 22:31:18 +00001512 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00001513 }
1514};
1515} // end anonymous namespace
1516
1517namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00001518class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001519public:
Torok Edwinb2b37c62009-06-30 17:10:35 +00001520 DarwinI386TargetInfo(const std::string& triple) :
1521 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001522 LongDoubleWidth = 128;
1523 LongDoubleAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00001524 SizeType = UnsignedLong;
1525 IntPtrType = SignedLong;
Eli Friedman873f65a2008-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 Lattner5c67237f2009-11-07 18:59:41 +00001528 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbarbd606522010-05-27 00:35:16 +00001529 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00001530 }
1531
Eli Friedman3fd920a2008-08-20 02:34:37 +00001532};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00001533} // end anonymous namespace
1534
1535namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001536// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001537class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001538public:
1539 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001540 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00001541 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00001542 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-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 Korobeynikovd7e4a092009-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 Friedmanc968a6a2008-08-21 01:40:19 +00001547 }
Michael J. Spencer54bf3c32010-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 Friedman015d6282011-03-22 21:25:11 +00001562 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-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 Dunbar3e7a7232009-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 Kramer2d6fda32010-01-09 17:55:51 +00001585 MacroBuilder &Builder) const {
1586 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001587 DefineStd(Builder, "WIN32", Opts);
1588 DefineStd(Builder, "WINNT", Opts);
1589 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001590 Builder.defineMacro("__MSVCRT__");
1591 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-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 Dunbar3e7a7232009-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 Dunbar3e7a7232009-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 Lattner5c67237f2009-11-07 18:59:41 +00001616 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001617 }
1618 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-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 Gregor3ecc6652010-04-21 05:52:38 +00001624 if (Opts.CPlusPlus)
1625 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00001626 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001627};
1628} // end anonymous namespace
1629
1630namespace {
Chris Lattnerb986aba2010-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 Lattner8b290212010-04-22 17:48:00 +00001637 IntPtrType = SignedLong;
1638 PtrDiffType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00001639 this->UserLabelPrefix = "";
Eli Friedman04831922010-08-22 01:00:03 +00001640 }
Chris Lattnerb986aba2010-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 Friedman3fd920a2008-08-20 02:34:37 +00001651// x86-64 generic target
1652class X86_64TargetInfo : public X86TargetInfo {
1653public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001654 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001655 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00001656 LongDoubleWidth = 128;
1657 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00001658 LargeArrayMinWidth = 128;
1659 LargeArrayAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001660 IntMaxType = SignedLong;
1661 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001662 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001663 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001664
Eli Friedman873f65a2008-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 Lattner5c67237f2009-11-07 18:59:41 +00001667 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001668
1669 // Use fpret only for long double.
1670 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Chris Lattner10a5b382007-01-29 05:24:35 +00001671 }
Anders Carlssona7408e72007-10-13 00:45:48 +00001672 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-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 McCall61d82582010-05-28 18:25:28 +00001678 "} __va_list_tag;"
Eli Friedmanfb36b022009-07-03 00:45:06 +00001679 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001680 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001681
Chris Lattnerd545ad12009-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 Friedman3fd920a2008-08-20 02:34:37 +00001687};
1688} // end anonymous namespace
1689
1690namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001691// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001692class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001693public:
1694 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001695 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001696 TLSSupported = false;
1697 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00001698 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001699 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00001700 IntMaxType = SignedLongLong;
1701 UIntMaxType = UnsignedLongLong;
1702 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00001703 SizeType = UnsignedLongLong;
1704 PtrDiffType = SignedLongLong;
1705 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00001706 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001707 }
1708 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001709 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001710 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001711 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001712 }
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00001713 virtual const char *getVAListDeclaration() const {
1714 return "typedef char* __builtin_va_list;";
1715 }
Michael J. Spencer54bf3c32010-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 Friedman015d6282011-03-22 21:25:11 +00001725 LongDoubleWidth = LongDoubleAlign = 64;
1726 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-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 Kramer2d6fda32010-01-09 17:55:51 +00001732 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001733 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001734 }
Daniel Dunbar3e7a7232009-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 Kramer2d6fda32010-01-09 17:55:51 +00001746 MacroBuilder &Builder) const {
1747 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001748 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001749 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00001750 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001751 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-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 Dunbar3e7a7232009-09-23 07:31:35 +00001761 }
1762};
1763} // end anonymous namespace
1764
1765namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00001766class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1767public:
Mike Stump11289f42009-09-09 15:08:12 +00001768 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman2857ccb2009-07-01 03:36:11 +00001769 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1770 Int64Type = SignedLongLong;
1771 }
1772};
1773} // end anonymous namespace
1774
1775namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00001776class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1777public:
Mike Stump11289f42009-09-09 15:08:12 +00001778 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman245f2292009-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 Friedmanf05b7722008-08-20 07:44:10 +00001788class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-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 Dunbar1da76c42009-09-17 07:03:19 +00001803
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001804 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001805
1806 unsigned FPU : 3;
1807
Daniel Dunbar893d4752009-12-19 04:15:38 +00001808 unsigned IsThumb : 1;
1809
1810 // Initialized via features.
1811 unsigned SoftFloat : 1;
1812 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001813
Chris Lattner5cc15e02010-03-03 19:03:45 +00001814 static const Builtin::Info BuiltinInfo[];
1815
Chris Lattner17df24e2008-04-21 18:56:49 +00001816public:
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001817 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001818 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001819 {
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001820 SizeType = UnsignedInt;
1821 PtrDiffType = SignedInt;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001822
Chris Lattner1a8f3942010-04-23 16:29:58 +00001823 // {} in inline assembly are neon specifiers, not assembly variant
1824 // specifiers.
1825 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001826
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001827 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00001828 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00001829 if (IsThumb) {
Sandeep Patelf87b3732011-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 Dunbar03184792009-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 Wilsone3a15fe2011-04-04 16:53:11 +00001834 "v64:64:64-v128:64:128-a0:0:32-n32");
Daniel Dunbar03184792009-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 Wilsone3a15fe2011-04-04 16:53:11 +00001838 "v64:64:64-v128:64:128-a0:0:64-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001839 }
John McCall86353412010-08-21 22:46:04 +00001840
1841 // ARM targets default to using the ARM C++ ABI.
1842 CXXABI = CXXABI_ARM;
Eli Friedmanb5366062008-05-20 14:21:01 +00001843 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001844 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001845 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001846 ABI = Name;
1847
Daniel Dunbar125f8fb2009-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 Dunbar377dc2f2010-01-27 20:23:08 +00001853 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001854 SizeType = UnsignedLong;
1855
Daniel Dunbarf8125062010-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 Dunbar03184792009-09-22 21:44:58 +00001860 if (IsThumb) {
Sandeep Patelf87b3732011-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 Dunbar03184792009-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 Wilsone3a15fe2011-04-04 16:53:11 +00001865 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbar03184792009-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 Wilsone3a15fe2011-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 Dunbar03184792009-09-22 21:44:58 +00001870 }
1871
Daniel Dunbar125f8fb2009-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 Dunbar893d4752009-12-19 04:15:38 +00001882
Daniel Dunbar0def3d12009-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. Spencer4c0ffa82010-10-21 03:16:25 +00001895
Daniel Dunbar893d4752009-12-19 04:15:38 +00001896 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1897 const std::string &Name,
1898 bool Enabled) const {
Daniel Dunbar0def3d12009-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 Dunbar893d4752009-12-19 04:15:38 +00001907 return false;
1908
Daniel Dunbar893d4752009-12-19 04:15:38 +00001909 return true;
1910 }
1911
1912 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001913 FPU = NoFPU;
Daniel Dunbar893d4752009-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 Dunbar0def3d12009-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 Dunbar893d4752009-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 Dunbaracde99e2009-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 Dunbar0def3d12009-12-21 23:28:17 +00001950 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001951 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001952 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001953 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1954 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson44acad82011-01-06 16:57:20 +00001955 .Case("cortex-m3", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00001956 .Case("cortex-m0", "6M")
Daniel Dunbaracde99e2009-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 Lattner4ba73aa02009-03-20 15:52:06 +00001966 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001967 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001968 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001969 Builder.defineMacro("__arm");
1970 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001971
Chris Lattnerecd49032009-03-02 22:27:17 +00001972 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001973 Builder.defineMacro("__ARMEL__");
1974 Builder.defineMacro("__LITTLE_ENDIAN__");
1975 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001976
1977 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001978 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001979
Mike Stump9d54bd72009-04-08 02:07:04 +00001980 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001981
Daniel Dunbaracde99e2009-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 Kramer2d6fda32010-01-09 17:55:51 +00001985 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001986
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001987 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001988 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001989
Daniel Dunbar893d4752009-12-19 04:15:38 +00001990 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001991 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001992
1993 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001994 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001995
Bob Wilson19c1b882011-05-13 18:56:03 +00001996 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001997 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001998 Builder.defineMacro("__THUMBEL__");
1999 Builder.defineMacro("__thumb__");
Bob Wilson19c1b882011-05-13 18:56:03 +00002000 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002001 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00002002 }
2003
2004 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002005 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00002006
2007 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002008 Builder.defineMacro("__VFP_FP__");
Daniel Dunbar0def3d12009-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 Wilson19c1b882011-05-13 18:56:03 +00002014 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002015 Builder.defineMacro("__ARM_NEON__");
Chris Lattner17df24e2008-04-21 18:56:49 +00002016 }
2017 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2018 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00002019 Records = BuiltinInfo;
2020 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00002021 }
2022 virtual const char *getVAListDeclaration() const {
John McCalle155a3d2011-05-09 02:19:37 +00002023 return "typedef void* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +00002024 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002025 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002026 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002027 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002028 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002029 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002030 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002031 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +00002032 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002033 default:
Nate Begeman2908fa02008-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 Lattnerd9725f72009-04-26 07:16:29 +00002038 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00002039 return true;
2040 }
Chris Lattner17df24e2008-04-21 18:56:49 +00002041 return false;
2042 }
2043 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00002044 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00002045 return "";
2046 }
2047};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002048
2049const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002050 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002051 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002052 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2053
2054 // Float registers
2055 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2056 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2057 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002058 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00002059
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002060 // Double registers
2061 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2062 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00002063 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2064 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002065
2066 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00002067 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2068 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002069};
2070
2071void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00002072 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002073 Names = GCCRegNames;
2074 NumNames = llvm::array_lengthof(GCCRegNames);
2075}
2076
2077const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002078 { { "a1" }, "r0" },
2079 { { "a2" }, "r1" },
2080 { { "a3" }, "r2" },
2081 { { "a4" }, "r3" },
2082 { { "v1" }, "r4" },
2083 { { "v2" }, "r5" },
2084 { { "v3" }, "r6" },
2085 { { "v4" }, "r7" },
2086 { { "v5" }, "r8" },
2087 { { "v6", "rfp" }, "r9" },
2088 { { "sl" }, "r10" },
2089 { { "fp" }, "r11" },
2090 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00002091 { { "r13" }, "sp" },
2092 { { "r14" }, "lr" },
2093 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00002094 // The S, D and Q registers overlap, but aren't really aliases; we
2095 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002096};
2097
2098void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2099 unsigned &NumAliases) const {
2100 Aliases = GCCRegAliases;
2101 NumAliases = llvm::array_lengthof(GCCRegAliases);
2102}
Chris Lattner5cc15e02010-03-03 19:03:45 +00002103
2104const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00002105#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
2106#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
2107 ALL_LANGUAGES, false },
Chris Lattner5cc15e02010-03-03 19:03:45 +00002108#include "clang/Basic/BuiltinsARM.def"
2109};
Chris Lattner17df24e2008-04-21 18:56:49 +00002110} // end anonymous namespace.
2111
Eli Friedmanf05b7722008-08-20 07:44:10 +00002112
2113namespace {
Mike Stump11289f42009-09-09 15:08:12 +00002114class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002115 public DarwinTargetInfo<ARMTargetInfo> {
2116protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00002117 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002118 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00002119 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00002120 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002121
Torok Edwinb2b37c62009-06-30 17:10:35 +00002122public:
Mike Stump11289f42009-09-09 15:08:12 +00002123 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00002124 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2125 HasAlignMac68kSupport = true;
2126 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002127};
2128} // end anonymous namespace.
2129
Chris Lattner5ba61f02006-10-14 07:39:34 +00002130namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002131class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00002132 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2133 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002134 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00002135public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002136 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2137 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +00002138 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00002139 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002140 }
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002141 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2142 const std::string &Name,
2143 bool Enabled) const {
2144 if (Name == "soft-float")
2145 Features[Name] = Enabled;
2146 else
2147 return false;
2148
2149 return true;
2150 }
2151 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2152 SoftFloat = false;
2153 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2154 if (Features[i] == "+soft-float")
2155 SoftFloat = true;
2156 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002157 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002158 MacroBuilder &Builder) const {
2159 DefineStd(Builder, "sparc", Opts);
2160 Builder.defineMacro("__sparcv8");
2161 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002162
2163 if (SoftFloat)
2164 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00002165 }
2166 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2167 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002168 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00002169 }
2170 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002171 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +00002172 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002173 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002174 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002175 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002176 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002177 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00002178 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002179 // FIXME: Implement!
2180 return false;
Gabor Greif49991682008-02-21 16:29:08 +00002181 }
2182 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002183 // FIXME: Implement!
2184 return "";
Gabor Greif49991682008-02-21 16:29:08 +00002185 }
2186};
2187
Chris Lattner9b415d62009-01-27 01:58:38 +00002188const char * const SparcV8TargetInfo::GCCRegNames[] = {
2189 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2190 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2191 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2192 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2193};
2194
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002195void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002196 unsigned &NumNames) const {
2197 Names = GCCRegNames;
2198 NumNames = llvm::array_lengthof(GCCRegNames);
2199}
2200
2201const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002202 { { "g0" }, "r0" },
2203 { { "g1" }, "r1" },
2204 { { "g2" }, "r2" },
2205 { { "g3" }, "r3" },
2206 { { "g4" }, "r4" },
2207 { { "g5" }, "r5" },
2208 { { "g6" }, "r6" },
2209 { { "g7" }, "r7" },
2210 { { "o0" }, "r8" },
2211 { { "o1" }, "r9" },
2212 { { "o2" }, "r10" },
2213 { { "o3" }, "r11" },
2214 { { "o4" }, "r12" },
2215 { { "o5" }, "r13" },
2216 { { "o6", "sp" }, "r14" },
2217 { { "o7" }, "r15" },
2218 { { "l0" }, "r16" },
2219 { { "l1" }, "r17" },
2220 { { "l2" }, "r18" },
2221 { { "l3" }, "r19" },
2222 { { "l4" }, "r20" },
2223 { { "l5" }, "r21" },
2224 { { "l6" }, "r22" },
2225 { { "l7" }, "r23" },
2226 { { "i0" }, "r24" },
2227 { { "i1" }, "r25" },
2228 { { "i2" }, "r26" },
2229 { { "i3" }, "r27" },
2230 { { "i4" }, "r28" },
2231 { { "i5" }, "r29" },
2232 { { "i6", "fp" }, "r30" },
2233 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00002234};
2235
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002236void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002237 unsigned &NumAliases) const {
2238 Aliases = GCCRegAliases;
2239 NumAliases = llvm::array_lengthof(GCCRegAliases);
2240}
Gabor Greif49991682008-02-21 16:29:08 +00002241} // end anonymous namespace.
2242
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002243namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002244class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2245public:
2246 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2247 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2248 SizeType = UnsignedInt;
2249 PtrDiffType = SignedInt;
2250 }
2251};
Torok Edwinb2b37c62009-06-30 17:10:35 +00002252class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002253public:
2254 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002255 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00002256 SizeType = UnsignedInt;
2257 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002258 }
2259};
2260} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00002261
Chris Lattnerb781dc792008-05-08 05:58:21 +00002262namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002263 class MSP430TargetInfo : public TargetInfo {
2264 static const char * const GCCRegNames[];
2265 public:
2266 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2267 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00002268 IntWidth = 16; IntAlign = 16;
2269 LongWidth = 32; LongLongWidth = 64;
2270 LongAlign = LongLongAlign = 16;
2271 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002272 SizeType = UnsignedInt;
2273 IntMaxType = SignedLong;
2274 UIntMaxType = UnsignedLong;
2275 IntPtrType = SignedShort;
2276 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00002277 SigAtomicType = SignedLong;
Anton Korobeynikovd94329a2009-12-19 01:32:37 +00002278 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002279 }
2280 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002281 MacroBuilder &Builder) const {
2282 Builder.defineMacro("MSP430");
2283 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002284 // FIXME: defines for different 'flavours' of MCU
2285 }
2286 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2287 unsigned &NumRecords) const {
2288 // FIXME: Implement.
2289 Records = 0;
2290 NumRecords = 0;
2291 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002292 virtual void getGCCRegNames(const char * const *&Names,
2293 unsigned &NumNames) const;
2294 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2295 unsigned &NumAliases) const {
2296 // No aliases.
2297 Aliases = 0;
2298 NumAliases = 0;
2299 }
2300 virtual bool validateAsmConstraint(const char *&Name,
2301 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00002302 // No target constraints for now.
2303 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002304 }
2305 virtual const char *getClobbers() const {
2306 // FIXME: Is this really right?
2307 return "";
2308 }
2309 virtual const char *getVAListDeclaration() const {
2310 // FIXME: implement
Anton Korobeynikov2f910822009-05-08 18:24:57 +00002311 return "typedef char* __builtin_va_list;";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002312 }
2313 };
2314
2315 const char * const MSP430TargetInfo::GCCRegNames[] = {
2316 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2317 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2318 };
2319
2320 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2321 unsigned &NumNames) const {
2322 Names = GCCRegNames;
2323 NumNames = llvm::array_lengthof(GCCRegNames);
2324 }
2325}
2326
2327
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002328namespace {
2329 class SystemZTargetInfo : public TargetInfo {
2330 static const char * const GCCRegNames[];
2331 public:
2332 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2333 TLSSupported = false;
2334 IntWidth = IntAlign = 32;
2335 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2336 PointerWidth = PointerAlign = 64;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002337 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2338 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002339 }
2340 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002341 MacroBuilder &Builder) const {
2342 Builder.defineMacro("__s390__");
2343 Builder.defineMacro("__s390x__");
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002344 }
2345 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2346 unsigned &NumRecords) const {
2347 // FIXME: Implement.
2348 Records = 0;
2349 NumRecords = 0;
2350 }
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002351
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002352 virtual void getGCCRegNames(const char * const *&Names,
2353 unsigned &NumNames) const;
2354 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2355 unsigned &NumAliases) const {
2356 // No aliases.
2357 Aliases = 0;
2358 NumAliases = 0;
2359 }
2360 virtual bool validateAsmConstraint(const char *&Name,
2361 TargetInfo::ConstraintInfo &info) const {
2362 // FIXME: implement
2363 return true;
2364 }
2365 virtual const char *getClobbers() const {
2366 // FIXME: Is this really right?
2367 return "";
2368 }
2369 virtual const char *getVAListDeclaration() const {
2370 // FIXME: implement
2371 return "typedef char* __builtin_va_list;";
2372 }
2373 };
2374
2375 const char * const SystemZTargetInfo::GCCRegNames[] = {
2376 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2377 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2378 };
2379
2380 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2381 unsigned &NumNames) const {
2382 Names = GCCRegNames;
2383 NumNames = llvm::array_lengthof(GCCRegNames);
2384 }
2385}
2386
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002387namespace {
2388 class BlackfinTargetInfo : public TargetInfo {
2389 static const char * const GCCRegNames[];
2390 public:
2391 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2392 TLSSupported = false;
2393 DoubleAlign = 32;
2394 LongLongAlign = 32;
2395 LongDoubleAlign = 32;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002396 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002397 }
2398
2399 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002400 MacroBuilder &Builder) const {
2401 DefineStd(Builder, "bfin", Opts);
2402 DefineStd(Builder, "BFIN", Opts);
2403 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002404 // FIXME: This one is really dependent on -mcpu
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002405 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002406 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2407 }
2408
2409 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2410 unsigned &NumRecords) const {
2411 // FIXME: Implement.
2412 Records = 0;
2413 NumRecords = 0;
2414 }
2415
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002416 virtual void getGCCRegNames(const char * const *&Names,
2417 unsigned &NumNames) const;
2418
2419 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2420 unsigned &NumAliases) const {
2421 // No aliases.
2422 Aliases = 0;
2423 NumAliases = 0;
2424 }
2425
2426 virtual bool validateAsmConstraint(const char *&Name,
2427 TargetInfo::ConstraintInfo &Info) const {
2428 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2429 Info.setAllowsRegister();
2430 return true;
2431 }
2432 return false;
2433 }
2434
2435 virtual const char *getClobbers() const {
2436 return "";
2437 }
2438
2439 virtual const char *getVAListDeclaration() const {
2440 return "typedef char* __builtin_va_list;";
2441 }
2442 };
2443
2444 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2445 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2446 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2447 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2448 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2449 "a0", "a1", "cc",
2450 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2451 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2452 };
2453
2454 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2455 unsigned &NumNames) const {
2456 Names = GCCRegNames;
2457 NumNames = llvm::array_lengthof(GCCRegNames);
2458 }
2459}
2460
Eli Friedmana9c3d712009-08-19 20:47:07 +00002461namespace {
2462
Mike Stump11289f42009-09-09 15:08:12 +00002463 // LLVM and Clang cannot be used directly to output native binaries for
2464 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00002465 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00002466 //
2467 // TCE uses the llvm bitcode as input and uses it for generating customized
2468 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00002469 // publicly available in http://tce.cs.tut.fi
2470
2471 class TCETargetInfo : public TargetInfo{
2472 public:
2473 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2474 TLSSupported = false;
2475 IntWidth = 32;
2476 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00002477 PointerWidth = 32;
2478 IntAlign = 32;
2479 LongAlign = LongLongAlign = 32;
2480 PointerAlign = 32;
2481 SizeType = UnsignedInt;
2482 IntMaxType = SignedLong;
2483 UIntMaxType = UnsignedLong;
2484 IntPtrType = SignedInt;
2485 PtrDiffType = SignedInt;
2486 FloatWidth = 32;
2487 FloatAlign = 32;
2488 DoubleWidth = 32;
2489 DoubleAlign = 32;
2490 LongDoubleWidth = 32;
2491 LongDoubleAlign = 32;
2492 FloatFormat = &llvm::APFloat::IEEEsingle;
2493 DoubleFormat = &llvm::APFloat::IEEEsingle;
2494 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner09797542010-03-04 21:07:38 +00002495 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2496 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumidba4ed32011-02-18 08:44:38 +00002497 "f32:32:32-f64:32:32-v64:32:32-"
2498 "v128:32:32-a0:0:32-n32";
Eli Friedmana9c3d712009-08-19 20:47:07 +00002499 }
2500
2501 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002502 MacroBuilder &Builder) const {
2503 DefineStd(Builder, "tce", Opts);
2504 Builder.defineMacro("__TCE__");
2505 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00002506 }
2507 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2508 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00002509 virtual const char *getClobbers() const {
2510 return "";
2511 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002512 virtual const char *getVAListDeclaration() const {
2513 return "typedef void* __builtin_va_list;";
2514 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002515 virtual void getGCCRegNames(const char * const *&Names,
2516 unsigned &NumNames) const {}
2517 virtual bool validateAsmConstraint(const char *&Name,
2518 TargetInfo::ConstraintInfo &info) const {
2519 return true;
2520 }
2521 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2522 unsigned &NumAliases) const {}
2523 };
2524}
2525
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002526namespace {
2527class MipsTargetInfo : public TargetInfo {
Eric Christopher0b26a612010-03-02 02:41:08 +00002528 std::string ABI, CPU;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002529 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2530 static const char * const GCCRegNames[];
2531public:
Eric Christopher0b26a612010-03-02 02:41:08 +00002532 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002533 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakab579fe52011-06-02 00:09:17 +00002534 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
2535 SizeType = UnsignedInt;
2536 PtrDiffType = SignedInt;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002537 }
Eric Christopher0b26a612010-03-02 02:41:08 +00002538 virtual const char *getABI() const { return ABI.c_str(); }
2539 virtual bool setABI(const std::string &Name) {
2540
2541 if ((Name == "o32") || (Name == "eabi")) {
2542 ABI = Name;
2543 return true;
2544 } else
2545 return false;
2546 }
2547 virtual bool setCPU(const std::string &Name) {
2548 CPU = Name;
2549 return true;
2550 }
2551 void getDefaultFeatures(const std::string &CPU,
2552 llvm::StringMap<bool> &Features) const {
2553 Features[ABI] = true;
2554 Features[CPU] = true;
2555 }
2556 virtual void getArchDefines(const LangOptions &Opts,
2557 MacroBuilder &Builder) const {
2558 if (ABI == "o32")
2559 Builder.defineMacro("__mips_o32");
2560 else if (ABI == "eabi")
2561 Builder.defineMacro("__mips_eabi");
2562 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002563 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002564 MacroBuilder &Builder) const {
2565 DefineStd(Builder, "mips", Opts);
2566 Builder.defineMacro("_mips");
2567 DefineStd(Builder, "MIPSEB", Opts);
2568 Builder.defineMacro("_MIPSEB");
2569 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002570 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002571 }
2572 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2573 unsigned &NumRecords) const {
2574 // FIXME: Implement!
2575 }
2576 virtual const char *getVAListDeclaration() const {
2577 return "typedef void* __builtin_va_list;";
2578 }
2579 virtual void getGCCRegNames(const char * const *&Names,
2580 unsigned &NumNames) const;
2581 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2582 unsigned &NumAliases) const;
2583 virtual bool validateAsmConstraint(const char *&Name,
2584 TargetInfo::ConstraintInfo &Info) const {
2585 switch (*Name) {
2586 default:
2587 case 'r': // CPU registers.
2588 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2589 case 'y': // Equivalent to "r", backwards compatibility only.
2590 case 'f': // floating-point registers.
2591 Info.setAllowsRegister();
2592 return true;
2593 }
2594 return false;
2595 }
2596
2597 virtual const char *getClobbers() const {
2598 // FIXME: Implement!
2599 return "";
2600 }
2601};
2602
2603const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002604 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002605 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2606 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2607 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2608 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2609 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2610 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2611 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2612 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2613 "$fcc5","$fcc6","$fcc7"
2614};
2615
2616void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2617 unsigned &NumNames) const {
2618 Names = GCCRegNames;
2619 NumNames = llvm::array_lengthof(GCCRegNames);
2620}
2621
2622const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2623 { { "at" }, "$1" },
2624 { { "v0" }, "$2" },
2625 { { "v1" }, "$3" },
2626 { { "a0" }, "$4" },
2627 { { "a1" }, "$5" },
2628 { { "a2" }, "$6" },
2629 { { "a3" }, "$7" },
2630 { { "t0" }, "$8" },
2631 { { "t1" }, "$9" },
2632 { { "t2" }, "$10" },
2633 { { "t3" }, "$11" },
2634 { { "t4" }, "$12" },
2635 { { "t5" }, "$13" },
2636 { { "t6" }, "$14" },
2637 { { "t7" }, "$15" },
2638 { { "s0" }, "$16" },
2639 { { "s1" }, "$17" },
2640 { { "s2" }, "$18" },
2641 { { "s3" }, "$19" },
2642 { { "s4" }, "$20" },
2643 { { "s5" }, "$21" },
2644 { { "s6" }, "$22" },
2645 { { "s7" }, "$23" },
2646 { { "t8" }, "$24" },
2647 { { "t9" }, "$25" },
2648 { { "k0" }, "$26" },
2649 { { "k1" }, "$27" },
2650 { { "gp" }, "$28" },
2651 { { "sp" }, "$29" },
2652 { { "fp" }, "$30" },
2653 { { "ra" }, "$31" }
2654};
2655
2656void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2657 unsigned &NumAliases) const {
2658 Aliases = GCCRegAliases;
2659 NumAliases = llvm::array_lengthof(GCCRegAliases);
2660}
2661} // end anonymous namespace.
2662
2663namespace {
2664class MipselTargetInfo : public MipsTargetInfo {
2665public:
2666 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2667 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakab579fe52011-06-02 00:09:17 +00002668 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002669 }
2670
2671 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002672 MacroBuilder &Builder) const;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002673};
2674
2675void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002676 MacroBuilder &Builder) const {
2677 DefineStd(Builder, "mips", Opts);
2678 Builder.defineMacro("_mips");
2679 DefineStd(Builder, "MIPSEL", Opts);
2680 Builder.defineMacro("_MIPSEL");
2681 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002682 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002683}
2684} // end anonymous namespace.
2685
Chris Lattner5ba61f02006-10-14 07:39:34 +00002686//===----------------------------------------------------------------------===//
2687// Driver code
2688//===----------------------------------------------------------------------===//
2689
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002690static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar52322032009-08-18 05:47:58 +00002691 llvm::Triple Triple(T);
2692 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00002693
Daniel Dunbar52322032009-08-18 05:47:58 +00002694 switch (Triple.getArch()) {
2695 default:
2696 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00002697
Daniel Dunbar52322032009-08-18 05:47:58 +00002698 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00002699 case llvm::Triple::thumb:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002700 if (Triple.isOSDarwin())
2701 return new DarwinARMTargetInfo(T);
2702
Daniel Dunbar52322032009-08-18 05:47:58 +00002703 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00002704 case llvm::Triple::Linux:
2705 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002706 case llvm::Triple::FreeBSD:
Torok Edwinb2b37c62009-06-30 17:10:35 +00002707 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002708 default:
2709 return new ARMTargetInfo(T);
2710 }
Eli Friedmanb5366062008-05-20 14:21:01 +00002711
Daniel Dunbar52322032009-08-18 05:47:58 +00002712 case llvm::Triple::bfin:
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002713 return new BlackfinTargetInfo(T);
2714
Daniel Dunbar52322032009-08-18 05:47:58 +00002715 case llvm::Triple::msp430:
2716 return new MSP430TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +00002717
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002718 case llvm::Triple::mips:
2719 if (os == llvm::Triple::Psp)
2720 return new PSPTargetInfo<MipsTargetInfo>(T);
2721 if (os == llvm::Triple::Linux)
2722 return new LinuxTargetInfo<MipsTargetInfo>(T);
2723 return new MipsTargetInfo(T);
2724
2725 case llvm::Triple::mipsel:
2726 if (os == llvm::Triple::Psp)
2727 return new PSPTargetInfo<MipselTargetInfo>(T);
2728 if (os == llvm::Triple::Linux)
2729 return new LinuxTargetInfo<MipselTargetInfo>(T);
2730 return new MipselTargetInfo(T);
2731
Daniel Dunbar52322032009-08-18 05:47:58 +00002732 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002733 if (Triple.isOSDarwin())
Roman Divacky965b0b72011-01-06 08:27:10 +00002734 return new DarwinPPC32TargetInfo(T);
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002735 else if (os == llvm::Triple::FreeBSD)
2736 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002737 return new PPC32TargetInfo(T);
2738
2739 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002740 if (Triple.isOSDarwin())
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00002741 return new DarwinPPC64TargetInfo(T);
John Thompsone467e192009-11-19 17:18:50 +00002742 else if (os == llvm::Triple::Lv2)
2743 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002744 else if (os == llvm::Triple::FreeBSD)
2745 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002746 return new PPC64TargetInfo(T);
2747
Justin Holewinski514cce82011-04-20 19:34:15 +00002748 case llvm::Triple::ptx32:
2749 return new PTX32TargetInfo(T);
2750 case llvm::Triple::ptx64:
2751 return new PTX64TargetInfo(T);
2752
Chris Lattner5178f562010-03-06 21:21:27 +00002753 case llvm::Triple::mblaze:
2754 return new MBlazeTargetInfo(T);
2755
Daniel Dunbar52322032009-08-18 05:47:58 +00002756 case llvm::Triple::sparc:
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002757 if (os == llvm::Triple::AuroraUX)
2758 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002759 if (os == llvm::Triple::Solaris)
2760 return new SolarisSparcV8TargetInfo(T);
2761 return new SparcV8TargetInfo(T);
2762
John Thompsone467e192009-11-19 17:18:50 +00002763 // FIXME: Need a real SPU target.
2764 case llvm::Triple::cellspu:
2765 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2766
Daniel Dunbar52322032009-08-18 05:47:58 +00002767 case llvm::Triple::systemz:
2768 return new SystemZTargetInfo(T);
2769
Eli Friedmana9c3d712009-08-19 20:47:07 +00002770 case llvm::Triple::tce:
2771 return new TCETargetInfo(T);
2772
Daniel Dunbar52322032009-08-18 05:47:58 +00002773 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002774 if (Triple.isOSDarwin())
2775 return new DarwinI386TargetInfo(T);
2776
Daniel Dunbar52322032009-08-18 05:47:58 +00002777 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002778 case llvm::Triple::AuroraUX:
2779 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002780 case llvm::Triple::Linux:
2781 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2782 case llvm::Triple::DragonFly:
2783 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2784 case llvm::Triple::NetBSD:
2785 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2786 case llvm::Triple::OpenBSD:
2787 return new OpenBSDI386TargetInfo(T);
2788 case llvm::Triple::FreeBSD:
2789 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner3e2ee142010-07-07 16:01:42 +00002790 case llvm::Triple::Minix:
2791 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002792 case llvm::Triple::Solaris:
2793 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2794 case llvm::Triple::Cygwin:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002795 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002796 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002797 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002798 case llvm::Triple::Win32:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002799 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattnerb986aba2010-04-11 19:29:39 +00002800 case llvm::Triple::Haiku:
2801 return new HaikuX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002802 default:
2803 return new X86_32TargetInfo(T);
2804 }
2805
2806 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002807 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
2808 return new DarwinX86_64TargetInfo(T);
2809
Daniel Dunbar52322032009-08-18 05:47:58 +00002810 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002811 case llvm::Triple::AuroraUX:
2812 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002813 case llvm::Triple::Linux:
2814 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner002ba6b2010-01-09 05:41:14 +00002815 case llvm::Triple::DragonFly:
2816 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002817 case llvm::Triple::NetBSD:
2818 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2819 case llvm::Triple::OpenBSD:
2820 return new OpenBSDX86_64TargetInfo(T);
2821 case llvm::Triple::FreeBSD:
2822 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2823 case llvm::Triple::Solaris:
2824 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00002825 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002826 return new MinGWX86_64TargetInfo(T);
2827 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00002828 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002829 default:
2830 return new X86_64TargetInfo(T);
2831 }
2832 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002833}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002834
2835/// CreateTargetInfo - Return the target info object for the specified target
2836/// triple.
2837TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002838 TargetOptions &Opts) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002839 llvm::Triple Triple(Opts.Triple);
2840
2841 // Construct the target
2842 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2843 if (!Target) {
2844 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2845 return 0;
2846 }
2847
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002848 // Set the target CPU if specified.
2849 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2850 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2851 return 0;
2852 }
2853
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002854 // Set the target ABI if specified.
2855 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2856 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2857 return 0;
2858 }
2859
Charles Davis95a546e2010-06-11 01:06:47 +00002860 // Set the target C++ ABI.
John McCall86353412010-08-21 22:46:04 +00002861 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis95a546e2010-06-11 01:06:47 +00002862 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2863 return 0;
2864 }
2865
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002866 // Compute the default target features, we need the target to handle this
2867 // because features may have dependencies on one another.
2868 llvm::StringMap<bool> Features;
2869 Target->getDefaultFeatures(Opts.CPU, Features);
2870
2871 // Apply the user specified deltas.
2872 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2873 ie = Opts.Features.end(); it != ie; ++it) {
2874 const char *Name = it->c_str();
2875
2876 // Apply the feature via the target.
2877 if ((Name[0] != '-' && Name[0] != '+') ||
2878 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2879 Diags.Report(diag::err_target_invalid_feature) << Name;
2880 return 0;
2881 }
2882 }
2883
2884 // Add the features to the compile options.
2885 //
2886 // FIXME: If we are completely confident that we have the right set, we only
2887 // need to pass the minuses.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002888 Opts.Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002889 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2890 ie = Features.end(); it != ie; ++it)
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002891 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2892 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002893
2894 return Target.take();
2895}