blob: aa32cbd28f3cafb3a8ccab9ae185595e77b68fcc [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 Dunbard86666f2010-01-26 01:44:04 +0000104 // Get the OS 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.
108 if (Triple.getOSName() == "darwin") {
109 Min = Rev = 0;
110 Maj = 8;
111 } else
112 Triple.getDarwinNumber(Maj, Min, Rev);
113
114 // Set the appropriate OS version define.
115 if (Triple.getEnvironmentName() == "iphoneos") {
116 assert(Maj < 10 && Min < 99 && Rev < 99 && "Invalid version!");
117 char Str[6];
118 Str[0] = '0' + Maj;
119 Str[1] = '0' + (Min / 10);
120 Str[2] = '0' + (Min % 10);
121 Str[3] = '0' + (Rev / 10);
122 Str[4] = '0' + (Rev % 10);
123 Str[5] = '\0';
124 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000125
126 PlatformName = "ios";
127 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Daniel Dunbard86666f2010-01-26 01:44:04 +0000128 } else {
129 // For historical reasons that make little sense, the version passed here is
130 // the "darwin" version, which drops the 10 and offsets by 4.
131 Rev = Min;
132 Min = Maj - 4;
133 Maj = 10;
134
135 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
136 assert(Maj < 99 && Min < 10 && Rev < 10 && "Invalid version!");
137 char Str[5];
138 Str[0] = '0' + (Maj / 10);
139 Str[1] = '0' + (Maj % 10);
140 Str[2] = '0' + Min;
141 Str[3] = '0' + Rev;
142 Str[4] = '\0';
143 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000144
145 PlatformName = "macosx";
146 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000147 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000148}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000149
Chris Lattner30ba6742009-08-10 19:03:04 +0000150namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000151template<typename Target>
152class DarwinTargetInfo : public OSTargetInfo<Target> {
153protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000154 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000155 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000156 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
157 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000158 }
Mike Stump11289f42009-09-09 15:08:12 +0000159
Torok Edwinb2b37c62009-06-30 17:10:35 +0000160public:
161 DarwinTargetInfo(const std::string& triple) :
162 OSTargetInfo<Target>(triple) {
Eric Christopher17c7b892010-06-25 19:04:52 +0000163 this->TLSSupported = llvm::Triple(triple).getDarwinMajorNumber() > 10;
Daniel Dunbar13adc7f2011-02-21 23:12:51 +0000164 this->MCountName = "\01mcount";
Torok Edwinb2b37c62009-06-30 17:10:35 +0000165 }
166
Anders Carlsson0b0a1222010-01-30 18:33:31 +0000167 virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000168 // Let MCSectionMachO validate this.
169 llvm::StringRef Segment, Section;
170 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000171 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000172 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000173 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000174 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000175
Anders Carlsson851318a2010-06-08 22:47:50 +0000176 virtual const char *getStaticInitSectionSpecifier() const {
177 // FIXME: We should return 0 when building kexts.
178 return "__TEXT,__StaticInit,regular,pure_instructions";
179 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000180
Torok Edwinb2b37c62009-06-30 17:10:35 +0000181};
182
Chris Lattner30ba6742009-08-10 19:03:04 +0000183
Torok Edwinb2b37c62009-06-30 17:10:35 +0000184// DragonFlyBSD Target
185template<typename Target>
186class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
187protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000188 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000189 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000190 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000191 Builder.defineMacro("__DragonFly__");
192 Builder.defineMacro("__DragonFly_cc_version", "100001");
193 Builder.defineMacro("__ELF__");
194 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
195 Builder.defineMacro("__tune_i386__");
196 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000197 }
198public:
Mike Stump11289f42009-09-09 15:08:12 +0000199 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000200 : OSTargetInfo<Target>(triple) {}
201};
202
203// FreeBSD Target
204template<typename Target>
205class FreeBSDTargetInfo : public OSTargetInfo<Target> {
206protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000207 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000208 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000209 // FreeBSD defines; list based off of gcc output
210
Daniel Dunbar40165182009-08-24 09:10:05 +0000211 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000212 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000213
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000214 Builder.defineMacro("__FreeBSD__", Release);
215 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000216 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
217 DefineStd(Builder, "unix", Opts);
218 Builder.defineMacro("__ELF__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000219 }
220public:
Mike Stump11289f42009-09-09 15:08:12 +0000221 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands9cb27e92009-07-08 13:55:08 +0000222 : OSTargetInfo<Target>(triple) {
223 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000224
225 llvm::Triple Triple(triple);
226 switch (Triple.getArch()) {
227 default:
228 case llvm::Triple::x86:
229 case llvm::Triple::x86_64:
230 this->MCountName = ".mcount";
231 break;
232 case llvm::Triple::mips:
233 case llvm::Triple::mipsel:
234 case llvm::Triple::ppc:
235 case llvm::Triple::ppc64:
236 this->MCountName = "_mcount";
237 break;
238 case llvm::Triple::arm:
239 this->MCountName = "__mcount";
240 break;
241 }
242
Duncan Sands9cb27e92009-07-08 13:55:08 +0000243 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000244};
245
Chris Lattner3e2ee142010-07-07 16:01:42 +0000246// Minix Target
247template<typename Target>
248class MinixTargetInfo : public OSTargetInfo<Target> {
249protected:
250 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
251 MacroBuilder &Builder) const {
252 // Minix defines
253
254 Builder.defineMacro("__minix", "3");
255 Builder.defineMacro("_EM_WSIZE", "4");
256 Builder.defineMacro("_EM_PSIZE", "4");
257 Builder.defineMacro("_EM_SSIZE", "2");
258 Builder.defineMacro("_EM_LSIZE", "4");
259 Builder.defineMacro("_EM_FSIZE", "4");
260 Builder.defineMacro("_EM_DSIZE", "8");
261 DefineStd(Builder, "unix", Opts);
262 }
263public:
264 MinixTargetInfo(const std::string &triple)
265 : OSTargetInfo<Target>(triple) {
266 this->UserLabelPrefix = "";
267 }
268};
269
Torok Edwinb2b37c62009-06-30 17:10:35 +0000270// Linux target
271template<typename Target>
272class LinuxTargetInfo : public OSTargetInfo<Target> {
273protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000274 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000275 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000276 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000277 DefineStd(Builder, "unix", Opts);
278 DefineStd(Builder, "linux", Opts);
279 Builder.defineMacro("__gnu_linux__");
280 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000281 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000282 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000283 if (Opts.CPlusPlus)
284 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000285 }
286public:
Mike Stump11289f42009-09-09 15:08:12 +0000287 LinuxTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000288 : OSTargetInfo<Target>(triple) {
289 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000290 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000291 }
292};
293
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000294// NetBSD Target
295template<typename Target>
296class NetBSDTargetInfo : public OSTargetInfo<Target> {
297protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000298 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000299 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000300 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000301 Builder.defineMacro("__NetBSD__");
302 Builder.defineMacro("__unix__");
303 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000304 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000305 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000306 }
307public:
Mike Stump11289f42009-09-09 15:08:12 +0000308 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000309 : OSTargetInfo<Target>(triple) {
310 this->UserLabelPrefix = "";
311 }
312};
313
Torok Edwinb2b37c62009-06-30 17:10:35 +0000314// OpenBSD Target
315template<typename Target>
316class OpenBSDTargetInfo : public OSTargetInfo<Target> {
317protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000318 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000319 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000320 // OpenBSD defines; list based off of gcc output
321
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000322 Builder.defineMacro("__OpenBSD__");
323 DefineStd(Builder, "unix", Opts);
324 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000325 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000326 Builder.defineMacro("_POSIX_THREADS");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000327 }
328public:
Mike Stump11289f42009-09-09 15:08:12 +0000329 OpenBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000330 : OSTargetInfo<Target>(triple) {}
331};
332
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000333// PSP Target
334template<typename Target>
335class PSPTargetInfo : public OSTargetInfo<Target> {
336protected:
337 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000338 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000339 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000340 Builder.defineMacro("PSP");
341 Builder.defineMacro("_PSP");
342 Builder.defineMacro("__psp__");
343 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000344 }
345public:
346 PSPTargetInfo(const std::string& triple)
347 : OSTargetInfo<Target>(triple) {
348 this->UserLabelPrefix = "";
349 }
350};
351
John Thompsone467e192009-11-19 17:18:50 +0000352// PS3 PPU Target
353template<typename Target>
354class PS3PPUTargetInfo : public OSTargetInfo<Target> {
355protected:
356 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000357 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000358 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000359 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000360 Builder.defineMacro("__PPU__");
361 Builder.defineMacro("__CELLOS_LV2__");
362 Builder.defineMacro("__ELF__");
363 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000364 Builder.defineMacro("_ARCH_PPC64");
365 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000366 }
367public:
368 PS3PPUTargetInfo(const std::string& triple)
369 : OSTargetInfo<Target>(triple) {
370 this->UserLabelPrefix = "";
John Thompson6f8dba72009-12-18 14:21:08 +0000371 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000372 this->IntMaxType = TargetInfo::SignedLongLong;
373 this->UIntMaxType = TargetInfo::UnsignedLongLong;
374 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000375 this->SizeType = TargetInfo::UnsignedInt;
John Thompson07a61a42010-06-24 22:44:13 +0000376 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
377 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompsone467e192009-11-19 17:18:50 +0000378 }
379};
380
381// FIXME: Need a real SPU target.
382// PS3 SPU Target
383template<typename Target>
384class PS3SPUTargetInfo : public OSTargetInfo<Target> {
385protected:
386 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000387 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000388 // PS3 PPU defines.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000389 Builder.defineMacro("__SPU__");
390 Builder.defineMacro("__ELF__");
John Thompsone467e192009-11-19 17:18:50 +0000391 }
392public:
393 PS3SPUTargetInfo(const std::string& triple)
394 : OSTargetInfo<Target>(triple) {
395 this->UserLabelPrefix = "";
396 }
397};
398
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000399// AuroraUX target
400template<typename Target>
401class AuroraUXTargetInfo : public OSTargetInfo<Target> {
402protected:
403 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000404 MacroBuilder &Builder) const {
405 DefineStd(Builder, "sun", Opts);
406 DefineStd(Builder, "unix", Opts);
407 Builder.defineMacro("__ELF__");
408 Builder.defineMacro("__svr4__");
409 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000410 }
411public:
412 AuroraUXTargetInfo(const std::string& triple)
413 : OSTargetInfo<Target>(triple) {
414 this->UserLabelPrefix = "";
415 this->WCharType = this->SignedLong;
416 // FIXME: WIntType should be SignedLong
417 }
418};
419
Torok Edwinb2b37c62009-06-30 17:10:35 +0000420// Solaris target
421template<typename Target>
422class SolarisTargetInfo : public OSTargetInfo<Target> {
423protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000424 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000425 MacroBuilder &Builder) const {
426 DefineStd(Builder, "sun", Opts);
427 DefineStd(Builder, "unix", Opts);
428 Builder.defineMacro("__ELF__");
429 Builder.defineMacro("__svr4__");
430 Builder.defineMacro("__SVR4");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000431 }
432public:
Mike Stump11289f42009-09-09 15:08:12 +0000433 SolarisTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000434 : OSTargetInfo<Target>(triple) {
435 this->UserLabelPrefix = "";
436 this->WCharType = this->SignedLong;
437 // FIXME: WIntType should be SignedLong
438 }
439};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000440
441// Windows target
442template<typename Target>
443class WindowsTargetInfo : public OSTargetInfo<Target> {
444protected:
445 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
446 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000447 Builder.defineMacro("_WIN32");
448 }
449 void getVisualStudioDefines(const LangOptions &Opts,
450 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000451 if (Opts.CPlusPlus) {
452 if (Opts.RTTI)
453 Builder.defineMacro("_CPPRTTI");
454
455 if (Opts.Exceptions)
456 Builder.defineMacro("_CPPUNWIND");
457 }
458
459 if (!Opts.CharIsSigned)
460 Builder.defineMacro("_CHAR_UNSIGNED");
461
462 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
463 // but it works for now.
464 if (Opts.POSIXThreads)
465 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000466
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000467 if (Opts.MSCVersion != 0)
468 Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
469
470 if (Opts.Microsoft) {
471 Builder.defineMacro("_MSC_EXTENSIONS");
472
473 if (Opts.CPlusPlus0x) {
474 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
475 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
476 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
477 }
478 }
479
480 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000481 }
482
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000483public:
484 WindowsTargetInfo(const std::string &triple)
485 : OSTargetInfo<Target>(triple) {}
486};
487
Mike Stump11289f42009-09-09 15:08:12 +0000488} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000489
Chris Lattner09d98f52008-10-05 21:50:58 +0000490//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000491// Specific target implementations.
492//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000493
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000494namespace {
495// PPC abstract base class
496class PPCTargetInfo : public TargetInfo {
497 static const Builtin::Info BuiltinInfo[];
498 static const char * const GCCRegNames[];
499 static const TargetInfo::GCCRegAlias GCCRegAliases[];
500
501public:
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000502 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
503
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000504 virtual void getTargetBuiltins(const Builtin::Info *&Records,
505 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000506 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000507 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000508 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000509
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000510 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000511 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000512
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000513 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000514 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000515 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000516 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000517 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000518 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000519 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000520 default: return false;
521 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000522 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000523 case 'b': // Base register
524 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000525 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000526 break;
527 // FIXME: The following are added to allow parsing.
528 // I just took a guess at what the actions should be.
529 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000530 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000531 case 'v': // Altivec vector register
532 Info.setAllowsRegister();
533 break;
534 case 'w':
535 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000536 case 'd':// VSX vector register to hold vector double data
537 case 'f':// VSX vector register to hold vector float data
538 case 's':// VSX vector register to hold scalar float data
539 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000540 break;
541 default:
542 return false;
543 }
544 Info.setAllowsRegister();
545 Name++; // Skip over 'w'.
546 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000547 case 'h': // `MQ', `CTR', or `LINK' register
548 case 'q': // `MQ' register
549 case 'c': // `CTR' register
550 case 'l': // `LINK' register
551 case 'x': // `CR' register (condition register) number 0
552 case 'y': // `CR' register (condition register)
553 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000554 Info.setAllowsRegister();
555 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000556 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000557 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000558 // (use `L' instead for SImode constants)
559 case 'K': // Unsigned 16-bit constant
560 case 'L': // Signed 16-bit constant shifted left 16 bits
561 case 'M': // Constant larger than 31
562 case 'N': // Exact power of 2
563 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000564 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000565 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000566 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000567 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000568 break;
569 case 'm': // Memory operand. Note that on PowerPC targets, m can
570 // include addresses that update the base register. It
571 // is therefore only safe to use `m' in an asm statement
572 // if that asm statement accesses the operand exactly once.
573 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000574 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000575 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000576 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000577 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000578 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
579 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000580 // register to be updated.
581 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000582 if (Name[1] != 's')
583 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000584 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000585 // include any automodification of the base register. Unlike
586 // `m', this constraint can be used in asm statements that
587 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000588 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000589 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000590 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000591 break;
592 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000593 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000594 case 'Z': // Memory operand that is an indexed or indirect from a
595 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000596 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000597 Info.setAllowsMemory();
598 Info.setAllowsRegister();
599 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000600 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000601 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000602 // register (`p' is preferable for asm statements)
603 case 'S': // Constant suitable as a 64-bit mask operand
604 case 'T': // Constant suitable as a 32-bit mask operand
605 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000606 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000607 // instructions
608 case 'W': // Vector constant that does not require memory
609 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000610 break;
611 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000612 }
John Thompson07a61a42010-06-24 22:44:13 +0000613 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000614 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000615 virtual const char *getClobbers() const {
616 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000617 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000618};
Anders Carlssonf511f642007-11-27 04:11:28 +0000619
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000620const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000621#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
622#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
623 ALL_LANGUAGES, false },
Chris Lattner5abdec72009-06-14 01:05:48 +0000624#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000625};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000626
627
Chris Lattnerecd49032009-03-02 22:27:17 +0000628/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
629/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000630void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000631 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000632 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000633 Builder.defineMacro("__ppc__");
634 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000635 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000636 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000637 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000638 Builder.defineMacro("_ARCH_PPC64");
639 Builder.defineMacro("_LP64");
640 Builder.defineMacro("__LP64__");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000641 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000642 Builder.defineMacro("__ppc64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000643 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000644 Builder.defineMacro("__ppc__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000645 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000646
Chris Lattnerecd49032009-03-02 22:27:17 +0000647 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000648 Builder.defineMacro("_BIG_ENDIAN");
649 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000650
Chris Lattnerecd49032009-03-02 22:27:17 +0000651 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000652 Builder.defineMacro("__NATURAL_ALIGNMENT__");
653 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000654
Chris Lattnerecd49032009-03-02 22:27:17 +0000655 // FIXME: Should be controlled by command line option.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000656 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000657
John Thompsone467e192009-11-19 17:18:50 +0000658 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000659 Builder.defineMacro("__VEC__", "10206");
660 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000661 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000662}
663
Chris Lattner17df24e2008-04-21 18:56:49 +0000664
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000665const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000666 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
667 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
668 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
669 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
670 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
671 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
672 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
673 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000674 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000675 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000676 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000677 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
678 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
679 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
680 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000681 "vrsave", "vscr",
682 "spe_acc", "spefscr",
683 "sfp"
684};
Chris Lattner10a5b382007-01-29 05:24:35 +0000685
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000686void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000687 unsigned &NumNames) const {
688 Names = GCCRegNames;
689 NumNames = llvm::array_lengthof(GCCRegNames);
690}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000691
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000692const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
693 // While some of these aliases do map to different registers
694 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000695 { { "0" }, "r0" },
696 { { "1"}, "r1" },
697 { { "2" }, "r2" },
698 { { "3" }, "r3" },
699 { { "4" }, "r4" },
700 { { "5" }, "r5" },
701 { { "6" }, "r6" },
702 { { "7" }, "r7" },
703 { { "8" }, "r8" },
704 { { "9" }, "r9" },
705 { { "10" }, "r10" },
706 { { "11" }, "r11" },
707 { { "12" }, "r12" },
708 { { "13" }, "r13" },
709 { { "14" }, "r14" },
710 { { "15" }, "r15" },
711 { { "16" }, "r16" },
712 { { "17" }, "r17" },
713 { { "18" }, "r18" },
714 { { "19" }, "r19" },
715 { { "20" }, "r20" },
716 { { "21" }, "r21" },
717 { { "22" }, "r22" },
718 { { "23" }, "r23" },
719 { { "24" }, "r24" },
720 { { "25" }, "r25" },
721 { { "26" }, "r26" },
722 { { "27" }, "r27" },
723 { { "28" }, "r28" },
724 { { "29" }, "r29" },
725 { { "30" }, "r30" },
726 { { "31" }, "r31" },
727 { { "fr0" }, "f0" },
728 { { "fr1" }, "f1" },
729 { { "fr2" }, "f2" },
730 { { "fr3" }, "f3" },
731 { { "fr4" }, "f4" },
732 { { "fr5" }, "f5" },
733 { { "fr6" }, "f6" },
734 { { "fr7" }, "f7" },
735 { { "fr8" }, "f8" },
736 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +0000737 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000738 { { "fr11" }, "f11" },
739 { { "fr12" }, "f12" },
740 { { "fr13" }, "f13" },
741 { { "fr14" }, "f14" },
742 { { "fr15" }, "f15" },
743 { { "fr16" }, "f16" },
744 { { "fr17" }, "f17" },
745 { { "fr18" }, "f18" },
746 { { "fr19" }, "f19" },
747 { { "fr20" }, "f20" },
748 { { "fr21" }, "f21" },
749 { { "fr22" }, "f22" },
750 { { "fr23" }, "f23" },
751 { { "fr24" }, "f24" },
752 { { "fr25" }, "f25" },
753 { { "fr26" }, "f26" },
754 { { "fr27" }, "f27" },
755 { { "fr28" }, "f28" },
756 { { "fr29" }, "f29" },
757 { { "fr30" }, "f30" },
758 { { "fr31" }, "f31" },
759 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000760};
761
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000762void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000763 unsigned &NumAliases) const {
764 Aliases = GCCRegAliases;
765 NumAliases = llvm::array_lengthof(GCCRegAliases);
766}
767} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000768
Chris Lattner5ba61f02006-10-14 07:39:34 +0000769namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000770class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000771public:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000772 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000773 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 +0000774 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000775
776 if (getTriple().getOS() == llvm::Triple::FreeBSD)
Roman Divacky965b0b72011-01-06 08:27:10 +0000777 SizeType = UnsignedInt;
778 }
779
780 virtual const char *getVAListDeclaration() const {
781 // This is the ELF definition, and is overridden by the Darwin sub-target
782 return "typedef struct __va_list_tag {"
783 " unsigned char gpr;"
784 " unsigned char fpr;"
785 " unsigned short reserved;"
786 " void* overflow_arg_area;"
787 " void* reg_save_area;"
788 "} __builtin_va_list[1];";
Eli Friedman873f65a2008-08-21 00:13:15 +0000789 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000790};
791} // end anonymous namespace.
792
793namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000794class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000795public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000796 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000797 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +0000798 IntMaxType = SignedLong;
799 UIntMaxType = UnsignedLong;
800 Int64Type = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +0000801 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 +0000802 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000803 }
Roman Divacky965b0b72011-01-06 08:27:10 +0000804 virtual const char *getVAListDeclaration() const {
805 return "typedef char* __builtin_va_list;";
806 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000807};
808} // end anonymous namespace.
809
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000810
811namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +0000812class DarwinPPC32TargetInfo :
813 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000814public:
Roman Divacky965b0b72011-01-06 08:27:10 +0000815 DarwinPPC32TargetInfo(const std::string& triple)
816 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000817 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +0000818 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
819 }
820 virtual const char *getVAListDeclaration() const {
821 return "typedef char* __builtin_va_list;";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000822 }
823};
824
825class DarwinPPC64TargetInfo :
826 public DarwinTargetInfo<PPC64TargetInfo> {
827public:
828 DarwinPPC64TargetInfo(const std::string& triple)
829 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
830 HasAlignMac68kSupport = true;
831 }
832};
833} // end anonymous namespace.
834
Chris Lattner5ba61f02006-10-14 07:39:34 +0000835namespace {
Chris Lattner5178f562010-03-06 21:21:27 +0000836// MBlaze abstract base class
837class MBlazeTargetInfo : public TargetInfo {
838 static const char * const GCCRegNames[];
839 static const TargetInfo::GCCRegAlias GCCRegAliases[];
840
841public:
842 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Peck69bf1282010-12-12 20:56:47 +0000843 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner5178f562010-03-06 21:21:27 +0000844 }
845
846 virtual void getTargetBuiltins(const Builtin::Info *&Records,
847 unsigned &NumRecords) const {
848 // FIXME: Implement.
849 Records = 0;
850 NumRecords = 0;
851 }
852
853 virtual void getTargetDefines(const LangOptions &Opts,
854 MacroBuilder &Builder) const;
855
856 virtual const char *getVAListDeclaration() const {
857 return "typedef char* __builtin_va_list;";
858 }
859 virtual const char *getTargetPrefix() const {
860 return "mblaze";
861 }
862 virtual void getGCCRegNames(const char * const *&Names,
863 unsigned &NumNames) const;
864 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
865 unsigned &NumAliases) const;
866 virtual bool validateAsmConstraint(const char *&Name,
867 TargetInfo::ConstraintInfo &Info) const {
868 switch (*Name) {
869 default: return false;
870 case 'O': // Zero
871 return true;
872 case 'b': // Base register
873 case 'f': // Floating point register
874 Info.setAllowsRegister();
875 return true;
876 }
877 }
878 virtual const char *getClobbers() const {
879 return "";
880 }
881};
882
883/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
884/// #defines that are not tied to a specific subtarget.
885void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
886 MacroBuilder &Builder) const {
887 // Target identification.
888 Builder.defineMacro("__microblaze__");
889 Builder.defineMacro("_ARCH_MICROBLAZE");
890 Builder.defineMacro("__MICROBLAZE__");
891
892 // Target properties.
893 Builder.defineMacro("_BIG_ENDIAN");
894 Builder.defineMacro("__BIG_ENDIAN__");
895
896 // Subtarget options.
897 Builder.defineMacro("__REGISTER_PREFIX__", "");
898}
899
900
901const char * const MBlazeTargetInfo::GCCRegNames[] = {
902 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
903 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
904 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
905 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
906 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
907 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
908 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
909 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
910 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
911 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
912};
913
914void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
915 unsigned &NumNames) const {
916 Names = GCCRegNames;
917 NumNames = llvm::array_lengthof(GCCRegNames);
918}
919
920const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
921 { {"f0"}, "r0" },
922 { {"f1"}, "r1" },
923 { {"f2"}, "r2" },
924 { {"f3"}, "r3" },
925 { {"f4"}, "r4" },
926 { {"f5"}, "r5" },
927 { {"f6"}, "r6" },
928 { {"f7"}, "r7" },
929 { {"f8"}, "r8" },
930 { {"f9"}, "r9" },
931 { {"f10"}, "r10" },
932 { {"f11"}, "r11" },
933 { {"f12"}, "r12" },
934 { {"f13"}, "r13" },
935 { {"f14"}, "r14" },
936 { {"f15"}, "r15" },
937 { {"f16"}, "r16" },
938 { {"f17"}, "r17" },
939 { {"f18"}, "r18" },
940 { {"f19"}, "r19" },
941 { {"f20"}, "r20" },
942 { {"f21"}, "r21" },
943 { {"f22"}, "r22" },
944 { {"f23"}, "r23" },
945 { {"f24"}, "r24" },
946 { {"f25"}, "r25" },
947 { {"f26"}, "r26" },
948 { {"f27"}, "r27" },
949 { {"f28"}, "r28" },
950 { {"f29"}, "r29" },
951 { {"f30"}, "r30" },
952 { {"f31"}, "r31" },
953};
954
955void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
956 unsigned &NumAliases) const {
957 Aliases = GCCRegAliases;
958 NumAliases = llvm::array_lengthof(GCCRegAliases);
959}
960} // end anonymous namespace.
961
962namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000963// Namespace for x86 abstract base class
964const Builtin::Info BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000965#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
966#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
967 ALL_LANGUAGES, false },
Chris Lattner5abdec72009-06-14 01:05:48 +0000968#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +0000969};
Eli Friedmanb5366062008-05-20 14:21:01 +0000970
Nuno Lopescfca1f02009-12-23 17:49:57 +0000971static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000972 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
973 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
974 "argp", "flags", "fspr", "dirflag", "frame",
975 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
976 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
977 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
978 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
979};
980
981const TargetInfo::GCCRegAlias GCCRegAliases[] = {
982 { { "al", "ah", "eax", "rax" }, "ax" },
983 { { "bl", "bh", "ebx", "rbx" }, "bx" },
984 { { "cl", "ch", "ecx", "rcx" }, "cx" },
985 { { "dl", "dh", "edx", "rdx" }, "dx" },
986 { { "esi", "rsi" }, "si" },
987 { { "edi", "rdi" }, "di" },
988 { { "esp", "rsp" }, "sp" },
989 { { "ebp", "rbp" }, "bp" },
990};
991
992// X86 target abstract base class; x86-32 and x86-64 are very close, so
993// most of the implementation can be shared.
994class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +0000995 enum X86SSEEnum {
996 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
997 } SSELevel;
Anders Carlssone437c682010-01-27 03:47:49 +0000998 enum AMD3DNowEnum {
999 NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
1000 } AMD3DNowLevel;
1001
Eric Christophere1ddaf92010-04-02 23:50:19 +00001002 bool HasAES;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001003 bool HasAVX;
1004
Eli Friedman3fd920a2008-08-20 02:34:37 +00001005public:
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001006 X86TargetInfo(const std::string& triple)
Eric Christophere1ddaf92010-04-02 23:50:19 +00001007 : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001008 HasAES(false), HasAVX(false) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001009 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001010 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001011 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1012 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001013 Records = BuiltinInfo;
1014 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001015 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001016 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001017 unsigned &NumNames) const {
1018 Names = GCCRegNames;
1019 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001020 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001021 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001022 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001023 Aliases = GCCRegAliases;
1024 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +00001025 }
Anders Carlsson58436352009-02-28 17:11:49 +00001026 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001027 TargetInfo::ConstraintInfo &info) const;
1028 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001029 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001030 return "~{dirflag},~{fpsr},~{flags}";
1031 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001032 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001033 MacroBuilder &Builder) const;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001034 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1035 const std::string &Name,
1036 bool Enabled) const;
Mike Stump11289f42009-09-09 15:08:12 +00001037 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001038 llvm::StringMap<bool> &Features) const;
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001039 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Chris Lattner5ba61f02006-10-14 07:39:34 +00001040};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001041
Mike Stump11289f42009-09-09 15:08:12 +00001042void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001043 llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001044 // FIXME: This should not be here.
1045 Features["3dnow"] = false;
1046 Features["3dnowa"] = false;
1047 Features["mmx"] = false;
1048 Features["sse"] = false;
1049 Features["sse2"] = false;
1050 Features["sse3"] = false;
1051 Features["ssse3"] = false;
1052 Features["sse41"] = false;
1053 Features["sse42"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001054 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001055 Features["avx"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001056
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001057 // LLVM does not currently recognize this.
1058 // Features["sse4a"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001059
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001060 // FIXME: This *really* should not be here.
1061
1062 // X86_64 always has SSE2.
1063 if (PointerWidth == 64)
1064 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1065
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001066 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1067 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1068 ;
1069 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1070 setFeatureEnabled(Features, "mmx", true);
1071 else if (CPU == "pentium3")
1072 setFeatureEnabled(Features, "sse", true);
1073 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
1074 setFeatureEnabled(Features, "sse2", true);
1075 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
1076 setFeatureEnabled(Features, "sse3", true);
1077 else if (CPU == "core2")
1078 setFeatureEnabled(Features, "ssse3", true);
1079 else if (CPU == "penryn") {
1080 setFeatureEnabled(Features, "sse4", true);
1081 Features["sse42"] = false;
1082 } else if (CPU == "atom")
1083 setFeatureEnabled(Features, "sse3", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001084 else if (CPU == "corei7") {
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001085 setFeatureEnabled(Features, "sse4", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001086 setFeatureEnabled(Features, "aes", true);
Roman Divacky27ec14f2011-04-05 20:32:44 +00001087 } else if (CPU == "sandybridge") {
1088 setFeatureEnabled(Features, "sse4", true);
1089 setFeatureEnabled(Features, "aes", true);
1090// setFeatureEnabled(Features, "avx", true);
1091 } else if (CPU == "k6" || CPU == "winchip-c6")
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001092 setFeatureEnabled(Features, "mmx", true);
Mike Stump11289f42009-09-09 15:08:12 +00001093 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001094 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
1095 setFeatureEnabled(Features, "mmx", true);
1096 setFeatureEnabled(Features, "3dnow", true);
1097 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1098 setFeatureEnabled(Features, "sse", true);
1099 setFeatureEnabled(Features, "3dnowa", true);
1100 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1101 CPU == "athlon-fx") {
Mike Stump11289f42009-09-09 15:08:12 +00001102 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001103 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackydacbfe42010-12-29 13:28:29 +00001104 } else if (CPU == "k8-sse3") {
1105 setFeatureEnabled(Features, "sse3", true);
1106 setFeatureEnabled(Features, "3dnowa", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001107 } else if (CPU == "c3-2")
1108 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001109}
1110
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001111bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump11289f42009-09-09 15:08:12 +00001112 const std::string &Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001113 bool Enabled) const {
Eric Christopher399ffa52010-03-04 02:26:37 +00001114 // FIXME: This *really* should not be here. We need some way of translating
1115 // options into llvm subtarget features.
1116 if (!Features.count(Name) &&
1117 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001118 return false;
1119
1120 if (Enabled) {
1121 if (Name == "mmx")
1122 Features["mmx"] = true;
1123 else if (Name == "sse")
1124 Features["mmx"] = Features["sse"] = true;
1125 else if (Name == "sse2")
1126 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1127 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001128 Features["mmx"] = Features["sse"] = Features["sse2"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001129 Features["sse3"] = true;
1130 else if (Name == "ssse3")
Mike Stump11289f42009-09-09 15:08:12 +00001131 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001132 Features["ssse3"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001133 else if (Name == "sse4" || Name == "sse4.2")
Mike Stump11289f42009-09-09 15:08:12 +00001134 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001135 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001136 else if (Name == "sse4.1")
1137 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1138 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001139 else if (Name == "3dnow")
1140 Features["3dnowa"] = true;
1141 else if (Name == "3dnowa")
1142 Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001143 else if (Name == "aes")
1144 Features["aes"] = true;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001145 else if (Name == "avx")
1146 Features["avx"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001147 } else {
1148 if (Name == "mmx")
Michael J. Spencera9e41172011-04-17 19:22:03 +00001149 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] =
1150 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001151 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1152 else if (Name == "sse")
Mike Stump11289f42009-09-09 15:08:12 +00001153 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001154 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1155 else if (Name == "sse2")
Mike Stump11289f42009-09-09 15:08:12 +00001156 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001157 Features["sse41"] = Features["sse42"] = false;
1158 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001159 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001160 Features["sse42"] = false;
1161 else if (Name == "ssse3")
1162 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencera9e41172011-04-17 19:22:03 +00001163 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001164 Features["sse41"] = Features["sse42"] = false;
Eric Christophercfeceff2010-03-04 02:31:44 +00001165 else if (Name == "sse4.2")
1166 Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001167 else if (Name == "3dnow")
1168 Features["3dnow"] = Features["3dnowa"] = false;
1169 else if (Name == "3dnowa")
1170 Features["3dnowa"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001171 else if (Name == "aes")
1172 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001173 else if (Name == "avx")
1174 Features["avx"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001175 }
1176
1177 return true;
1178}
1179
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001180/// HandleTargetOptions - Perform initialization based on the user
1181/// configured set of features.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001182void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00001183 // Remember the maximum enabled sselevel.
1184 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1185 // Ignore disabled features.
1186 if (Features[i][0] == '-')
1187 continue;
1188
Eric Christophere1ddaf92010-04-02 23:50:19 +00001189 if (Features[i].substr(1) == "aes") {
1190 HasAES = true;
1191 continue;
1192 }
1193
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001194 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1195 // For now let it be enabled together with other SSE levels.
1196 if (Features[i].substr(1) == "avx") {
1197 HasAVX = true;
1198 continue;
1199 }
1200
Daniel Dunbar979586e2009-11-11 09:38:56 +00001201 assert(Features[i][0] == '+' && "Invalid target feature!");
1202 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1203 .Case("sse42", SSE42)
1204 .Case("sse41", SSE41)
1205 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00001206 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00001207 .Case("sse2", SSE2)
1208 .Case("sse", SSE1)
1209 .Case("mmx", MMX)
1210 .Default(NoMMXSSE);
1211 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001212
1213 AMD3DNowEnum ThreeDNowLevel =
Anders Carlssone437c682010-01-27 03:47:49 +00001214 llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1215 .Case("3dnowa", AMD3DNowAthlon)
1216 .Case("3dnow", AMD3DNow)
1217 .Default(NoAMD3DNow);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001218
Anders Carlssone437c682010-01-27 03:47:49 +00001219 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001220 }
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001221}
Chris Lattnerecd49032009-03-02 22:27:17 +00001222
1223/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1224/// that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001225void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001226 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001227 // Target identification.
1228 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001229 Builder.defineMacro("_LP64");
1230 Builder.defineMacro("__LP64__");
1231 Builder.defineMacro("__amd64__");
1232 Builder.defineMacro("__amd64");
1233 Builder.defineMacro("__x86_64");
1234 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001235 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001236 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00001237 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001238
Eric Christophere1ddaf92010-04-02 23:50:19 +00001239 if (HasAES)
1240 Builder.defineMacro("__AES__");
1241
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001242 if (HasAVX)
1243 Builder.defineMacro("__AVX__");
1244
Chris Lattnerecd49032009-03-02 22:27:17 +00001245 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001246 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001247
Chris Lattnerecd49032009-03-02 22:27:17 +00001248 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001249 Builder.defineMacro("__nocona");
1250 Builder.defineMacro("__nocona__");
1251 Builder.defineMacro("__tune_nocona__");
1252 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner96e43572009-03-02 22:40:39 +00001253
Chris Lattner6df41af2009-04-19 17:32:33 +00001254 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1255 // functions in glibc header files that use FP Stack inline asm which the
1256 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001257 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001258
Chris Lattner96e43572009-03-02 22:40:39 +00001259 // Each case falls through to the previous one here.
1260 switch (SSELevel) {
1261 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001262 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00001263 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001264 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00001265 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001266 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001267 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001268 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001269 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001270 Builder.defineMacro("__SSE2__");
1271 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001272 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001273 Builder.defineMacro("__SSE__");
1274 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001275 case MMX:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001276 Builder.defineMacro("__MMX__");
Chris Lattner96e43572009-03-02 22:40:39 +00001277 case NoMMXSSE:
1278 break;
1279 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001280
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001281 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001282 switch (SSELevel) {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001283 case SSE42:
1284 case SSE41:
1285 case SSSE3:
1286 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001287 case SSE2:
1288 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1289 break;
1290 case SSE1:
1291 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1292 break;
1293 default:
1294 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1295 }
1296 }
1297
Anders Carlssone437c682010-01-27 03:47:49 +00001298 // Each case falls through to the previous one here.
1299 switch (AMD3DNowLevel) {
1300 case AMD3DNowAthlon:
1301 Builder.defineMacro("__3dNOW_A__");
1302 case AMD3DNow:
1303 Builder.defineMacro("__3dNOW__");
1304 case NoAMD3DNow:
1305 break;
1306 }
Chris Lattnerecd49032009-03-02 22:27:17 +00001307}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001308
1309
Eli Friedman3fd920a2008-08-20 02:34:37 +00001310bool
Anders Carlsson58436352009-02-28 17:11:49 +00001311X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001312 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00001313 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001314 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00001315 case 'Y': // first letter of a pair:
1316 switch (*(Name+1)) {
1317 default: return false;
1318 case '0': // First SSE register.
1319 case 't': // Any SSE register, when SSE2 is enabled.
1320 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1321 case 'm': // any MMX register, when inter-unit moves enabled.
1322 break; // falls through to setAllowsRegister.
1323 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001324 case 'a': // eax.
1325 case 'b': // ebx.
1326 case 'c': // ecx.
1327 case 'd': // edx.
1328 case 'S': // esi.
1329 case 'D': // edi.
1330 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00001331 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001332 case 't': // top of floating point stack.
1333 case 'u': // second from top of floating point stack.
1334 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00001335 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00001336 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001337 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00001338 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1339 case 'l': // "Index" registers: any general register that can be used as an
1340 // index in a base+index memory access.
1341 Info.setAllowsRegister();
1342 return true;
1343 case 'C': // SSE floating point constant.
1344 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001345 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001346 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001347 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001348 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001349 return true;
1350 }
Dale Johannesen46742a42010-08-24 22:33:12 +00001351 return false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001352}
1353
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00001354
Eli Friedman3fd920a2008-08-20 02:34:37 +00001355std::string
1356X86TargetInfo::convertConstraint(const char Constraint) const {
1357 switch (Constraint) {
1358 case 'a': return std::string("{ax}");
1359 case 'b': return std::string("{bx}");
1360 case 'c': return std::string("{cx}");
1361 case 'd': return std::string("{dx}");
1362 case 'S': return std::string("{si}");
1363 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00001364 case 'p': // address
1365 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00001366 case 't': // top of floating point stack.
1367 return std::string("{st}");
1368 case 'u': // second from top of floating point stack.
1369 return std::string("{st(1)}"); // second from top of floating point stack.
1370 default:
1371 return std::string(1, Constraint);
1372 }
1373}
Eli Friedman3fd920a2008-08-20 02:34:37 +00001374} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00001375
1376namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001377// X86-32 generic target
1378class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001379public:
Eli Friedman3fd920a2008-08-20 02:34:37 +00001380 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1381 DoubleAlign = LongLongAlign = 32;
1382 LongDoubleWidth = 96;
1383 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +00001384 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1385 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001386 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman32ca82a2009-03-29 20:31:09 +00001387 SizeType = UnsignedInt;
1388 PtrDiffType = SignedInt;
1389 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001390 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001391
1392 // Use fpret for all types.
1393 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1394 (1 << TargetInfo::Double) |
1395 (1 << TargetInfo::LongDouble));
Eli Friedman3fd920a2008-08-20 02:34:37 +00001396 }
1397 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001398 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +00001399 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001400
Chris Lattnerd545ad12009-09-23 06:06:36 +00001401 int getEHDataRegisterNumber(unsigned RegNo) const {
1402 if (RegNo == 0) return 0;
1403 if (RegNo == 1) return 2;
1404 return -1;
1405 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001406};
1407} // end anonymous namespace
1408
1409namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00001410class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1411public:
1412 OpenBSDI386TargetInfo(const std::string& triple) :
1413 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1414 SizeType = UnsignedLong;
1415 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00001416 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00001417 }
1418};
1419} // end anonymous namespace
1420
1421namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00001422class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001423public:
Torok Edwinb2b37c62009-06-30 17:10:35 +00001424 DarwinI386TargetInfo(const std::string& triple) :
1425 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001426 LongDoubleWidth = 128;
1427 LongDoubleAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00001428 SizeType = UnsignedLong;
1429 IntPtrType = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +00001430 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1431 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001432 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbarbd606522010-05-27 00:35:16 +00001433 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00001434 }
1435
Eli Friedman3fd920a2008-08-20 02:34:37 +00001436};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00001437} // end anonymous namespace
1438
1439namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001440// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001441class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001442public:
1443 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001444 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00001445 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00001446 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00001447 DoubleAlign = LongLongAlign = 64;
1448 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 +00001449 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1450 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001451 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001452 virtual void getTargetDefines(const LangOptions &Opts,
1453 MacroBuilder &Builder) const {
1454 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1455 }
1456};
1457} // end anonymous namespace
1458
1459namespace {
1460
1461// x86-32 Windows Visual Studio target
1462class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1463public:
1464 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1465 : WindowsX86_32TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00001466 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001467 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1468 }
1469 virtual void getTargetDefines(const LangOptions &Opts,
1470 MacroBuilder &Builder) const {
1471 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1472 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1473 // The value of the following reflects processor type.
1474 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1475 // We lost the original triple, so we use the default.
1476 Builder.defineMacro("_M_IX86", "600");
1477 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001478};
1479} // end anonymous namespace
1480
1481namespace {
1482// x86-32 MinGW target
1483class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1484public:
1485 MinGWX86_32TargetInfo(const std::string& triple)
1486 : WindowsX86_32TargetInfo(triple) {
1487 }
1488 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001489 MacroBuilder &Builder) const {
1490 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001491 DefineStd(Builder, "WIN32", Opts);
1492 DefineStd(Builder, "WINNT", Opts);
1493 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001494 Builder.defineMacro("__MSVCRT__");
1495 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00001496
1497 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1498 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1499 if (Opts.Microsoft)
1500 // Provide "as-is" __declspec.
1501 Builder.defineMacro("__declspec", "__declspec");
1502 else
1503 // Provide alias of __attribute__ like mingw32-gcc.
1504 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001505 }
1506};
1507} // end anonymous namespace
1508
1509namespace {
1510// x86-32 Cygwin target
1511class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1512public:
1513 CygwinX86_32TargetInfo(const std::string& triple)
1514 : X86_32TargetInfo(triple) {
1515 TLSSupported = false;
1516 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001517 DoubleAlign = LongLongAlign = 64;
1518 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1519 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001520 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001521 }
1522 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001523 MacroBuilder &Builder) const {
1524 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1525 Builder.defineMacro("__CYGWIN__");
1526 Builder.defineMacro("__CYGWIN32__");
1527 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00001528 if (Opts.CPlusPlus)
1529 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00001530 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001531};
1532} // end anonymous namespace
1533
1534namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00001535// x86-32 Haiku target
1536class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1537public:
1538 HaikuX86_32TargetInfo(const std::string& triple)
1539 : X86_32TargetInfo(triple) {
1540 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00001541 IntPtrType = SignedLong;
1542 PtrDiffType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00001543 this->UserLabelPrefix = "";
Eli Friedman04831922010-08-22 01:00:03 +00001544 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00001545 virtual void getTargetDefines(const LangOptions &Opts,
1546 MacroBuilder &Builder) const {
1547 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1548 Builder.defineMacro("__INTEL__");
1549 Builder.defineMacro("__HAIKU__");
1550 }
1551};
1552} // end anonymous namespace
1553
1554namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001555// x86-64 generic target
1556class X86_64TargetInfo : public X86TargetInfo {
1557public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001558 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001559 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00001560 LongDoubleWidth = 128;
1561 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00001562 LargeArrayMinWidth = 128;
1563 LargeArrayAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001564 IntMaxType = SignedLong;
1565 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001566 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001567 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001568
Eli Friedman873f65a2008-08-21 00:13:15 +00001569 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1570 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001571 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001572
1573 // Use fpret only for long double.
1574 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Chris Lattner10a5b382007-01-29 05:24:35 +00001575 }
Anders Carlssona7408e72007-10-13 00:45:48 +00001576 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001577 return "typedef struct __va_list_tag {"
1578 " unsigned gp_offset;"
1579 " unsigned fp_offset;"
1580 " void* overflow_arg_area;"
1581 " void* reg_save_area;"
John McCall61d82582010-05-28 18:25:28 +00001582 "} __va_list_tag;"
Eli Friedmanfb36b022009-07-03 00:45:06 +00001583 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001584 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001585
Chris Lattnerd545ad12009-09-23 06:06:36 +00001586 int getEHDataRegisterNumber(unsigned RegNo) const {
1587 if (RegNo == 0) return 0;
1588 if (RegNo == 1) return 1;
1589 return -1;
1590 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001591};
1592} // end anonymous namespace
1593
1594namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001595// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001596class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001597public:
1598 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001599 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001600 TLSSupported = false;
1601 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00001602 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001603 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00001604 IntMaxType = SignedLongLong;
1605 UIntMaxType = UnsignedLongLong;
1606 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00001607 SizeType = UnsignedLongLong;
1608 PtrDiffType = SignedLongLong;
1609 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00001610 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001611 }
1612 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001613 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001614 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001615 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001616 }
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00001617 virtual const char *getVAListDeclaration() const {
1618 return "typedef char* __builtin_va_list;";
1619 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001620};
1621} // end anonymous namespace
1622
1623namespace {
1624// x86-64 Windows Visual Studio target
1625class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1626public:
1627 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1628 : WindowsX86_64TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00001629 LongDoubleWidth = LongDoubleAlign = 64;
1630 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001631 }
1632 virtual void getTargetDefines(const LangOptions &Opts,
1633 MacroBuilder &Builder) const {
1634 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1635 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001636 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001637 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001638 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001639};
1640} // end anonymous namespace
1641
1642namespace {
1643// x86-64 MinGW target
1644class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1645public:
1646 MinGWX86_64TargetInfo(const std::string& triple)
1647 : WindowsX86_64TargetInfo(triple) {
1648 }
1649 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001650 MacroBuilder &Builder) const {
1651 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001652 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001653 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00001654 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001655 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00001656
1657 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1658 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1659 if (Opts.Microsoft)
1660 // Provide "as-is" __declspec.
1661 Builder.defineMacro("__declspec", "__declspec");
1662 else
1663 // Provide alias of __attribute__ like mingw32-gcc.
1664 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001665 }
1666};
1667} // end anonymous namespace
1668
1669namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00001670class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1671public:
Mike Stump11289f42009-09-09 15:08:12 +00001672 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman2857ccb2009-07-01 03:36:11 +00001673 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1674 Int64Type = SignedLongLong;
1675 }
1676};
1677} // end anonymous namespace
1678
1679namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00001680class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1681public:
Mike Stump11289f42009-09-09 15:08:12 +00001682 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman245f2292009-07-05 22:31:18 +00001683 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1684 IntMaxType = SignedLongLong;
1685 UIntMaxType = UnsignedLongLong;
1686 Int64Type = SignedLongLong;
1687 }
1688};
1689} // end anonymous namespace
1690
1691namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001692class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001693 // Possible FPU choices.
1694 enum FPUMode {
1695 NoFPU,
1696 VFP2FPU,
1697 VFP3FPU,
1698 NeonFPU
1699 };
1700
1701 static bool FPUModeIsVFP(FPUMode Mode) {
1702 return Mode >= VFP2FPU && Mode <= NeonFPU;
1703 }
1704
1705 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1706 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001707
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001708 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001709
1710 unsigned FPU : 3;
1711
Daniel Dunbar893d4752009-12-19 04:15:38 +00001712 unsigned IsThumb : 1;
1713
1714 // Initialized via features.
1715 unsigned SoftFloat : 1;
1716 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001717
Chris Lattner5cc15e02010-03-03 19:03:45 +00001718 static const Builtin::Info BuiltinInfo[];
1719
Chris Lattner17df24e2008-04-21 18:56:49 +00001720public:
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001721 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001722 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001723 {
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001724 SizeType = UnsignedInt;
1725 PtrDiffType = SignedInt;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001726
Chris Lattner1a8f3942010-04-23 16:29:58 +00001727 // {} in inline assembly are neon specifiers, not assembly variant
1728 // specifiers.
1729 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001730
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001731 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00001732 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00001733 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00001734 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1735 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00001736 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1737 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00001738 "v64:64:64-v128:64:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001739 } else {
1740 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1741 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00001742 "v64:64:64-v128:64:128-a0:0:64-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001743 }
John McCall86353412010-08-21 22:46:04 +00001744
1745 // ARM targets default to using the ARM C++ ABI.
1746 CXXABI = CXXABI_ARM;
Eli Friedmanb5366062008-05-20 14:21:01 +00001747 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001748 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001749 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001750 ABI = Name;
1751
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001752 // The defaults (above) are for AAPCS, check if we need to change them.
1753 //
1754 // FIXME: We need support for -meabi... we could just mangle it into the
1755 // name.
1756 if (Name == "apcs-gnu") {
Daniel Dunbar377dc2f2010-01-27 20:23:08 +00001757 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001758 SizeType = UnsignedLong;
1759
Daniel Dunbarf8125062010-04-22 16:14:54 +00001760 // Do not respect the alignment of bit-field types when laying out
1761 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1762 UseBitFieldTypeAlignment = false;
1763
Daniel Dunbar03184792009-09-22 21:44:58 +00001764 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00001765 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1766 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00001767 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1768 "i64:32:32-f32:32:32-f64:32:32-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00001769 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001770 } else {
1771 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 +00001772 "i64:32:64-f32:32:32-f64:32:64-"
1773 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001774 }
1775
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001776 // FIXME: Override "preferred align" for double and long long.
1777 } else if (Name == "aapcs") {
1778 // FIXME: Enumerated types are variable width in straight AAPCS.
1779 } else if (Name == "aapcs-linux") {
1780 ;
1781 } else
1782 return false;
1783
1784 return true;
1785 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001786
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001787 void getDefaultFeatures(const std::string &CPU,
1788 llvm::StringMap<bool> &Features) const {
1789 // FIXME: This should not be here.
1790 Features["vfp2"] = false;
1791 Features["vfp3"] = false;
1792 Features["neon"] = false;
1793
1794 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1795 Features["vfp2"] = true;
1796 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1797 Features["neon"] = true;
1798 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001799
Daniel Dunbar893d4752009-12-19 04:15:38 +00001800 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1801 const std::string &Name,
1802 bool Enabled) const {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001803 if (Name == "soft-float" || Name == "soft-float-abi") {
1804 Features[Name] = Enabled;
1805 } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1806 // These effectively are a single option, reset them when any is enabled.
1807 if (Enabled)
1808 Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1809 Features[Name] = Enabled;
1810 } else
Daniel Dunbar893d4752009-12-19 04:15:38 +00001811 return false;
1812
Daniel Dunbar893d4752009-12-19 04:15:38 +00001813 return true;
1814 }
1815
1816 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001817 FPU = NoFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00001818 SoftFloat = SoftFloatABI = false;
1819 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1820 if (Features[i] == "+soft-float")
1821 SoftFloat = true;
1822 else if (Features[i] == "+soft-float-abi")
1823 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001824 else if (Features[i] == "+vfp2")
1825 FPU = VFP2FPU;
1826 else if (Features[i] == "+vfp3")
1827 FPU = VFP3FPU;
1828 else if (Features[i] == "+neon")
1829 FPU = NeonFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00001830 }
1831
1832 // Remove front-end specific options which the backend handles differently.
1833 std::vector<std::string>::iterator it;
1834 it = std::find(Features.begin(), Features.end(), "+soft-float");
1835 if (it != Features.end())
1836 Features.erase(it);
1837 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
1838 if (it != Features.end())
1839 Features.erase(it);
1840 }
1841
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001842 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
1843 return llvm::StringSwitch<const char*>(Name)
1844 .Cases("arm8", "arm810", "4")
1845 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
1846 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
1847 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
1848 .Case("ep9312", "4T")
1849 .Cases("arm10tdmi", "arm1020t", "5T")
1850 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
1851 .Case("arm926ej-s", "5TEJ")
1852 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
1853 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001854 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001855 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001856 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001857 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1858 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson44acad82011-01-06 16:57:20 +00001859 .Case("cortex-m3", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00001860 .Case("cortex-m0", "6M")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001861 .Default(0);
1862 }
1863 virtual bool setCPU(const std::string &Name) {
1864 if (!getCPUDefineSuffix(Name))
1865 return false;
1866
1867 CPU = Name;
1868 return true;
1869 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001870 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001871 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001872 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001873 Builder.defineMacro("__arm");
1874 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001875
Chris Lattnerecd49032009-03-02 22:27:17 +00001876 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001877 Builder.defineMacro("__ARMEL__");
1878 Builder.defineMacro("__LITTLE_ENDIAN__");
1879 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001880
1881 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001882 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001883
Mike Stump9d54bd72009-04-08 02:07:04 +00001884 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001885
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001886 // FIXME: It's more complicated than this and we don't really support
1887 // interworking.
1888 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001889 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001890
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001891 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001892 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001893
Daniel Dunbar893d4752009-12-19 04:15:38 +00001894 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001895 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001896
1897 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001898 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001899
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001900 bool IsThumb2 = IsThumb && (CPUArch == "6T2" || CPUArch.startswith("7"));
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001901 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001902 Builder.defineMacro("__THUMBEL__");
1903 Builder.defineMacro("__thumb__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001904 if (IsThumb2)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001905 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001906 }
1907
1908 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001909 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001910
1911 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001912 Builder.defineMacro("__VFP_FP__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001913
1914 // This only gets set when Neon instructions are actually available, unlike
1915 // the VFP define, hence the soft float and arch check. This is subtly
1916 // different from gcc, we follow the intent which was that it should be set
1917 // when Neon instructions are actually available.
1918 if (FPU == NeonFPU && !SoftFloat && IsThumb2)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001919 Builder.defineMacro("__ARM_NEON__");
Chris Lattner17df24e2008-04-21 18:56:49 +00001920 }
1921 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1922 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00001923 Records = BuiltinInfo;
1924 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00001925 }
1926 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001927 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +00001928 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001929 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001930 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001931 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001932 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00001933 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001934 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001935 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +00001936 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001937 default:
Nate Begeman2908fa02008-04-22 05:03:19 +00001938 case 'l': // r0-r7
1939 case 'h': // r8-r15
1940 case 'w': // VFP Floating point register single precision
1941 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00001942 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00001943 return true;
1944 }
Chris Lattner17df24e2008-04-21 18:56:49 +00001945 return false;
1946 }
1947 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001948 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00001949 return "";
1950 }
1951};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001952
1953const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001954 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001955 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001956 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
1957
1958 // Float registers
1959 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1960 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1961 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001962 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001963
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001964 // Double registers
1965 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
1966 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00001967 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
1968 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001969
1970 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00001971 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1972 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001973};
1974
1975void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00001976 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001977 Names = GCCRegNames;
1978 NumNames = llvm::array_lengthof(GCCRegNames);
1979}
1980
1981const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001982 { { "a1" }, "r0" },
1983 { { "a2" }, "r1" },
1984 { { "a3" }, "r2" },
1985 { { "a4" }, "r3" },
1986 { { "v1" }, "r4" },
1987 { { "v2" }, "r5" },
1988 { { "v3" }, "r6" },
1989 { { "v4" }, "r7" },
1990 { { "v5" }, "r8" },
1991 { { "v6", "rfp" }, "r9" },
1992 { { "sl" }, "r10" },
1993 { { "fp" }, "r11" },
1994 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00001995 { { "r13" }, "sp" },
1996 { { "r14" }, "lr" },
1997 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001998 // The S, D and Q registers overlap, but aren't really aliases; we
1999 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00002000};
2001
2002void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2003 unsigned &NumAliases) const {
2004 Aliases = GCCRegAliases;
2005 NumAliases = llvm::array_lengthof(GCCRegAliases);
2006}
Chris Lattner5cc15e02010-03-03 19:03:45 +00002007
2008const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00002009#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
2010#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
2011 ALL_LANGUAGES, false },
Chris Lattner5cc15e02010-03-03 19:03:45 +00002012#include "clang/Basic/BuiltinsARM.def"
2013};
Chris Lattner17df24e2008-04-21 18:56:49 +00002014} // end anonymous namespace.
2015
Eli Friedmanf05b7722008-08-20 07:44:10 +00002016
2017namespace {
Mike Stump11289f42009-09-09 15:08:12 +00002018class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002019 public DarwinTargetInfo<ARMTargetInfo> {
2020protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00002021 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002022 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00002023 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00002024 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002025
Torok Edwinb2b37c62009-06-30 17:10:35 +00002026public:
Mike Stump11289f42009-09-09 15:08:12 +00002027 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00002028 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2029 HasAlignMac68kSupport = true;
2030 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002031};
2032} // end anonymous namespace.
2033
Chris Lattner5ba61f02006-10-14 07:39:34 +00002034namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002035class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00002036 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2037 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002038 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00002039public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002040 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2041 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +00002042 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 +00002043 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002044 }
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002045 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2046 const std::string &Name,
2047 bool Enabled) const {
2048 if (Name == "soft-float")
2049 Features[Name] = Enabled;
2050 else
2051 return false;
2052
2053 return true;
2054 }
2055 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2056 SoftFloat = false;
2057 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2058 if (Features[i] == "+soft-float")
2059 SoftFloat = true;
2060 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002061 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002062 MacroBuilder &Builder) const {
2063 DefineStd(Builder, "sparc", Opts);
2064 Builder.defineMacro("__sparcv8");
2065 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002066
2067 if (SoftFloat)
2068 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00002069 }
2070 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2071 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002072 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00002073 }
2074 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002075 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +00002076 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002077 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002078 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002079 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002080 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002081 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00002082 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002083 // FIXME: Implement!
2084 return false;
Gabor Greif49991682008-02-21 16:29:08 +00002085 }
2086 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002087 // FIXME: Implement!
2088 return "";
Gabor Greif49991682008-02-21 16:29:08 +00002089 }
2090};
2091
Chris Lattner9b415d62009-01-27 01:58:38 +00002092const char * const SparcV8TargetInfo::GCCRegNames[] = {
2093 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2094 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2095 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2096 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2097};
2098
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002099void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002100 unsigned &NumNames) const {
2101 Names = GCCRegNames;
2102 NumNames = llvm::array_lengthof(GCCRegNames);
2103}
2104
2105const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002106 { { "g0" }, "r0" },
2107 { { "g1" }, "r1" },
2108 { { "g2" }, "r2" },
2109 { { "g3" }, "r3" },
2110 { { "g4" }, "r4" },
2111 { { "g5" }, "r5" },
2112 { { "g6" }, "r6" },
2113 { { "g7" }, "r7" },
2114 { { "o0" }, "r8" },
2115 { { "o1" }, "r9" },
2116 { { "o2" }, "r10" },
2117 { { "o3" }, "r11" },
2118 { { "o4" }, "r12" },
2119 { { "o5" }, "r13" },
2120 { { "o6", "sp" }, "r14" },
2121 { { "o7" }, "r15" },
2122 { { "l0" }, "r16" },
2123 { { "l1" }, "r17" },
2124 { { "l2" }, "r18" },
2125 { { "l3" }, "r19" },
2126 { { "l4" }, "r20" },
2127 { { "l5" }, "r21" },
2128 { { "l6" }, "r22" },
2129 { { "l7" }, "r23" },
2130 { { "i0" }, "r24" },
2131 { { "i1" }, "r25" },
2132 { { "i2" }, "r26" },
2133 { { "i3" }, "r27" },
2134 { { "i4" }, "r28" },
2135 { { "i5" }, "r29" },
2136 { { "i6", "fp" }, "r30" },
2137 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00002138};
2139
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002140void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002141 unsigned &NumAliases) const {
2142 Aliases = GCCRegAliases;
2143 NumAliases = llvm::array_lengthof(GCCRegAliases);
2144}
Gabor Greif49991682008-02-21 16:29:08 +00002145} // end anonymous namespace.
2146
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002147namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002148class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2149public:
2150 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2151 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2152 SizeType = UnsignedInt;
2153 PtrDiffType = SignedInt;
2154 }
2155};
Torok Edwinb2b37c62009-06-30 17:10:35 +00002156class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002157public:
2158 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002159 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00002160 SizeType = UnsignedInt;
2161 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002162 }
2163};
2164} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00002165
Chris Lattnerb781dc792008-05-08 05:58:21 +00002166namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002167 class MSP430TargetInfo : public TargetInfo {
2168 static const char * const GCCRegNames[];
2169 public:
2170 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2171 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00002172 IntWidth = 16; IntAlign = 16;
2173 LongWidth = 32; LongLongWidth = 64;
2174 LongAlign = LongLongAlign = 16;
2175 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002176 SizeType = UnsignedInt;
2177 IntMaxType = SignedLong;
2178 UIntMaxType = UnsignedLong;
2179 IntPtrType = SignedShort;
2180 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00002181 SigAtomicType = SignedLong;
Anton Korobeynikovd94329a2009-12-19 01:32:37 +00002182 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002183 }
2184 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002185 MacroBuilder &Builder) const {
2186 Builder.defineMacro("MSP430");
2187 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002188 // FIXME: defines for different 'flavours' of MCU
2189 }
2190 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2191 unsigned &NumRecords) const {
2192 // FIXME: Implement.
2193 Records = 0;
2194 NumRecords = 0;
2195 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002196 virtual void getGCCRegNames(const char * const *&Names,
2197 unsigned &NumNames) const;
2198 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2199 unsigned &NumAliases) const {
2200 // No aliases.
2201 Aliases = 0;
2202 NumAliases = 0;
2203 }
2204 virtual bool validateAsmConstraint(const char *&Name,
2205 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00002206 // No target constraints for now.
2207 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002208 }
2209 virtual const char *getClobbers() const {
2210 // FIXME: Is this really right?
2211 return "";
2212 }
2213 virtual const char *getVAListDeclaration() const {
2214 // FIXME: implement
Anton Korobeynikov2f910822009-05-08 18:24:57 +00002215 return "typedef char* __builtin_va_list;";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002216 }
2217 };
2218
2219 const char * const MSP430TargetInfo::GCCRegNames[] = {
2220 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2221 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2222 };
2223
2224 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2225 unsigned &NumNames) const {
2226 Names = GCCRegNames;
2227 NumNames = llvm::array_lengthof(GCCRegNames);
2228 }
2229}
2230
2231
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002232namespace {
2233 class SystemZTargetInfo : public TargetInfo {
2234 static const char * const GCCRegNames[];
2235 public:
2236 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2237 TLSSupported = false;
2238 IntWidth = IntAlign = 32;
2239 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2240 PointerWidth = PointerAlign = 64;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002241 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2242 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002243 }
2244 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002245 MacroBuilder &Builder) const {
2246 Builder.defineMacro("__s390__");
2247 Builder.defineMacro("__s390x__");
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002248 }
2249 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2250 unsigned &NumRecords) const {
2251 // FIXME: Implement.
2252 Records = 0;
2253 NumRecords = 0;
2254 }
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002255
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002256 virtual void getGCCRegNames(const char * const *&Names,
2257 unsigned &NumNames) const;
2258 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2259 unsigned &NumAliases) const {
2260 // No aliases.
2261 Aliases = 0;
2262 NumAliases = 0;
2263 }
2264 virtual bool validateAsmConstraint(const char *&Name,
2265 TargetInfo::ConstraintInfo &info) const {
2266 // FIXME: implement
2267 return true;
2268 }
2269 virtual const char *getClobbers() const {
2270 // FIXME: Is this really right?
2271 return "";
2272 }
2273 virtual const char *getVAListDeclaration() const {
2274 // FIXME: implement
2275 return "typedef char* __builtin_va_list;";
2276 }
2277 };
2278
2279 const char * const SystemZTargetInfo::GCCRegNames[] = {
2280 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2281 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2282 };
2283
2284 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2285 unsigned &NumNames) const {
2286 Names = GCCRegNames;
2287 NumNames = llvm::array_lengthof(GCCRegNames);
2288 }
2289}
2290
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002291namespace {
2292 class BlackfinTargetInfo : public TargetInfo {
2293 static const char * const GCCRegNames[];
2294 public:
2295 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2296 TLSSupported = false;
2297 DoubleAlign = 32;
2298 LongLongAlign = 32;
2299 LongDoubleAlign = 32;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002300 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002301 }
2302
2303 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002304 MacroBuilder &Builder) const {
2305 DefineStd(Builder, "bfin", Opts);
2306 DefineStd(Builder, "BFIN", Opts);
2307 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002308 // FIXME: This one is really dependent on -mcpu
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002309 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002310 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2311 }
2312
2313 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2314 unsigned &NumRecords) const {
2315 // FIXME: Implement.
2316 Records = 0;
2317 NumRecords = 0;
2318 }
2319
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002320 virtual void getGCCRegNames(const char * const *&Names,
2321 unsigned &NumNames) const;
2322
2323 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2324 unsigned &NumAliases) const {
2325 // No aliases.
2326 Aliases = 0;
2327 NumAliases = 0;
2328 }
2329
2330 virtual bool validateAsmConstraint(const char *&Name,
2331 TargetInfo::ConstraintInfo &Info) const {
2332 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2333 Info.setAllowsRegister();
2334 return true;
2335 }
2336 return false;
2337 }
2338
2339 virtual const char *getClobbers() const {
2340 return "";
2341 }
2342
2343 virtual const char *getVAListDeclaration() const {
2344 return "typedef char* __builtin_va_list;";
2345 }
2346 };
2347
2348 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2349 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2350 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2351 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2352 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2353 "a0", "a1", "cc",
2354 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2355 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2356 };
2357
2358 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2359 unsigned &NumNames) const {
2360 Names = GCCRegNames;
2361 NumNames = llvm::array_lengthof(GCCRegNames);
2362 }
2363}
2364
Eli Friedmana9c3d712009-08-19 20:47:07 +00002365namespace {
2366
Mike Stump11289f42009-09-09 15:08:12 +00002367 // LLVM and Clang cannot be used directly to output native binaries for
2368 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00002369 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00002370 //
2371 // TCE uses the llvm bitcode as input and uses it for generating customized
2372 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00002373 // publicly available in http://tce.cs.tut.fi
2374
2375 class TCETargetInfo : public TargetInfo{
2376 public:
2377 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2378 TLSSupported = false;
2379 IntWidth = 32;
2380 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00002381 PointerWidth = 32;
2382 IntAlign = 32;
2383 LongAlign = LongLongAlign = 32;
2384 PointerAlign = 32;
2385 SizeType = UnsignedInt;
2386 IntMaxType = SignedLong;
2387 UIntMaxType = UnsignedLong;
2388 IntPtrType = SignedInt;
2389 PtrDiffType = SignedInt;
2390 FloatWidth = 32;
2391 FloatAlign = 32;
2392 DoubleWidth = 32;
2393 DoubleAlign = 32;
2394 LongDoubleWidth = 32;
2395 LongDoubleAlign = 32;
2396 FloatFormat = &llvm::APFloat::IEEEsingle;
2397 DoubleFormat = &llvm::APFloat::IEEEsingle;
2398 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner09797542010-03-04 21:07:38 +00002399 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2400 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumidba4ed32011-02-18 08:44:38 +00002401 "f32:32:32-f64:32:32-v64:32:32-"
2402 "v128:32:32-a0:0:32-n32";
Eli Friedmana9c3d712009-08-19 20:47:07 +00002403 }
2404
2405 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002406 MacroBuilder &Builder) const {
2407 DefineStd(Builder, "tce", Opts);
2408 Builder.defineMacro("__TCE__");
2409 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00002410 }
2411 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2412 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00002413 virtual const char *getClobbers() const {
2414 return "";
2415 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002416 virtual const char *getVAListDeclaration() const {
2417 return "typedef void* __builtin_va_list;";
2418 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002419 virtual void getGCCRegNames(const char * const *&Names,
2420 unsigned &NumNames) const {}
2421 virtual bool validateAsmConstraint(const char *&Name,
2422 TargetInfo::ConstraintInfo &info) const {
2423 return true;
2424 }
2425 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2426 unsigned &NumAliases) const {}
2427 };
2428}
2429
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002430namespace {
2431class MipsTargetInfo : public TargetInfo {
Eric Christopher0b26a612010-03-02 02:41:08 +00002432 std::string ABI, CPU;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002433 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2434 static const char * const GCCRegNames[];
2435public:
Eric Christopher0b26a612010-03-02 02:41:08 +00002436 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002437 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2438 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2439 }
Eric Christopher0b26a612010-03-02 02:41:08 +00002440 virtual const char *getABI() const { return ABI.c_str(); }
2441 virtual bool setABI(const std::string &Name) {
2442
2443 if ((Name == "o32") || (Name == "eabi")) {
2444 ABI = Name;
2445 return true;
2446 } else
2447 return false;
2448 }
2449 virtual bool setCPU(const std::string &Name) {
2450 CPU = Name;
2451 return true;
2452 }
2453 void getDefaultFeatures(const std::string &CPU,
2454 llvm::StringMap<bool> &Features) const {
2455 Features[ABI] = true;
2456 Features[CPU] = true;
2457 }
2458 virtual void getArchDefines(const LangOptions &Opts,
2459 MacroBuilder &Builder) const {
2460 if (ABI == "o32")
2461 Builder.defineMacro("__mips_o32");
2462 else if (ABI == "eabi")
2463 Builder.defineMacro("__mips_eabi");
2464 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002465 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002466 MacroBuilder &Builder) const {
2467 DefineStd(Builder, "mips", Opts);
2468 Builder.defineMacro("_mips");
2469 DefineStd(Builder, "MIPSEB", Opts);
2470 Builder.defineMacro("_MIPSEB");
2471 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002472 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002473 }
2474 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2475 unsigned &NumRecords) const {
2476 // FIXME: Implement!
2477 }
2478 virtual const char *getVAListDeclaration() const {
2479 return "typedef void* __builtin_va_list;";
2480 }
2481 virtual void getGCCRegNames(const char * const *&Names,
2482 unsigned &NumNames) const;
2483 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2484 unsigned &NumAliases) const;
2485 virtual bool validateAsmConstraint(const char *&Name,
2486 TargetInfo::ConstraintInfo &Info) const {
2487 switch (*Name) {
2488 default:
2489 case 'r': // CPU registers.
2490 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2491 case 'y': // Equivalent to "r", backwards compatibility only.
2492 case 'f': // floating-point registers.
2493 Info.setAllowsRegister();
2494 return true;
2495 }
2496 return false;
2497 }
2498
2499 virtual const char *getClobbers() const {
2500 // FIXME: Implement!
2501 return "";
2502 }
2503};
2504
2505const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002506 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002507 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2508 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2509 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2510 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2511 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2512 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2513 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2514 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2515 "$fcc5","$fcc6","$fcc7"
2516};
2517
2518void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2519 unsigned &NumNames) const {
2520 Names = GCCRegNames;
2521 NumNames = llvm::array_lengthof(GCCRegNames);
2522}
2523
2524const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2525 { { "at" }, "$1" },
2526 { { "v0" }, "$2" },
2527 { { "v1" }, "$3" },
2528 { { "a0" }, "$4" },
2529 { { "a1" }, "$5" },
2530 { { "a2" }, "$6" },
2531 { { "a3" }, "$7" },
2532 { { "t0" }, "$8" },
2533 { { "t1" }, "$9" },
2534 { { "t2" }, "$10" },
2535 { { "t3" }, "$11" },
2536 { { "t4" }, "$12" },
2537 { { "t5" }, "$13" },
2538 { { "t6" }, "$14" },
2539 { { "t7" }, "$15" },
2540 { { "s0" }, "$16" },
2541 { { "s1" }, "$17" },
2542 { { "s2" }, "$18" },
2543 { { "s3" }, "$19" },
2544 { { "s4" }, "$20" },
2545 { { "s5" }, "$21" },
2546 { { "s6" }, "$22" },
2547 { { "s7" }, "$23" },
2548 { { "t8" }, "$24" },
2549 { { "t9" }, "$25" },
2550 { { "k0" }, "$26" },
2551 { { "k1" }, "$27" },
2552 { { "gp" }, "$28" },
2553 { { "sp" }, "$29" },
2554 { { "fp" }, "$30" },
2555 { { "ra" }, "$31" }
2556};
2557
2558void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2559 unsigned &NumAliases) const {
2560 Aliases = GCCRegAliases;
2561 NumAliases = llvm::array_lengthof(GCCRegAliases);
2562}
2563} // end anonymous namespace.
2564
2565namespace {
2566class MipselTargetInfo : public MipsTargetInfo {
2567public:
2568 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2569 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2570 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2571 }
2572
2573 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002574 MacroBuilder &Builder) const;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002575};
2576
2577void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002578 MacroBuilder &Builder) const {
2579 DefineStd(Builder, "mips", Opts);
2580 Builder.defineMacro("_mips");
2581 DefineStd(Builder, "MIPSEL", Opts);
2582 Builder.defineMacro("_MIPSEL");
2583 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002584 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002585}
2586} // end anonymous namespace.
2587
Chris Lattner5ba61f02006-10-14 07:39:34 +00002588//===----------------------------------------------------------------------===//
2589// Driver code
2590//===----------------------------------------------------------------------===//
2591
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002592static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar52322032009-08-18 05:47:58 +00002593 llvm::Triple Triple(T);
2594 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00002595
Daniel Dunbar52322032009-08-18 05:47:58 +00002596 switch (Triple.getArch()) {
2597 default:
2598 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00002599
Daniel Dunbar52322032009-08-18 05:47:58 +00002600 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00002601 case llvm::Triple::thumb:
Daniel Dunbar52322032009-08-18 05:47:58 +00002602 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00002603 case llvm::Triple::Linux:
2604 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002605 case llvm::Triple::Darwin:
Eli Friedman873f65a2008-08-21 00:13:15 +00002606 return new DarwinARMTargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002607 case llvm::Triple::FreeBSD:
Torok Edwinb2b37c62009-06-30 17:10:35 +00002608 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002609 default:
2610 return new ARMTargetInfo(T);
2611 }
Eli Friedmanb5366062008-05-20 14:21:01 +00002612
Daniel Dunbar52322032009-08-18 05:47:58 +00002613 case llvm::Triple::bfin:
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002614 return new BlackfinTargetInfo(T);
2615
Daniel Dunbar52322032009-08-18 05:47:58 +00002616 case llvm::Triple::msp430:
2617 return new MSP430TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +00002618
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002619 case llvm::Triple::mips:
2620 if (os == llvm::Triple::Psp)
2621 return new PSPTargetInfo<MipsTargetInfo>(T);
2622 if (os == llvm::Triple::Linux)
2623 return new LinuxTargetInfo<MipsTargetInfo>(T);
2624 return new MipsTargetInfo(T);
2625
2626 case llvm::Triple::mipsel:
2627 if (os == llvm::Triple::Psp)
2628 return new PSPTargetInfo<MipselTargetInfo>(T);
2629 if (os == llvm::Triple::Linux)
2630 return new LinuxTargetInfo<MipselTargetInfo>(T);
2631 return new MipselTargetInfo(T);
2632
Daniel Dunbar52322032009-08-18 05:47:58 +00002633 case llvm::Triple::ppc:
2634 if (os == llvm::Triple::Darwin)
Roman Divacky965b0b72011-01-06 08:27:10 +00002635 return new DarwinPPC32TargetInfo(T);
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002636 else if (os == llvm::Triple::FreeBSD)
2637 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002638 return new PPC32TargetInfo(T);
2639
2640 case llvm::Triple::ppc64:
2641 if (os == llvm::Triple::Darwin)
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00002642 return new DarwinPPC64TargetInfo(T);
John Thompsone467e192009-11-19 17:18:50 +00002643 else if (os == llvm::Triple::Lv2)
2644 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002645 else if (os == llvm::Triple::FreeBSD)
2646 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002647 return new PPC64TargetInfo(T);
2648
Chris Lattner5178f562010-03-06 21:21:27 +00002649 case llvm::Triple::mblaze:
2650 return new MBlazeTargetInfo(T);
2651
Daniel Dunbar52322032009-08-18 05:47:58 +00002652 case llvm::Triple::sparc:
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002653 if (os == llvm::Triple::AuroraUX)
2654 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002655 if (os == llvm::Triple::Solaris)
2656 return new SolarisSparcV8TargetInfo(T);
2657 return new SparcV8TargetInfo(T);
2658
John Thompsone467e192009-11-19 17:18:50 +00002659 // FIXME: Need a real SPU target.
2660 case llvm::Triple::cellspu:
2661 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2662
Daniel Dunbar52322032009-08-18 05:47:58 +00002663 case llvm::Triple::systemz:
2664 return new SystemZTargetInfo(T);
2665
Eli Friedmana9c3d712009-08-19 20:47:07 +00002666 case llvm::Triple::tce:
2667 return new TCETargetInfo(T);
2668
Daniel Dunbar52322032009-08-18 05:47:58 +00002669 case llvm::Triple::x86:
2670 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002671 case llvm::Triple::AuroraUX:
2672 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002673 case llvm::Triple::Darwin:
2674 return new DarwinI386TargetInfo(T);
2675 case llvm::Triple::Linux:
2676 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2677 case llvm::Triple::DragonFly:
2678 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2679 case llvm::Triple::NetBSD:
2680 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2681 case llvm::Triple::OpenBSD:
2682 return new OpenBSDI386TargetInfo(T);
2683 case llvm::Triple::FreeBSD:
2684 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner3e2ee142010-07-07 16:01:42 +00002685 case llvm::Triple::Minix:
2686 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002687 case llvm::Triple::Solaris:
2688 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2689 case llvm::Triple::Cygwin:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002690 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002691 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002692 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002693 case llvm::Triple::Win32:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002694 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattnerb986aba2010-04-11 19:29:39 +00002695 case llvm::Triple::Haiku:
2696 return new HaikuX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002697 default:
2698 return new X86_32TargetInfo(T);
2699 }
2700
2701 case llvm::Triple::x86_64:
2702 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002703 case llvm::Triple::AuroraUX:
2704 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002705 case llvm::Triple::Darwin:
2706 return new DarwinX86_64TargetInfo(T);
2707 case llvm::Triple::Linux:
2708 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner002ba6b2010-01-09 05:41:14 +00002709 case llvm::Triple::DragonFly:
2710 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002711 case llvm::Triple::NetBSD:
2712 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2713 case llvm::Triple::OpenBSD:
2714 return new OpenBSDX86_64TargetInfo(T);
2715 case llvm::Triple::FreeBSD:
2716 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2717 case llvm::Triple::Solaris:
2718 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00002719 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002720 return new MinGWX86_64TargetInfo(T);
2721 case llvm::Triple::Win32: // This is what Triple.h supports now.
Douglas Gregorde7a3572011-02-01 15:06:18 +00002722 if (Triple.getEnvironment() == llvm::Triple::MachO)
2723 return new DarwinX86_64TargetInfo(T);
2724 else
2725 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002726 default:
2727 return new X86_64TargetInfo(T);
2728 }
2729 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002730}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002731
2732/// CreateTargetInfo - Return the target info object for the specified target
2733/// triple.
2734TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002735 TargetOptions &Opts) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002736 llvm::Triple Triple(Opts.Triple);
2737
2738 // Construct the target
2739 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2740 if (!Target) {
2741 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2742 return 0;
2743 }
2744
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002745 // Set the target CPU if specified.
2746 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2747 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2748 return 0;
2749 }
2750
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002751 // Set the target ABI if specified.
2752 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2753 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2754 return 0;
2755 }
2756
Charles Davis95a546e2010-06-11 01:06:47 +00002757 // Set the target C++ ABI.
John McCall86353412010-08-21 22:46:04 +00002758 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis95a546e2010-06-11 01:06:47 +00002759 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2760 return 0;
2761 }
2762
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002763 // Compute the default target features, we need the target to handle this
2764 // because features may have dependencies on one another.
2765 llvm::StringMap<bool> Features;
2766 Target->getDefaultFeatures(Opts.CPU, Features);
2767
2768 // Apply the user specified deltas.
2769 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2770 ie = Opts.Features.end(); it != ie; ++it) {
2771 const char *Name = it->c_str();
2772
2773 // Apply the feature via the target.
2774 if ((Name[0] != '-' && Name[0] != '+') ||
2775 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2776 Diags.Report(diag::err_target_invalid_feature) << Name;
2777 return 0;
2778 }
2779 }
2780
2781 // Add the features to the compile options.
2782 //
2783 // FIXME: If we are completely confident that we have the right set, we only
2784 // need to pass the minuses.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002785 Opts.Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002786 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2787 ie = Features.end(); it != ie; ++it)
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002788 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2789 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002790
2791 return Target.take();
2792}