blob: 2af28d663c4007a6f5a94dccde2146cc3300fc2d [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,
79 const llvm::Triple &Triple) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 Builder.defineMacro("__APPLE_CC__", "5621");
81 Builder.defineMacro("__APPLE__");
82 Builder.defineMacro("__MACH__");
83 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000084
Chris Lattner2a5c0a32009-04-07 16:50:40 +000085 // __weak is always defined, for use in blocks and with objc pointers.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000086 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000087
Chris Lattner2a5c0a32009-04-07 16:50:40 +000088 // Darwin defines __strong even in C mode (just to nothing).
89 if (!Opts.ObjC1 || Opts.getGCMode() == LangOptions::NonGC)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000090 Builder.defineMacro("__strong", "");
Chris Lattner2a5c0a32009-04-07 16:50:40 +000091 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000092 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
Eli Friedmanfd4b1552009-06-04 23:00:29 +000093
94 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000095 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +000096 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000097 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +000098
99 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000100 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000101
Daniel Dunbard86666f2010-01-26 01:44:04 +0000102 // Get the OS version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000103 unsigned Maj, Min, Rev;
Mike Stump11289f42009-09-09 15:08:12 +0000104
Daniel Dunbard86666f2010-01-26 01:44:04 +0000105 // If no version was given, default to to 10.4.0, for simplifying tests.
106 if (Triple.getOSName() == "darwin") {
107 Min = Rev = 0;
108 Maj = 8;
109 } else
110 Triple.getDarwinNumber(Maj, Min, Rev);
111
112 // Set the appropriate OS version define.
113 if (Triple.getEnvironmentName() == "iphoneos") {
114 assert(Maj < 10 && Min < 99 && Rev < 99 && "Invalid version!");
115 char Str[6];
116 Str[0] = '0' + Maj;
117 Str[1] = '0' + (Min / 10);
118 Str[2] = '0' + (Min % 10);
119 Str[3] = '0' + (Rev / 10);
120 Str[4] = '0' + (Rev % 10);
121 Str[5] = '\0';
122 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
123 } else {
124 // For historical reasons that make little sense, the version passed here is
125 // the "darwin" version, which drops the 10 and offsets by 4.
126 Rev = Min;
127 Min = Maj - 4;
128 Maj = 10;
129
130 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
131 assert(Maj < 99 && Min < 10 && Rev < 10 && "Invalid version!");
132 char Str[5];
133 Str[0] = '0' + (Maj / 10);
134 Str[1] = '0' + (Maj % 10);
135 Str[2] = '0' + Min;
136 Str[3] = '0' + Rev;
137 Str[4] = '\0';
138 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000139 }
Eli Friedman3fd920a2008-08-20 02:34:37 +0000140}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000141
Chris Lattner30ba6742009-08-10 19:03:04 +0000142namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000143template<typename Target>
144class DarwinTargetInfo : public OSTargetInfo<Target> {
145protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000146 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000147 MacroBuilder &Builder) const {
Daniel Dunbard86666f2010-01-26 01:44:04 +0000148 getDarwinDefines(Builder, Opts, Triple);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000149 }
Mike Stump11289f42009-09-09 15:08:12 +0000150
Torok Edwinb2b37c62009-06-30 17:10:35 +0000151public:
152 DarwinTargetInfo(const std::string& triple) :
153 OSTargetInfo<Target>(triple) {
Eric Christopher17c7b892010-06-25 19:04:52 +0000154 this->TLSSupported = llvm::Triple(triple).getDarwinMajorNumber() > 10;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000155 }
156
Anders Carlsson0b0a1222010-01-30 18:33:31 +0000157 virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000158 // Let MCSectionMachO validate this.
159 llvm::StringRef Segment, Section;
160 unsigned TAA, StubSize;
161 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
162 TAA, StubSize);
163 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000164
Anders Carlsson851318a2010-06-08 22:47:50 +0000165 virtual const char *getStaticInitSectionSpecifier() const {
166 // FIXME: We should return 0 when building kexts.
167 return "__TEXT,__StaticInit,regular,pure_instructions";
168 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000169
Torok Edwinb2b37c62009-06-30 17:10:35 +0000170};
171
Chris Lattner30ba6742009-08-10 19:03:04 +0000172
Torok Edwinb2b37c62009-06-30 17:10:35 +0000173// DragonFlyBSD Target
174template<typename Target>
175class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
176protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000177 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000178 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000179 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000180 Builder.defineMacro("__DragonFly__");
181 Builder.defineMacro("__DragonFly_cc_version", "100001");
182 Builder.defineMacro("__ELF__");
183 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
184 Builder.defineMacro("__tune_i386__");
185 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000186 }
187public:
Mike Stump11289f42009-09-09 15:08:12 +0000188 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000189 : OSTargetInfo<Target>(triple) {}
190};
191
192// FreeBSD Target
193template<typename Target>
194class FreeBSDTargetInfo : public OSTargetInfo<Target> {
195protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000196 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000197 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000198 // FreeBSD defines; list based off of gcc output
199
Daniel Dunbar40165182009-08-24 09:10:05 +0000200 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000201 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000202
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000203 Builder.defineMacro("__FreeBSD__", Release);
204 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000205 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
206 DefineStd(Builder, "unix", Opts);
207 Builder.defineMacro("__ELF__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000208 }
209public:
Mike Stump11289f42009-09-09 15:08:12 +0000210 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands9cb27e92009-07-08 13:55:08 +0000211 : OSTargetInfo<Target>(triple) {
212 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000213
214 llvm::Triple Triple(triple);
215 switch (Triple.getArch()) {
216 default:
217 case llvm::Triple::x86:
218 case llvm::Triple::x86_64:
219 this->MCountName = ".mcount";
220 break;
221 case llvm::Triple::mips:
222 case llvm::Triple::mipsel:
223 case llvm::Triple::ppc:
224 case llvm::Triple::ppc64:
225 this->MCountName = "_mcount";
226 break;
227 case llvm::Triple::arm:
228 this->MCountName = "__mcount";
229 break;
230 }
231
Duncan Sands9cb27e92009-07-08 13:55:08 +0000232 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000233};
234
Chris Lattner3e2ee142010-07-07 16:01:42 +0000235// Minix Target
236template<typename Target>
237class MinixTargetInfo : public OSTargetInfo<Target> {
238protected:
239 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
240 MacroBuilder &Builder) const {
241 // Minix defines
242
243 Builder.defineMacro("__minix", "3");
244 Builder.defineMacro("_EM_WSIZE", "4");
245 Builder.defineMacro("_EM_PSIZE", "4");
246 Builder.defineMacro("_EM_SSIZE", "2");
247 Builder.defineMacro("_EM_LSIZE", "4");
248 Builder.defineMacro("_EM_FSIZE", "4");
249 Builder.defineMacro("_EM_DSIZE", "8");
250 DefineStd(Builder, "unix", Opts);
251 }
252public:
253 MinixTargetInfo(const std::string &triple)
254 : OSTargetInfo<Target>(triple) {
255 this->UserLabelPrefix = "";
256 }
257};
258
Torok Edwinb2b37c62009-06-30 17:10:35 +0000259// Linux target
260template<typename Target>
261class LinuxTargetInfo : public OSTargetInfo<Target> {
262protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000263 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000264 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000265 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000266 DefineStd(Builder, "unix", Opts);
267 DefineStd(Builder, "linux", Opts);
268 Builder.defineMacro("__gnu_linux__");
269 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000270 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000271 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000272 if (Opts.CPlusPlus)
273 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000274 }
275public:
Mike Stump11289f42009-09-09 15:08:12 +0000276 LinuxTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000277 : OSTargetInfo<Target>(triple) {
278 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000279 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000280 }
281};
282
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000283// NetBSD Target
284template<typename Target>
285class NetBSDTargetInfo : public OSTargetInfo<Target> {
286protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000287 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000288 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000289 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000290 Builder.defineMacro("__NetBSD__");
291 Builder.defineMacro("__unix__");
292 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000293 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000294 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000295 }
296public:
Mike Stump11289f42009-09-09 15:08:12 +0000297 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000298 : OSTargetInfo<Target>(triple) {
299 this->UserLabelPrefix = "";
300 }
301};
302
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303// OpenBSD Target
304template<typename Target>
305class OpenBSDTargetInfo : public OSTargetInfo<Target> {
306protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000307 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000308 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000309 // OpenBSD defines; list based off of gcc output
310
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000311 Builder.defineMacro("__OpenBSD__");
312 DefineStd(Builder, "unix", Opts);
313 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000314 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000315 Builder.defineMacro("_POSIX_THREADS");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000316 }
317public:
Mike Stump11289f42009-09-09 15:08:12 +0000318 OpenBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000319 : OSTargetInfo<Target>(triple) {}
320};
321
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000322// PSP Target
323template<typename Target>
324class PSPTargetInfo : public OSTargetInfo<Target> {
325protected:
326 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000327 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000328 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000329 Builder.defineMacro("PSP");
330 Builder.defineMacro("_PSP");
331 Builder.defineMacro("__psp__");
332 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000333 }
334public:
335 PSPTargetInfo(const std::string& triple)
336 : OSTargetInfo<Target>(triple) {
337 this->UserLabelPrefix = "";
338 }
339};
340
John Thompsone467e192009-11-19 17:18:50 +0000341// PS3 PPU Target
342template<typename Target>
343class PS3PPUTargetInfo : public OSTargetInfo<Target> {
344protected:
345 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000346 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000347 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000348 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000349 Builder.defineMacro("__PPU__");
350 Builder.defineMacro("__CELLOS_LV2__");
351 Builder.defineMacro("__ELF__");
352 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000353 Builder.defineMacro("_ARCH_PPC64");
354 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000355 }
356public:
357 PS3PPUTargetInfo(const std::string& triple)
358 : OSTargetInfo<Target>(triple) {
359 this->UserLabelPrefix = "";
John Thompson6f8dba72009-12-18 14:21:08 +0000360 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000361 this->IntMaxType = TargetInfo::SignedLongLong;
362 this->UIntMaxType = TargetInfo::UnsignedLongLong;
363 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000364 this->SizeType = TargetInfo::UnsignedInt;
John Thompson07a61a42010-06-24 22:44:13 +0000365 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
366 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompsone467e192009-11-19 17:18:50 +0000367 }
368};
369
370// FIXME: Need a real SPU target.
371// PS3 SPU Target
372template<typename Target>
373class PS3SPUTargetInfo : public OSTargetInfo<Target> {
374protected:
375 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000376 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000377 // PS3 PPU defines.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000378 Builder.defineMacro("__SPU__");
379 Builder.defineMacro("__ELF__");
John Thompsone467e192009-11-19 17:18:50 +0000380 }
381public:
382 PS3SPUTargetInfo(const std::string& triple)
383 : OSTargetInfo<Target>(triple) {
384 this->UserLabelPrefix = "";
385 }
386};
387
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000388// AuroraUX target
389template<typename Target>
390class AuroraUXTargetInfo : public OSTargetInfo<Target> {
391protected:
392 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000393 MacroBuilder &Builder) const {
394 DefineStd(Builder, "sun", Opts);
395 DefineStd(Builder, "unix", Opts);
396 Builder.defineMacro("__ELF__");
397 Builder.defineMacro("__svr4__");
398 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000399 }
400public:
401 AuroraUXTargetInfo(const std::string& triple)
402 : OSTargetInfo<Target>(triple) {
403 this->UserLabelPrefix = "";
404 this->WCharType = this->SignedLong;
405 // FIXME: WIntType should be SignedLong
406 }
407};
408
Torok Edwinb2b37c62009-06-30 17:10:35 +0000409// Solaris target
410template<typename Target>
411class SolarisTargetInfo : public OSTargetInfo<Target> {
412protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000413 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000414 MacroBuilder &Builder) const {
415 DefineStd(Builder, "sun", Opts);
416 DefineStd(Builder, "unix", Opts);
417 Builder.defineMacro("__ELF__");
418 Builder.defineMacro("__svr4__");
419 Builder.defineMacro("__SVR4");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000420 }
421public:
Mike Stump11289f42009-09-09 15:08:12 +0000422 SolarisTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000423 : OSTargetInfo<Target>(triple) {
424 this->UserLabelPrefix = "";
425 this->WCharType = this->SignedLong;
426 // FIXME: WIntType should be SignedLong
427 }
428};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000429
430// Windows target
431template<typename Target>
432class WindowsTargetInfo : public OSTargetInfo<Target> {
433protected:
434 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
435 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000436 Builder.defineMacro("_WIN32");
437 }
438 void getVisualStudioDefines(const LangOptions &Opts,
439 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000440 if (Opts.CPlusPlus) {
441 if (Opts.RTTI)
442 Builder.defineMacro("_CPPRTTI");
443
444 if (Opts.Exceptions)
445 Builder.defineMacro("_CPPUNWIND");
446 }
447
448 if (!Opts.CharIsSigned)
449 Builder.defineMacro("_CHAR_UNSIGNED");
450
451 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
452 // but it works for now.
453 if (Opts.POSIXThreads)
454 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000455
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000456 if (Opts.MSCVersion != 0)
457 Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
458
459 if (Opts.Microsoft) {
460 Builder.defineMacro("_MSC_EXTENSIONS");
461
462 if (Opts.CPlusPlus0x) {
463 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
464 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
465 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
466 }
467 }
468
469 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000470 }
471
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000472public:
473 WindowsTargetInfo(const std::string &triple)
474 : OSTargetInfo<Target>(triple) {}
475};
476
Mike Stump11289f42009-09-09 15:08:12 +0000477} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000478
Chris Lattner09d98f52008-10-05 21:50:58 +0000479//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000480// Specific target implementations.
481//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000482
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000483namespace {
484// PPC abstract base class
485class PPCTargetInfo : public TargetInfo {
486 static const Builtin::Info BuiltinInfo[];
487 static const char * const GCCRegNames[];
488 static const TargetInfo::GCCRegAlias GCCRegAliases[];
489
490public:
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000491 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
492
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000493 virtual void getTargetBuiltins(const Builtin::Info *&Records,
494 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000495 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000496 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000497 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000498
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000499 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000500 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000501
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000502 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000503 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000504 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000505 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000506 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000507 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000508 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000509 default: return false;
510 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000511 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000512 case 'b': // Base register
513 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000514 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000515 break;
516 // FIXME: The following are added to allow parsing.
517 // I just took a guess at what the actions should be.
518 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000519 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000520 case 'v': // Altivec vector register
521 Info.setAllowsRegister();
522 break;
523 case 'w':
524 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000525 case 'd':// VSX vector register to hold vector double data
526 case 'f':// VSX vector register to hold vector float data
527 case 's':// VSX vector register to hold scalar float data
528 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000529 break;
530 default:
531 return false;
532 }
533 Info.setAllowsRegister();
534 Name++; // Skip over 'w'.
535 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000536 case 'h': // `MQ', `CTR', or `LINK' register
537 case 'q': // `MQ' register
538 case 'c': // `CTR' register
539 case 'l': // `LINK' register
540 case 'x': // `CR' register (condition register) number 0
541 case 'y': // `CR' register (condition register)
542 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000543 Info.setAllowsRegister();
544 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000545 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000546 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000547 // (use `L' instead for SImode constants)
548 case 'K': // Unsigned 16-bit constant
549 case 'L': // Signed 16-bit constant shifted left 16 bits
550 case 'M': // Constant larger than 31
551 case 'N': // Exact power of 2
552 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000553 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000554 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000555 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000556 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000557 break;
558 case 'm': // Memory operand. Note that on PowerPC targets, m can
559 // include addresses that update the base register. It
560 // is therefore only safe to use `m' in an asm statement
561 // if that asm statement accesses the operand exactly once.
562 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000563 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000564 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000565 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000566 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000567 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
568 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000569 // register to be updated.
570 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000571 if (Name[1] != 's')
572 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000573 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000574 // include any automodification of the base register. Unlike
575 // `m', this constraint can be used in asm statements that
576 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000577 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000578 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000579 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000580 break;
581 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000582 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000583 case 'Z': // Memory operand that is an indexed or indirect from a
584 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000585 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000586 Info.setAllowsMemory();
587 Info.setAllowsRegister();
588 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000589 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000590 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000591 // register (`p' is preferable for asm statements)
592 case 'S': // Constant suitable as a 64-bit mask operand
593 case 'T': // Constant suitable as a 32-bit mask operand
594 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000595 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000596 // instructions
597 case 'W': // Vector constant that does not require memory
598 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000599 break;
600 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000601 }
John Thompson07a61a42010-06-24 22:44:13 +0000602 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000603 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000604 virtual const char *getClobbers() const {
605 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000606 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000607};
Anders Carlssonf511f642007-11-27 04:11:28 +0000608
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000609const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000610#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
611#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
612 ALL_LANGUAGES, false },
Chris Lattner5abdec72009-06-14 01:05:48 +0000613#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000614};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000615
616
Chris Lattnerecd49032009-03-02 22:27:17 +0000617/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
618/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000619void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000620 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000621 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000622 Builder.defineMacro("__ppc__");
623 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000624 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000625 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000626 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000627 Builder.defineMacro("_ARCH_PPC64");
628 Builder.defineMacro("_LP64");
629 Builder.defineMacro("__LP64__");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000630 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000631 Builder.defineMacro("__ppc64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000632 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000633 Builder.defineMacro("__ppc__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000634 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000635
Chris Lattnerecd49032009-03-02 22:27:17 +0000636 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000637 Builder.defineMacro("_BIG_ENDIAN");
638 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000639
Chris Lattnerecd49032009-03-02 22:27:17 +0000640 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000641 Builder.defineMacro("__NATURAL_ALIGNMENT__");
642 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000643
Chris Lattnerecd49032009-03-02 22:27:17 +0000644 // FIXME: Should be controlled by command line option.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000645 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000646
John Thompsone467e192009-11-19 17:18:50 +0000647 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000648 Builder.defineMacro("__VEC__", "10206");
649 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000650 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000651}
652
Chris Lattner17df24e2008-04-21 18:56:49 +0000653
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000654const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000655 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
656 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
657 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
658 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
659 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
660 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
661 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
662 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000663 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000664 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000665 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000666 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
667 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
668 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
669 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000670 "vrsave", "vscr",
671 "spe_acc", "spefscr",
672 "sfp"
673};
Chris Lattner10a5b382007-01-29 05:24:35 +0000674
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000675void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000676 unsigned &NumNames) const {
677 Names = GCCRegNames;
678 NumNames = llvm::array_lengthof(GCCRegNames);
679}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000680
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000681const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
682 // While some of these aliases do map to different registers
683 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000684 { { "0" }, "r0" },
685 { { "1"}, "r1" },
686 { { "2" }, "r2" },
687 { { "3" }, "r3" },
688 { { "4" }, "r4" },
689 { { "5" }, "r5" },
690 { { "6" }, "r6" },
691 { { "7" }, "r7" },
692 { { "8" }, "r8" },
693 { { "9" }, "r9" },
694 { { "10" }, "r10" },
695 { { "11" }, "r11" },
696 { { "12" }, "r12" },
697 { { "13" }, "r13" },
698 { { "14" }, "r14" },
699 { { "15" }, "r15" },
700 { { "16" }, "r16" },
701 { { "17" }, "r17" },
702 { { "18" }, "r18" },
703 { { "19" }, "r19" },
704 { { "20" }, "r20" },
705 { { "21" }, "r21" },
706 { { "22" }, "r22" },
707 { { "23" }, "r23" },
708 { { "24" }, "r24" },
709 { { "25" }, "r25" },
710 { { "26" }, "r26" },
711 { { "27" }, "r27" },
712 { { "28" }, "r28" },
713 { { "29" }, "r29" },
714 { { "30" }, "r30" },
715 { { "31" }, "r31" },
716 { { "fr0" }, "f0" },
717 { { "fr1" }, "f1" },
718 { { "fr2" }, "f2" },
719 { { "fr3" }, "f3" },
720 { { "fr4" }, "f4" },
721 { { "fr5" }, "f5" },
722 { { "fr6" }, "f6" },
723 { { "fr7" }, "f7" },
724 { { "fr8" }, "f8" },
725 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +0000726 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000727 { { "fr11" }, "f11" },
728 { { "fr12" }, "f12" },
729 { { "fr13" }, "f13" },
730 { { "fr14" }, "f14" },
731 { { "fr15" }, "f15" },
732 { { "fr16" }, "f16" },
733 { { "fr17" }, "f17" },
734 { { "fr18" }, "f18" },
735 { { "fr19" }, "f19" },
736 { { "fr20" }, "f20" },
737 { { "fr21" }, "f21" },
738 { { "fr22" }, "f22" },
739 { { "fr23" }, "f23" },
740 { { "fr24" }, "f24" },
741 { { "fr25" }, "f25" },
742 { { "fr26" }, "f26" },
743 { { "fr27" }, "f27" },
744 { { "fr28" }, "f28" },
745 { { "fr29" }, "f29" },
746 { { "fr30" }, "f30" },
747 { { "fr31" }, "f31" },
748 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000749};
750
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000751void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000752 unsigned &NumAliases) const {
753 Aliases = GCCRegAliases;
754 NumAliases = llvm::array_lengthof(GCCRegAliases);
755}
756} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000757
Chris Lattner5ba61f02006-10-14 07:39:34 +0000758namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000759class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000760public:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000761 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000762 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 +0000763 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000764
765 if (getTriple().getOS() == llvm::Triple::FreeBSD)
Roman Divacky965b0b72011-01-06 08:27:10 +0000766 SizeType = UnsignedInt;
767 }
768
769 virtual const char *getVAListDeclaration() const {
770 // This is the ELF definition, and is overridden by the Darwin sub-target
771 return "typedef struct __va_list_tag {"
772 " unsigned char gpr;"
773 " unsigned char fpr;"
774 " unsigned short reserved;"
775 " void* overflow_arg_area;"
776 " void* reg_save_area;"
777 "} __builtin_va_list[1];";
Eli Friedman873f65a2008-08-21 00:13:15 +0000778 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000779};
780} // end anonymous namespace.
781
782namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000783class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000784public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000785 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000786 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +0000787 IntMaxType = SignedLong;
788 UIntMaxType = UnsignedLong;
789 Int64Type = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +0000790 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 +0000791 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000792 }
Roman Divacky965b0b72011-01-06 08:27:10 +0000793 virtual const char *getVAListDeclaration() const {
794 return "typedef char* __builtin_va_list;";
795 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000796};
797} // end anonymous namespace.
798
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000799
800namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +0000801class DarwinPPC32TargetInfo :
802 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000803public:
Roman Divacky965b0b72011-01-06 08:27:10 +0000804 DarwinPPC32TargetInfo(const std::string& triple)
805 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000806 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +0000807 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
808 }
809 virtual const char *getVAListDeclaration() const {
810 return "typedef char* __builtin_va_list;";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000811 }
812};
813
814class DarwinPPC64TargetInfo :
815 public DarwinTargetInfo<PPC64TargetInfo> {
816public:
817 DarwinPPC64TargetInfo(const std::string& triple)
818 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
819 HasAlignMac68kSupport = true;
820 }
821};
822} // end anonymous namespace.
823
Chris Lattner5ba61f02006-10-14 07:39:34 +0000824namespace {
Chris Lattner5178f562010-03-06 21:21:27 +0000825// MBlaze abstract base class
826class MBlazeTargetInfo : public TargetInfo {
827 static const char * const GCCRegNames[];
828 static const TargetInfo::GCCRegAlias GCCRegAliases[];
829
830public:
831 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Peck69bf1282010-12-12 20:56:47 +0000832 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner5178f562010-03-06 21:21:27 +0000833 }
834
835 virtual void getTargetBuiltins(const Builtin::Info *&Records,
836 unsigned &NumRecords) const {
837 // FIXME: Implement.
838 Records = 0;
839 NumRecords = 0;
840 }
841
842 virtual void getTargetDefines(const LangOptions &Opts,
843 MacroBuilder &Builder) const;
844
845 virtual const char *getVAListDeclaration() const {
846 return "typedef char* __builtin_va_list;";
847 }
848 virtual const char *getTargetPrefix() const {
849 return "mblaze";
850 }
851 virtual void getGCCRegNames(const char * const *&Names,
852 unsigned &NumNames) const;
853 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
854 unsigned &NumAliases) const;
855 virtual bool validateAsmConstraint(const char *&Name,
856 TargetInfo::ConstraintInfo &Info) const {
857 switch (*Name) {
858 default: return false;
859 case 'O': // Zero
860 return true;
861 case 'b': // Base register
862 case 'f': // Floating point register
863 Info.setAllowsRegister();
864 return true;
865 }
866 }
867 virtual const char *getClobbers() const {
868 return "";
869 }
870};
871
872/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
873/// #defines that are not tied to a specific subtarget.
874void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
875 MacroBuilder &Builder) const {
876 // Target identification.
877 Builder.defineMacro("__microblaze__");
878 Builder.defineMacro("_ARCH_MICROBLAZE");
879 Builder.defineMacro("__MICROBLAZE__");
880
881 // Target properties.
882 Builder.defineMacro("_BIG_ENDIAN");
883 Builder.defineMacro("__BIG_ENDIAN__");
884
885 // Subtarget options.
886 Builder.defineMacro("__REGISTER_PREFIX__", "");
887}
888
889
890const char * const MBlazeTargetInfo::GCCRegNames[] = {
891 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
892 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
893 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
894 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
895 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
896 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
897 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
898 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
899 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
900 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
901};
902
903void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
904 unsigned &NumNames) const {
905 Names = GCCRegNames;
906 NumNames = llvm::array_lengthof(GCCRegNames);
907}
908
909const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
910 { {"f0"}, "r0" },
911 { {"f1"}, "r1" },
912 { {"f2"}, "r2" },
913 { {"f3"}, "r3" },
914 { {"f4"}, "r4" },
915 { {"f5"}, "r5" },
916 { {"f6"}, "r6" },
917 { {"f7"}, "r7" },
918 { {"f8"}, "r8" },
919 { {"f9"}, "r9" },
920 { {"f10"}, "r10" },
921 { {"f11"}, "r11" },
922 { {"f12"}, "r12" },
923 { {"f13"}, "r13" },
924 { {"f14"}, "r14" },
925 { {"f15"}, "r15" },
926 { {"f16"}, "r16" },
927 { {"f17"}, "r17" },
928 { {"f18"}, "r18" },
929 { {"f19"}, "r19" },
930 { {"f20"}, "r20" },
931 { {"f21"}, "r21" },
932 { {"f22"}, "r22" },
933 { {"f23"}, "r23" },
934 { {"f24"}, "r24" },
935 { {"f25"}, "r25" },
936 { {"f26"}, "r26" },
937 { {"f27"}, "r27" },
938 { {"f28"}, "r28" },
939 { {"f29"}, "r29" },
940 { {"f30"}, "r30" },
941 { {"f31"}, "r31" },
942};
943
944void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
945 unsigned &NumAliases) const {
946 Aliases = GCCRegAliases;
947 NumAliases = llvm::array_lengthof(GCCRegAliases);
948}
949} // end anonymous namespace.
950
951namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000952// Namespace for x86 abstract base class
953const Builtin::Info BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000954#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
955#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
956 ALL_LANGUAGES, false },
Chris Lattner5abdec72009-06-14 01:05:48 +0000957#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +0000958};
Eli Friedmanb5366062008-05-20 14:21:01 +0000959
Nuno Lopescfca1f02009-12-23 17:49:57 +0000960static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000961 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
962 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
963 "argp", "flags", "fspr", "dirflag", "frame",
964 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
965 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
966 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
967 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
968};
969
970const TargetInfo::GCCRegAlias GCCRegAliases[] = {
971 { { "al", "ah", "eax", "rax" }, "ax" },
972 { { "bl", "bh", "ebx", "rbx" }, "bx" },
973 { { "cl", "ch", "ecx", "rcx" }, "cx" },
974 { { "dl", "dh", "edx", "rdx" }, "dx" },
975 { { "esi", "rsi" }, "si" },
976 { { "edi", "rdi" }, "di" },
977 { { "esp", "rsp" }, "sp" },
978 { { "ebp", "rbp" }, "bp" },
979};
980
981// X86 target abstract base class; x86-32 and x86-64 are very close, so
982// most of the implementation can be shared.
983class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +0000984 enum X86SSEEnum {
985 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
986 } SSELevel;
Anders Carlssone437c682010-01-27 03:47:49 +0000987 enum AMD3DNowEnum {
988 NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
989 } AMD3DNowLevel;
990
Eric Christophere1ddaf92010-04-02 23:50:19 +0000991 bool HasAES;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +0000992 bool HasAVX;
993
Eli Friedman3fd920a2008-08-20 02:34:37 +0000994public:
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000995 X86TargetInfo(const std::string& triple)
Eric Christophere1ddaf92010-04-02 23:50:19 +0000996 : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +0000997 HasAES(false), HasAVX(false) {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000998 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +0000999 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001000 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1001 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001002 Records = BuiltinInfo;
1003 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001004 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001005 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001006 unsigned &NumNames) const {
1007 Names = GCCRegNames;
1008 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001009 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001010 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001011 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001012 Aliases = GCCRegAliases;
1013 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +00001014 }
Anders Carlsson58436352009-02-28 17:11:49 +00001015 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001016 TargetInfo::ConstraintInfo &info) const;
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00001017 virtual const llvm::Type* adjustInlineAsmType(std::string& Constraint,
1018 const llvm::Type* Ty,
1019 llvm::LLVMContext& Context) const;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001020 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001021 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001022 return "~{dirflag},~{fpsr},~{flags}";
1023 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001024 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001025 MacroBuilder &Builder) const;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001026 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1027 const std::string &Name,
1028 bool Enabled) const;
Mike Stump11289f42009-09-09 15:08:12 +00001029 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001030 llvm::StringMap<bool> &Features) const;
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001031 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Chris Lattner5ba61f02006-10-14 07:39:34 +00001032};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001033
Mike Stump11289f42009-09-09 15:08:12 +00001034void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001035 llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001036 // FIXME: This should not be here.
1037 Features["3dnow"] = false;
1038 Features["3dnowa"] = false;
1039 Features["mmx"] = false;
1040 Features["sse"] = false;
1041 Features["sse2"] = false;
1042 Features["sse3"] = false;
1043 Features["ssse3"] = false;
1044 Features["sse41"] = false;
1045 Features["sse42"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001046 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001047 Features["avx"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001048
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001049 // LLVM does not currently recognize this.
1050 // Features["sse4a"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001051
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001052 // FIXME: This *really* should not be here.
1053
1054 // X86_64 always has SSE2.
1055 if (PointerWidth == 64)
1056 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1057
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001058 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1059 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1060 ;
1061 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1062 setFeatureEnabled(Features, "mmx", true);
1063 else if (CPU == "pentium3")
1064 setFeatureEnabled(Features, "sse", true);
1065 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
1066 setFeatureEnabled(Features, "sse2", true);
1067 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
1068 setFeatureEnabled(Features, "sse3", true);
1069 else if (CPU == "core2")
1070 setFeatureEnabled(Features, "ssse3", true);
1071 else if (CPU == "penryn") {
1072 setFeatureEnabled(Features, "sse4", true);
1073 Features["sse42"] = false;
1074 } else if (CPU == "atom")
1075 setFeatureEnabled(Features, "sse3", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001076 else if (CPU == "corei7") {
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001077 setFeatureEnabled(Features, "sse4", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001078 setFeatureEnabled(Features, "aes", true);
1079 }
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001080 else if (CPU == "k6" || CPU == "winchip-c6")
1081 setFeatureEnabled(Features, "mmx", true);
Mike Stump11289f42009-09-09 15:08:12 +00001082 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001083 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
1084 setFeatureEnabled(Features, "mmx", true);
1085 setFeatureEnabled(Features, "3dnow", true);
1086 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1087 setFeatureEnabled(Features, "sse", true);
1088 setFeatureEnabled(Features, "3dnowa", true);
1089 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1090 CPU == "athlon-fx") {
Mike Stump11289f42009-09-09 15:08:12 +00001091 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001092 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackydacbfe42010-12-29 13:28:29 +00001093 } else if (CPU == "k8-sse3") {
1094 setFeatureEnabled(Features, "sse3", true);
1095 setFeatureEnabled(Features, "3dnowa", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001096 } else if (CPU == "c3-2")
1097 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001098}
1099
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001100bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump11289f42009-09-09 15:08:12 +00001101 const std::string &Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001102 bool Enabled) const {
Eric Christopher399ffa52010-03-04 02:26:37 +00001103 // FIXME: This *really* should not be here. We need some way of translating
1104 // options into llvm subtarget features.
1105 if (!Features.count(Name) &&
1106 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001107 return false;
1108
1109 if (Enabled) {
1110 if (Name == "mmx")
1111 Features["mmx"] = true;
1112 else if (Name == "sse")
1113 Features["mmx"] = Features["sse"] = true;
1114 else if (Name == "sse2")
1115 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1116 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001117 Features["mmx"] = Features["sse"] = Features["sse2"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001118 Features["sse3"] = true;
1119 else if (Name == "ssse3")
Mike Stump11289f42009-09-09 15:08:12 +00001120 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001121 Features["ssse3"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001122 else if (Name == "sse4" || Name == "sse4.2")
Mike Stump11289f42009-09-09 15:08:12 +00001123 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001124 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001125 else if (Name == "sse4.1")
1126 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1127 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001128 else if (Name == "3dnow")
1129 Features["3dnowa"] = true;
1130 else if (Name == "3dnowa")
1131 Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001132 else if (Name == "aes")
1133 Features["aes"] = true;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001134 else if (Name == "avx")
1135 Features["avx"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001136 } else {
1137 if (Name == "mmx")
Mike Stump11289f42009-09-09 15:08:12 +00001138 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001139 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1140 else if (Name == "sse")
Mike Stump11289f42009-09-09 15:08:12 +00001141 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001142 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1143 else if (Name == "sse2")
Mike Stump11289f42009-09-09 15:08:12 +00001144 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001145 Features["sse41"] = Features["sse42"] = false;
1146 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001147 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001148 Features["sse42"] = false;
1149 else if (Name == "ssse3")
1150 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1151 else if (Name == "sse4")
1152 Features["sse41"] = Features["sse42"] = false;
Eric Christophercfeceff2010-03-04 02:31:44 +00001153 else if (Name == "sse4.2")
1154 Features["sse42"] = false;
1155 else if (Name == "sse4.1")
1156 Features["sse41"] = Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001157 else if (Name == "3dnow")
1158 Features["3dnow"] = Features["3dnowa"] = false;
1159 else if (Name == "3dnowa")
1160 Features["3dnowa"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001161 else if (Name == "aes")
1162 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001163 else if (Name == "avx")
1164 Features["avx"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001165 }
1166
1167 return true;
1168}
1169
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001170/// HandleTargetOptions - Perform initialization based on the user
1171/// configured set of features.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001172void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00001173 // Remember the maximum enabled sselevel.
1174 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1175 // Ignore disabled features.
1176 if (Features[i][0] == '-')
1177 continue;
1178
Eric Christophere1ddaf92010-04-02 23:50:19 +00001179 if (Features[i].substr(1) == "aes") {
1180 HasAES = true;
1181 continue;
1182 }
1183
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001184 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1185 // For now let it be enabled together with other SSE levels.
1186 if (Features[i].substr(1) == "avx") {
1187 HasAVX = true;
1188 continue;
1189 }
1190
Daniel Dunbar979586e2009-11-11 09:38:56 +00001191 assert(Features[i][0] == '+' && "Invalid target feature!");
1192 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1193 .Case("sse42", SSE42)
1194 .Case("sse41", SSE41)
1195 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00001196 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00001197 .Case("sse2", SSE2)
1198 .Case("sse", SSE1)
1199 .Case("mmx", MMX)
1200 .Default(NoMMXSSE);
1201 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001202
1203 AMD3DNowEnum ThreeDNowLevel =
Anders Carlssone437c682010-01-27 03:47:49 +00001204 llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1205 .Case("3dnowa", AMD3DNowAthlon)
1206 .Case("3dnow", AMD3DNow)
1207 .Default(NoAMD3DNow);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001208
Anders Carlssone437c682010-01-27 03:47:49 +00001209 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001210 }
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001211}
Chris Lattnerecd49032009-03-02 22:27:17 +00001212
1213/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1214/// that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001215void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001216 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001217 // Target identification.
1218 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001219 Builder.defineMacro("_LP64");
1220 Builder.defineMacro("__LP64__");
1221 Builder.defineMacro("__amd64__");
1222 Builder.defineMacro("__amd64");
1223 Builder.defineMacro("__x86_64");
1224 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001225 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001226 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00001227 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001228
Eric Christophere1ddaf92010-04-02 23:50:19 +00001229 if (HasAES)
1230 Builder.defineMacro("__AES__");
1231
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001232 if (HasAVX)
1233 Builder.defineMacro("__AVX__");
1234
Chris Lattnerecd49032009-03-02 22:27:17 +00001235 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001236 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001237
Chris Lattnerecd49032009-03-02 22:27:17 +00001238 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001239 Builder.defineMacro("__nocona");
1240 Builder.defineMacro("__nocona__");
1241 Builder.defineMacro("__tune_nocona__");
1242 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner96e43572009-03-02 22:40:39 +00001243
Chris Lattner6df41af2009-04-19 17:32:33 +00001244 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1245 // functions in glibc header files that use FP Stack inline asm which the
1246 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001247 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001248
Chris Lattner96e43572009-03-02 22:40:39 +00001249 // Each case falls through to the previous one here.
1250 switch (SSELevel) {
1251 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001252 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00001253 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001254 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00001255 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001256 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001257 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001258 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001259 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001260 Builder.defineMacro("__SSE2__");
1261 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001262 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001263 Builder.defineMacro("__SSE__");
1264 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001265 case MMX:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001266 Builder.defineMacro("__MMX__");
Chris Lattner96e43572009-03-02 22:40:39 +00001267 case NoMMXSSE:
1268 break;
1269 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001270
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001271 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001272 switch (SSELevel) {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001273 case SSE42:
1274 case SSE41:
1275 case SSSE3:
1276 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001277 case SSE2:
1278 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1279 break;
1280 case SSE1:
1281 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1282 break;
1283 default:
1284 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1285 }
1286 }
1287
Anders Carlssone437c682010-01-27 03:47:49 +00001288 // Each case falls through to the previous one here.
1289 switch (AMD3DNowLevel) {
1290 case AMD3DNowAthlon:
1291 Builder.defineMacro("__3dNOW_A__");
1292 case AMD3DNow:
1293 Builder.defineMacro("__3dNOW__");
1294 case NoAMD3DNow:
1295 break;
1296 }
Chris Lattnerecd49032009-03-02 22:27:17 +00001297}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001298
1299
Eli Friedman3fd920a2008-08-20 02:34:37 +00001300bool
Anders Carlsson58436352009-02-28 17:11:49 +00001301X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001302 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00001303 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001304 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00001305 case 'Y': // first letter of a pair:
1306 switch (*(Name+1)) {
1307 default: return false;
1308 case '0': // First SSE register.
1309 case 't': // Any SSE register, when SSE2 is enabled.
1310 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1311 case 'm': // any MMX register, when inter-unit moves enabled.
1312 break; // falls through to setAllowsRegister.
1313 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001314 case 'a': // eax.
1315 case 'b': // ebx.
1316 case 'c': // ecx.
1317 case 'd': // edx.
1318 case 'S': // esi.
1319 case 'D': // edi.
1320 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00001321 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001322 case 't': // top of floating point stack.
1323 case 'u': // second from top of floating point stack.
1324 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00001325 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00001326 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001327 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00001328 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1329 case 'l': // "Index" registers: any general register that can be used as an
1330 // index in a base+index memory access.
1331 Info.setAllowsRegister();
1332 return true;
1333 case 'C': // SSE floating point constant.
1334 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001335 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001336 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001337 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001338 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001339 return true;
1340 }
Dale Johannesen46742a42010-08-24 22:33:12 +00001341 return false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001342}
1343
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00001344const llvm::Type*
1345X86TargetInfo::adjustInlineAsmType(std::string& Constraint,
1346 const llvm::Type* Ty,
1347 llvm::LLVMContext &Context) const {
1348 if (Constraint=="y" && Ty->isVectorTy())
1349 return llvm::Type::getX86_MMXTy(Context);
1350 return Ty;
1351}
1352
1353
Eli Friedman3fd920a2008-08-20 02:34:37 +00001354std::string
1355X86TargetInfo::convertConstraint(const char Constraint) const {
1356 switch (Constraint) {
1357 case 'a': return std::string("{ax}");
1358 case 'b': return std::string("{bx}");
1359 case 'c': return std::string("{cx}");
1360 case 'd': return std::string("{dx}");
1361 case 'S': return std::string("{si}");
1362 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00001363 case 'p': // address
1364 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00001365 case 't': // top of floating point stack.
1366 return std::string("{st}");
1367 case 'u': // second from top of floating point stack.
1368 return std::string("{st(1)}"); // second from top of floating point stack.
1369 default:
1370 return std::string(1, Constraint);
1371 }
1372}
Eli Friedman3fd920a2008-08-20 02:34:37 +00001373} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00001374
1375namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001376// X86-32 generic target
1377class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001378public:
Eli Friedman3fd920a2008-08-20 02:34:37 +00001379 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1380 DoubleAlign = LongLongAlign = 32;
1381 LongDoubleWidth = 96;
1382 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +00001383 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1384 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001385 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman32ca82a2009-03-29 20:31:09 +00001386 SizeType = UnsignedInt;
1387 PtrDiffType = SignedInt;
1388 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001389 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001390
1391 // Use fpret for all types.
1392 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1393 (1 << TargetInfo::Double) |
1394 (1 << TargetInfo::LongDouble));
Eli Friedman3fd920a2008-08-20 02:34:37 +00001395 }
1396 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001397 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +00001398 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001399
Chris Lattnerd545ad12009-09-23 06:06:36 +00001400 int getEHDataRegisterNumber(unsigned RegNo) const {
1401 if (RegNo == 0) return 0;
1402 if (RegNo == 1) return 2;
1403 return -1;
1404 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001405};
1406} // end anonymous namespace
1407
1408namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00001409class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1410public:
1411 OpenBSDI386TargetInfo(const std::string& triple) :
1412 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1413 SizeType = UnsignedLong;
1414 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00001415 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00001416 }
1417};
1418} // end anonymous namespace
1419
1420namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00001421class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001422public:
Torok Edwinb2b37c62009-06-30 17:10:35 +00001423 DarwinI386TargetInfo(const std::string& triple) :
1424 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001425 LongDoubleWidth = 128;
1426 LongDoubleAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00001427 SizeType = UnsignedLong;
1428 IntPtrType = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +00001429 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1430 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001431 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbarbd606522010-05-27 00:35:16 +00001432 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00001433 }
1434
Eli Friedman3fd920a2008-08-20 02:34:37 +00001435};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00001436} // end anonymous namespace
1437
1438namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001439// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001440class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001441public:
1442 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001443 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00001444 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00001445 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00001446 DoubleAlign = LongLongAlign = 64;
1447 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 +00001448 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1449 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001450 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001451 virtual void getTargetDefines(const LangOptions &Opts,
1452 MacroBuilder &Builder) const {
1453 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1454 }
1455};
1456} // end anonymous namespace
1457
1458namespace {
1459
1460// x86-32 Windows Visual Studio target
1461class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1462public:
1463 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1464 : WindowsX86_32TargetInfo(triple) {
1465 LongDoubleWidth = 64;
1466 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1467 }
1468 virtual void getTargetDefines(const LangOptions &Opts,
1469 MacroBuilder &Builder) const {
1470 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1471 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1472 // The value of the following reflects processor type.
1473 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1474 // We lost the original triple, so we use the default.
1475 Builder.defineMacro("_M_IX86", "600");
1476 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001477};
1478} // end anonymous namespace
1479
1480namespace {
1481// x86-32 MinGW target
1482class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1483public:
1484 MinGWX86_32TargetInfo(const std::string& triple)
1485 : WindowsX86_32TargetInfo(triple) {
1486 }
1487 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001488 MacroBuilder &Builder) const {
1489 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001490 DefineStd(Builder, "WIN32", Opts);
1491 DefineStd(Builder, "WINNT", Opts);
1492 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001493 Builder.defineMacro("__MSVCRT__");
1494 Builder.defineMacro("__MINGW32__");
1495 Builder.defineMacro("__declspec", "__declspec");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001496 }
1497};
1498} // end anonymous namespace
1499
1500namespace {
1501// x86-32 Cygwin target
1502class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1503public:
1504 CygwinX86_32TargetInfo(const std::string& triple)
1505 : X86_32TargetInfo(triple) {
1506 TLSSupported = false;
1507 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001508 DoubleAlign = LongLongAlign = 64;
1509 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1510 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001511 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001512 }
1513 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001514 MacroBuilder &Builder) const {
1515 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1516 Builder.defineMacro("__CYGWIN__");
1517 Builder.defineMacro("__CYGWIN32__");
1518 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00001519 if (Opts.CPlusPlus)
1520 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00001521 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001522};
1523} // end anonymous namespace
1524
1525namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00001526// x86-32 Haiku target
1527class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1528public:
1529 HaikuX86_32TargetInfo(const std::string& triple)
1530 : X86_32TargetInfo(triple) {
1531 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00001532 IntPtrType = SignedLong;
1533 PtrDiffType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00001534 this->UserLabelPrefix = "";
Eli Friedman04831922010-08-22 01:00:03 +00001535 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00001536 virtual void getTargetDefines(const LangOptions &Opts,
1537 MacroBuilder &Builder) const {
1538 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1539 Builder.defineMacro("__INTEL__");
1540 Builder.defineMacro("__HAIKU__");
1541 }
1542};
1543} // end anonymous namespace
1544
1545namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001546// x86-64 generic target
1547class X86_64TargetInfo : public X86TargetInfo {
1548public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001549 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001550 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00001551 LongDoubleWidth = 128;
1552 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00001553 LargeArrayMinWidth = 128;
1554 LargeArrayAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001555 IntMaxType = SignedLong;
1556 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001557 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001558 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001559
Eli Friedman873f65a2008-08-21 00:13:15 +00001560 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1561 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001562 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001563
1564 // Use fpret only for long double.
1565 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Chris Lattner10a5b382007-01-29 05:24:35 +00001566 }
Anders Carlssona7408e72007-10-13 00:45:48 +00001567 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001568 return "typedef struct __va_list_tag {"
1569 " unsigned gp_offset;"
1570 " unsigned fp_offset;"
1571 " void* overflow_arg_area;"
1572 " void* reg_save_area;"
John McCall61d82582010-05-28 18:25:28 +00001573 "} __va_list_tag;"
Eli Friedmanfb36b022009-07-03 00:45:06 +00001574 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001575 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001576
Chris Lattnerd545ad12009-09-23 06:06:36 +00001577 int getEHDataRegisterNumber(unsigned RegNo) const {
1578 if (RegNo == 0) return 0;
1579 if (RegNo == 1) return 1;
1580 return -1;
1581 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001582};
1583} // end anonymous namespace
1584
1585namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001586// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001587class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001588public:
1589 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001590 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001591 TLSSupported = false;
1592 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00001593 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001594 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00001595 IntMaxType = SignedLongLong;
1596 UIntMaxType = UnsignedLongLong;
1597 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00001598 SizeType = UnsignedLongLong;
1599 PtrDiffType = SignedLongLong;
1600 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00001601 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001602 }
1603 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001604 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001605 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001606 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001607 }
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00001608 virtual const char *getVAListDeclaration() const {
1609 return "typedef char* __builtin_va_list;";
1610 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001611};
1612} // end anonymous namespace
1613
1614namespace {
1615// x86-64 Windows Visual Studio target
1616class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1617public:
1618 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1619 : WindowsX86_64TargetInfo(triple) {
1620 }
1621 virtual void getTargetDefines(const LangOptions &Opts,
1622 MacroBuilder &Builder) const {
1623 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1624 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001625 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001626 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001627 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001628};
1629} // end anonymous namespace
1630
1631namespace {
1632// x86-64 MinGW target
1633class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1634public:
1635 MinGWX86_64TargetInfo(const std::string& triple)
1636 : WindowsX86_64TargetInfo(triple) {
1637 }
1638 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001639 MacroBuilder &Builder) const {
1640 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001641 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001642 Builder.defineMacro("__MSVCRT__");
1643 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumice5519a2011-01-17 22:56:16 +00001644 Builder.defineMacro("__declspec", "__declspec");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001645 }
1646};
1647} // end anonymous namespace
1648
1649namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00001650class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1651public:
Mike Stump11289f42009-09-09 15:08:12 +00001652 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman2857ccb2009-07-01 03:36:11 +00001653 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1654 Int64Type = SignedLongLong;
1655 }
1656};
1657} // end anonymous namespace
1658
1659namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00001660class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1661public:
Mike Stump11289f42009-09-09 15:08:12 +00001662 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman245f2292009-07-05 22:31:18 +00001663 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1664 IntMaxType = SignedLongLong;
1665 UIntMaxType = UnsignedLongLong;
1666 Int64Type = SignedLongLong;
1667 }
1668};
1669} // end anonymous namespace
1670
1671namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001672class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001673 // Possible FPU choices.
1674 enum FPUMode {
1675 NoFPU,
1676 VFP2FPU,
1677 VFP3FPU,
1678 NeonFPU
1679 };
1680
1681 static bool FPUModeIsVFP(FPUMode Mode) {
1682 return Mode >= VFP2FPU && Mode <= NeonFPU;
1683 }
1684
1685 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1686 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001687
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001688 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001689
1690 unsigned FPU : 3;
1691
Daniel Dunbar893d4752009-12-19 04:15:38 +00001692 unsigned IsThumb : 1;
1693
1694 // Initialized via features.
1695 unsigned SoftFloat : 1;
1696 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001697
Chris Lattner5cc15e02010-03-03 19:03:45 +00001698 static const Builtin::Info BuiltinInfo[];
1699
Chris Lattner17df24e2008-04-21 18:56:49 +00001700public:
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001701 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001702 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001703 {
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001704 SizeType = UnsignedInt;
1705 PtrDiffType = SignedInt;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001706
Chris Lattner1a8f3942010-04-23 16:29:58 +00001707 // {} in inline assembly are neon specifiers, not assembly variant
1708 // specifiers.
1709 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001710
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001711 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00001712 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00001713 if (IsThumb) {
1714 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1715 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001716 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001717 } else {
1718 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1719 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001720 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001721 }
John McCall86353412010-08-21 22:46:04 +00001722
1723 // ARM targets default to using the ARM C++ ABI.
1724 CXXABI = CXXABI_ARM;
Eli Friedmanb5366062008-05-20 14:21:01 +00001725 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001726 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001727 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001728 ABI = Name;
1729
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001730 // The defaults (above) are for AAPCS, check if we need to change them.
1731 //
1732 // FIXME: We need support for -meabi... we could just mangle it into the
1733 // name.
1734 if (Name == "apcs-gnu") {
Daniel Dunbar377dc2f2010-01-27 20:23:08 +00001735 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001736 SizeType = UnsignedLong;
1737
Daniel Dunbarf8125062010-04-22 16:14:54 +00001738 // Do not respect the alignment of bit-field types when laying out
1739 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1740 UseBitFieldTypeAlignment = false;
1741
Daniel Dunbar03184792009-09-22 21:44:58 +00001742 if (IsThumb) {
1743 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1744 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001745 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001746 } else {
1747 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1748 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001749 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001750 }
1751
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001752 // FIXME: Override "preferred align" for double and long long.
1753 } else if (Name == "aapcs") {
1754 // FIXME: Enumerated types are variable width in straight AAPCS.
1755 } else if (Name == "aapcs-linux") {
1756 ;
1757 } else
1758 return false;
1759
1760 return true;
1761 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001762
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001763 void getDefaultFeatures(const std::string &CPU,
1764 llvm::StringMap<bool> &Features) const {
1765 // FIXME: This should not be here.
1766 Features["vfp2"] = false;
1767 Features["vfp3"] = false;
1768 Features["neon"] = false;
1769
1770 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1771 Features["vfp2"] = true;
1772 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1773 Features["neon"] = true;
1774 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001775
Daniel Dunbar893d4752009-12-19 04:15:38 +00001776 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1777 const std::string &Name,
1778 bool Enabled) const {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001779 if (Name == "soft-float" || Name == "soft-float-abi") {
1780 Features[Name] = Enabled;
1781 } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1782 // These effectively are a single option, reset them when any is enabled.
1783 if (Enabled)
1784 Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1785 Features[Name] = Enabled;
1786 } else
Daniel Dunbar893d4752009-12-19 04:15:38 +00001787 return false;
1788
Daniel Dunbar893d4752009-12-19 04:15:38 +00001789 return true;
1790 }
1791
1792 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001793 FPU = NoFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00001794 SoftFloat = SoftFloatABI = false;
1795 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1796 if (Features[i] == "+soft-float")
1797 SoftFloat = true;
1798 else if (Features[i] == "+soft-float-abi")
1799 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001800 else if (Features[i] == "+vfp2")
1801 FPU = VFP2FPU;
1802 else if (Features[i] == "+vfp3")
1803 FPU = VFP3FPU;
1804 else if (Features[i] == "+neon")
1805 FPU = NeonFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00001806 }
1807
1808 // Remove front-end specific options which the backend handles differently.
1809 std::vector<std::string>::iterator it;
1810 it = std::find(Features.begin(), Features.end(), "+soft-float");
1811 if (it != Features.end())
1812 Features.erase(it);
1813 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
1814 if (it != Features.end())
1815 Features.erase(it);
1816 }
1817
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001818 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
1819 return llvm::StringSwitch<const char*>(Name)
1820 .Cases("arm8", "arm810", "4")
1821 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
1822 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
1823 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
1824 .Case("ep9312", "4T")
1825 .Cases("arm10tdmi", "arm1020t", "5T")
1826 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
1827 .Case("arm926ej-s", "5TEJ")
1828 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
1829 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001830 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001831 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001832 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001833 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1834 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson44acad82011-01-06 16:57:20 +00001835 .Case("cortex-m3", "7M")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001836 .Default(0);
1837 }
1838 virtual bool setCPU(const std::string &Name) {
1839 if (!getCPUDefineSuffix(Name))
1840 return false;
1841
1842 CPU = Name;
1843 return true;
1844 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001845 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001846 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001847 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001848 Builder.defineMacro("__arm");
1849 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001850
Chris Lattnerecd49032009-03-02 22:27:17 +00001851 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001852 Builder.defineMacro("__ARMEL__");
1853 Builder.defineMacro("__LITTLE_ENDIAN__");
1854 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001855
1856 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001857 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001858
Mike Stump9d54bd72009-04-08 02:07:04 +00001859 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001860
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001861 // FIXME: It's more complicated than this and we don't really support
1862 // interworking.
1863 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001864 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001865
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001866 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001867 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001868
Daniel Dunbar893d4752009-12-19 04:15:38 +00001869 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001870 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001871
1872 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001873 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001874
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001875 bool IsThumb2 = IsThumb && (CPUArch == "6T2" || CPUArch.startswith("7"));
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001876 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001877 Builder.defineMacro("__THUMBEL__");
1878 Builder.defineMacro("__thumb__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001879 if (IsThumb2)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001880 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001881 }
1882
1883 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001884 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001885
1886 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001887 Builder.defineMacro("__VFP_FP__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001888
1889 // This only gets set when Neon instructions are actually available, unlike
1890 // the VFP define, hence the soft float and arch check. This is subtly
1891 // different from gcc, we follow the intent which was that it should be set
1892 // when Neon instructions are actually available.
1893 if (FPU == NeonFPU && !SoftFloat && IsThumb2)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001894 Builder.defineMacro("__ARM_NEON__");
Chris Lattner17df24e2008-04-21 18:56:49 +00001895 }
1896 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1897 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00001898 Records = BuiltinInfo;
1899 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00001900 }
1901 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001902 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +00001903 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001904 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001905 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001906 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001907 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00001908 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001909 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001910 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +00001911 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001912 default:
Nate Begeman2908fa02008-04-22 05:03:19 +00001913 case 'l': // r0-r7
1914 case 'h': // r8-r15
1915 case 'w': // VFP Floating point register single precision
1916 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00001917 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00001918 return true;
1919 }
Chris Lattner17df24e2008-04-21 18:56:49 +00001920 return false;
1921 }
1922 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001923 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00001924 return "";
1925 }
1926};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001927
1928const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001929 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001930 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001931 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
1932
1933 // Float registers
1934 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1935 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1936 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001937 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001938
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001939 // Double registers
1940 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
1941 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00001942 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
1943 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001944
1945 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00001946 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1947 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001948};
1949
1950void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00001951 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001952 Names = GCCRegNames;
1953 NumNames = llvm::array_lengthof(GCCRegNames);
1954}
1955
1956const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001957 { { "a1" }, "r0" },
1958 { { "a2" }, "r1" },
1959 { { "a3" }, "r2" },
1960 { { "a4" }, "r3" },
1961 { { "v1" }, "r4" },
1962 { { "v2" }, "r5" },
1963 { { "v3" }, "r6" },
1964 { { "v4" }, "r7" },
1965 { { "v5" }, "r8" },
1966 { { "v6", "rfp" }, "r9" },
1967 { { "sl" }, "r10" },
1968 { { "fp" }, "r11" },
1969 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00001970 { { "r13" }, "sp" },
1971 { { "r14" }, "lr" },
1972 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001973 // The S, D and Q registers overlap, but aren't really aliases; we
1974 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001975};
1976
1977void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1978 unsigned &NumAliases) const {
1979 Aliases = GCCRegAliases;
1980 NumAliases = llvm::array_lengthof(GCCRegAliases);
1981}
Chris Lattner5cc15e02010-03-03 19:03:45 +00001982
1983const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001984#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
1985#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1986 ALL_LANGUAGES, false },
Chris Lattner5cc15e02010-03-03 19:03:45 +00001987#include "clang/Basic/BuiltinsARM.def"
1988};
Chris Lattner17df24e2008-04-21 18:56:49 +00001989} // end anonymous namespace.
1990
Eli Friedmanf05b7722008-08-20 07:44:10 +00001991
1992namespace {
Mike Stump11289f42009-09-09 15:08:12 +00001993class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00001994 public DarwinTargetInfo<ARMTargetInfo> {
1995protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00001996 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001997 MacroBuilder &Builder) const {
Daniel Dunbard86666f2010-01-26 01:44:04 +00001998 getDarwinDefines(Builder, Opts, Triple);
Eli Friedmand88c8a12009-04-19 21:38:35 +00001999 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002000
Torok Edwinb2b37c62009-06-30 17:10:35 +00002001public:
Mike Stump11289f42009-09-09 15:08:12 +00002002 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00002003 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2004 HasAlignMac68kSupport = true;
2005 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002006};
2007} // end anonymous namespace.
2008
Chris Lattner5ba61f02006-10-14 07:39:34 +00002009namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002010class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00002011 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2012 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002013 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00002014public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002015 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2016 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +00002017 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 +00002018 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002019 }
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002020 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2021 const std::string &Name,
2022 bool Enabled) const {
2023 if (Name == "soft-float")
2024 Features[Name] = Enabled;
2025 else
2026 return false;
2027
2028 return true;
2029 }
2030 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2031 SoftFloat = false;
2032 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2033 if (Features[i] == "+soft-float")
2034 SoftFloat = true;
2035 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002036 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002037 MacroBuilder &Builder) const {
2038 DefineStd(Builder, "sparc", Opts);
2039 Builder.defineMacro("__sparcv8");
2040 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002041
2042 if (SoftFloat)
2043 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00002044 }
2045 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2046 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002047 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00002048 }
2049 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002050 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +00002051 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002052 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002053 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002054 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002055 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002056 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00002057 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002058 // FIXME: Implement!
2059 return false;
Gabor Greif49991682008-02-21 16:29:08 +00002060 }
2061 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002062 // FIXME: Implement!
2063 return "";
Gabor Greif49991682008-02-21 16:29:08 +00002064 }
2065};
2066
Chris Lattner9b415d62009-01-27 01:58:38 +00002067const char * const SparcV8TargetInfo::GCCRegNames[] = {
2068 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2069 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2070 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2071 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2072};
2073
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002074void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002075 unsigned &NumNames) const {
2076 Names = GCCRegNames;
2077 NumNames = llvm::array_lengthof(GCCRegNames);
2078}
2079
2080const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002081 { { "g0" }, "r0" },
2082 { { "g1" }, "r1" },
2083 { { "g2" }, "r2" },
2084 { { "g3" }, "r3" },
2085 { { "g4" }, "r4" },
2086 { { "g5" }, "r5" },
2087 { { "g6" }, "r6" },
2088 { { "g7" }, "r7" },
2089 { { "o0" }, "r8" },
2090 { { "o1" }, "r9" },
2091 { { "o2" }, "r10" },
2092 { { "o3" }, "r11" },
2093 { { "o4" }, "r12" },
2094 { { "o5" }, "r13" },
2095 { { "o6", "sp" }, "r14" },
2096 { { "o7" }, "r15" },
2097 { { "l0" }, "r16" },
2098 { { "l1" }, "r17" },
2099 { { "l2" }, "r18" },
2100 { { "l3" }, "r19" },
2101 { { "l4" }, "r20" },
2102 { { "l5" }, "r21" },
2103 { { "l6" }, "r22" },
2104 { { "l7" }, "r23" },
2105 { { "i0" }, "r24" },
2106 { { "i1" }, "r25" },
2107 { { "i2" }, "r26" },
2108 { { "i3" }, "r27" },
2109 { { "i4" }, "r28" },
2110 { { "i5" }, "r29" },
2111 { { "i6", "fp" }, "r30" },
2112 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00002113};
2114
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002115void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002116 unsigned &NumAliases) const {
2117 Aliases = GCCRegAliases;
2118 NumAliases = llvm::array_lengthof(GCCRegAliases);
2119}
Gabor Greif49991682008-02-21 16:29:08 +00002120} // end anonymous namespace.
2121
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002122namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002123class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2124public:
2125 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2126 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2127 SizeType = UnsignedInt;
2128 PtrDiffType = SignedInt;
2129 }
2130};
Torok Edwinb2b37c62009-06-30 17:10:35 +00002131class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002132public:
2133 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002134 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00002135 SizeType = UnsignedInt;
2136 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002137 }
2138};
2139} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00002140
Chris Lattnerb781dc792008-05-08 05:58:21 +00002141namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002142 class MSP430TargetInfo : public TargetInfo {
2143 static const char * const GCCRegNames[];
2144 public:
2145 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2146 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00002147 IntWidth = 16; IntAlign = 16;
2148 LongWidth = 32; LongLongWidth = 64;
2149 LongAlign = LongLongAlign = 16;
2150 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002151 SizeType = UnsignedInt;
2152 IntMaxType = SignedLong;
2153 UIntMaxType = UnsignedLong;
2154 IntPtrType = SignedShort;
2155 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00002156 SigAtomicType = SignedLong;
Anton Korobeynikovd94329a2009-12-19 01:32:37 +00002157 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002158 }
2159 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002160 MacroBuilder &Builder) const {
2161 Builder.defineMacro("MSP430");
2162 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002163 // FIXME: defines for different 'flavours' of MCU
2164 }
2165 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2166 unsigned &NumRecords) const {
2167 // FIXME: Implement.
2168 Records = 0;
2169 NumRecords = 0;
2170 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002171 virtual void getGCCRegNames(const char * const *&Names,
2172 unsigned &NumNames) const;
2173 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2174 unsigned &NumAliases) const {
2175 // No aliases.
2176 Aliases = 0;
2177 NumAliases = 0;
2178 }
2179 virtual bool validateAsmConstraint(const char *&Name,
2180 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00002181 // No target constraints for now.
2182 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002183 }
2184 virtual const char *getClobbers() const {
2185 // FIXME: Is this really right?
2186 return "";
2187 }
2188 virtual const char *getVAListDeclaration() const {
2189 // FIXME: implement
Anton Korobeynikov2f910822009-05-08 18:24:57 +00002190 return "typedef char* __builtin_va_list;";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002191 }
2192 };
2193
2194 const char * const MSP430TargetInfo::GCCRegNames[] = {
2195 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2196 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2197 };
2198
2199 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2200 unsigned &NumNames) const {
2201 Names = GCCRegNames;
2202 NumNames = llvm::array_lengthof(GCCRegNames);
2203 }
2204}
2205
2206
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002207namespace {
2208 class SystemZTargetInfo : public TargetInfo {
2209 static const char * const GCCRegNames[];
2210 public:
2211 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2212 TLSSupported = false;
2213 IntWidth = IntAlign = 32;
2214 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2215 PointerWidth = PointerAlign = 64;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002216 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2217 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002218 }
2219 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002220 MacroBuilder &Builder) const {
2221 Builder.defineMacro("__s390__");
2222 Builder.defineMacro("__s390x__");
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002223 }
2224 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2225 unsigned &NumRecords) const {
2226 // FIXME: Implement.
2227 Records = 0;
2228 NumRecords = 0;
2229 }
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002230
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002231 virtual void getGCCRegNames(const char * const *&Names,
2232 unsigned &NumNames) const;
2233 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2234 unsigned &NumAliases) const {
2235 // No aliases.
2236 Aliases = 0;
2237 NumAliases = 0;
2238 }
2239 virtual bool validateAsmConstraint(const char *&Name,
2240 TargetInfo::ConstraintInfo &info) const {
2241 // FIXME: implement
2242 return true;
2243 }
2244 virtual const char *getClobbers() const {
2245 // FIXME: Is this really right?
2246 return "";
2247 }
2248 virtual const char *getVAListDeclaration() const {
2249 // FIXME: implement
2250 return "typedef char* __builtin_va_list;";
2251 }
2252 };
2253
2254 const char * const SystemZTargetInfo::GCCRegNames[] = {
2255 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2256 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2257 };
2258
2259 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2260 unsigned &NumNames) const {
2261 Names = GCCRegNames;
2262 NumNames = llvm::array_lengthof(GCCRegNames);
2263 }
2264}
2265
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002266namespace {
2267 class BlackfinTargetInfo : public TargetInfo {
2268 static const char * const GCCRegNames[];
2269 public:
2270 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2271 TLSSupported = false;
2272 DoubleAlign = 32;
2273 LongLongAlign = 32;
2274 LongDoubleAlign = 32;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002275 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002276 }
2277
2278 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002279 MacroBuilder &Builder) const {
2280 DefineStd(Builder, "bfin", Opts);
2281 DefineStd(Builder, "BFIN", Opts);
2282 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002283 // FIXME: This one is really dependent on -mcpu
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002284 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002285 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2286 }
2287
2288 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2289 unsigned &NumRecords) const {
2290 // FIXME: Implement.
2291 Records = 0;
2292 NumRecords = 0;
2293 }
2294
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002295 virtual void getGCCRegNames(const char * const *&Names,
2296 unsigned &NumNames) const;
2297
2298 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2299 unsigned &NumAliases) const {
2300 // No aliases.
2301 Aliases = 0;
2302 NumAliases = 0;
2303 }
2304
2305 virtual bool validateAsmConstraint(const char *&Name,
2306 TargetInfo::ConstraintInfo &Info) const {
2307 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2308 Info.setAllowsRegister();
2309 return true;
2310 }
2311 return false;
2312 }
2313
2314 virtual const char *getClobbers() const {
2315 return "";
2316 }
2317
2318 virtual const char *getVAListDeclaration() const {
2319 return "typedef char* __builtin_va_list;";
2320 }
2321 };
2322
2323 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2324 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2325 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2326 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2327 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2328 "a0", "a1", "cc",
2329 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2330 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2331 };
2332
2333 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2334 unsigned &NumNames) const {
2335 Names = GCCRegNames;
2336 NumNames = llvm::array_lengthof(GCCRegNames);
2337 }
2338}
2339
Eli Friedmana9c3d712009-08-19 20:47:07 +00002340namespace {
2341
Mike Stump11289f42009-09-09 15:08:12 +00002342 // LLVM and Clang cannot be used directly to output native binaries for
2343 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00002344 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00002345 //
2346 // TCE uses the llvm bitcode as input and uses it for generating customized
2347 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00002348 // publicly available in http://tce.cs.tut.fi
2349
2350 class TCETargetInfo : public TargetInfo{
2351 public:
2352 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2353 TLSSupported = false;
2354 IntWidth = 32;
2355 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00002356 PointerWidth = 32;
2357 IntAlign = 32;
2358 LongAlign = LongLongAlign = 32;
2359 PointerAlign = 32;
2360 SizeType = UnsignedInt;
2361 IntMaxType = SignedLong;
2362 UIntMaxType = UnsignedLong;
2363 IntPtrType = SignedInt;
2364 PtrDiffType = SignedInt;
2365 FloatWidth = 32;
2366 FloatAlign = 32;
2367 DoubleWidth = 32;
2368 DoubleAlign = 32;
2369 LongDoubleWidth = 32;
2370 LongDoubleAlign = 32;
2371 FloatFormat = &llvm::APFloat::IEEEsingle;
2372 DoubleFormat = &llvm::APFloat::IEEEsingle;
2373 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner09797542010-03-04 21:07:38 +00002374 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2375 "i16:16:32-i32:32:32-i64:32:32-"
2376 "f32:32:32-f64:64:64-v64:64:64-"
2377 "v128:128:128-a0:0:64-n32";
Eli Friedmana9c3d712009-08-19 20:47:07 +00002378 }
2379
2380 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002381 MacroBuilder &Builder) const {
2382 DefineStd(Builder, "tce", Opts);
2383 Builder.defineMacro("__TCE__");
2384 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00002385 }
2386 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2387 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00002388 virtual const char *getClobbers() const {
2389 return "";
2390 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002391 virtual const char *getVAListDeclaration() const {
2392 return "typedef void* __builtin_va_list;";
2393 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002394 virtual void getGCCRegNames(const char * const *&Names,
2395 unsigned &NumNames) const {}
2396 virtual bool validateAsmConstraint(const char *&Name,
2397 TargetInfo::ConstraintInfo &info) const {
2398 return true;
2399 }
2400 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2401 unsigned &NumAliases) const {}
2402 };
2403}
2404
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002405namespace {
2406class MipsTargetInfo : public TargetInfo {
Eric Christopher0b26a612010-03-02 02:41:08 +00002407 std::string ABI, CPU;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002408 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2409 static const char * const GCCRegNames[];
2410public:
Eric Christopher0b26a612010-03-02 02:41:08 +00002411 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002412 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2413 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2414 }
Eric Christopher0b26a612010-03-02 02:41:08 +00002415 virtual const char *getABI() const { return ABI.c_str(); }
2416 virtual bool setABI(const std::string &Name) {
2417
2418 if ((Name == "o32") || (Name == "eabi")) {
2419 ABI = Name;
2420 return true;
2421 } else
2422 return false;
2423 }
2424 virtual bool setCPU(const std::string &Name) {
2425 CPU = Name;
2426 return true;
2427 }
2428 void getDefaultFeatures(const std::string &CPU,
2429 llvm::StringMap<bool> &Features) const {
2430 Features[ABI] = true;
2431 Features[CPU] = true;
2432 }
2433 virtual void getArchDefines(const LangOptions &Opts,
2434 MacroBuilder &Builder) const {
2435 if (ABI == "o32")
2436 Builder.defineMacro("__mips_o32");
2437 else if (ABI == "eabi")
2438 Builder.defineMacro("__mips_eabi");
2439 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002440 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002441 MacroBuilder &Builder) const {
2442 DefineStd(Builder, "mips", Opts);
2443 Builder.defineMacro("_mips");
2444 DefineStd(Builder, "MIPSEB", Opts);
2445 Builder.defineMacro("_MIPSEB");
2446 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002447 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002448 }
2449 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2450 unsigned &NumRecords) const {
2451 // FIXME: Implement!
2452 }
2453 virtual const char *getVAListDeclaration() const {
2454 return "typedef void* __builtin_va_list;";
2455 }
2456 virtual void getGCCRegNames(const char * const *&Names,
2457 unsigned &NumNames) const;
2458 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2459 unsigned &NumAliases) const;
2460 virtual bool validateAsmConstraint(const char *&Name,
2461 TargetInfo::ConstraintInfo &Info) const {
2462 switch (*Name) {
2463 default:
2464 case 'r': // CPU registers.
2465 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2466 case 'y': // Equivalent to "r", backwards compatibility only.
2467 case 'f': // floating-point registers.
2468 Info.setAllowsRegister();
2469 return true;
2470 }
2471 return false;
2472 }
2473
2474 virtual const char *getClobbers() const {
2475 // FIXME: Implement!
2476 return "";
2477 }
2478};
2479
2480const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002481 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002482 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2483 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2484 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2485 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2486 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2487 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2488 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2489 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2490 "$fcc5","$fcc6","$fcc7"
2491};
2492
2493void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2494 unsigned &NumNames) const {
2495 Names = GCCRegNames;
2496 NumNames = llvm::array_lengthof(GCCRegNames);
2497}
2498
2499const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2500 { { "at" }, "$1" },
2501 { { "v0" }, "$2" },
2502 { { "v1" }, "$3" },
2503 { { "a0" }, "$4" },
2504 { { "a1" }, "$5" },
2505 { { "a2" }, "$6" },
2506 { { "a3" }, "$7" },
2507 { { "t0" }, "$8" },
2508 { { "t1" }, "$9" },
2509 { { "t2" }, "$10" },
2510 { { "t3" }, "$11" },
2511 { { "t4" }, "$12" },
2512 { { "t5" }, "$13" },
2513 { { "t6" }, "$14" },
2514 { { "t7" }, "$15" },
2515 { { "s0" }, "$16" },
2516 { { "s1" }, "$17" },
2517 { { "s2" }, "$18" },
2518 { { "s3" }, "$19" },
2519 { { "s4" }, "$20" },
2520 { { "s5" }, "$21" },
2521 { { "s6" }, "$22" },
2522 { { "s7" }, "$23" },
2523 { { "t8" }, "$24" },
2524 { { "t9" }, "$25" },
2525 { { "k0" }, "$26" },
2526 { { "k1" }, "$27" },
2527 { { "gp" }, "$28" },
2528 { { "sp" }, "$29" },
2529 { { "fp" }, "$30" },
2530 { { "ra" }, "$31" }
2531};
2532
2533void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2534 unsigned &NumAliases) const {
2535 Aliases = GCCRegAliases;
2536 NumAliases = llvm::array_lengthof(GCCRegAliases);
2537}
2538} // end anonymous namespace.
2539
2540namespace {
2541class MipselTargetInfo : public MipsTargetInfo {
2542public:
2543 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2544 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2545 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2546 }
2547
2548 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002549 MacroBuilder &Builder) const;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002550};
2551
2552void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002553 MacroBuilder &Builder) const {
2554 DefineStd(Builder, "mips", Opts);
2555 Builder.defineMacro("_mips");
2556 DefineStd(Builder, "MIPSEL", Opts);
2557 Builder.defineMacro("_MIPSEL");
2558 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002559 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002560}
2561} // end anonymous namespace.
2562
Chris Lattner5ba61f02006-10-14 07:39:34 +00002563//===----------------------------------------------------------------------===//
2564// Driver code
2565//===----------------------------------------------------------------------===//
2566
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002567static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar52322032009-08-18 05:47:58 +00002568 llvm::Triple Triple(T);
2569 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00002570
Daniel Dunbar52322032009-08-18 05:47:58 +00002571 switch (Triple.getArch()) {
2572 default:
2573 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00002574
Daniel Dunbar52322032009-08-18 05:47:58 +00002575 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00002576 case llvm::Triple::thumb:
Daniel Dunbar52322032009-08-18 05:47:58 +00002577 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00002578 case llvm::Triple::Linux:
2579 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002580 case llvm::Triple::Darwin:
Eli Friedman873f65a2008-08-21 00:13:15 +00002581 return new DarwinARMTargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002582 case llvm::Triple::FreeBSD:
Torok Edwinb2b37c62009-06-30 17:10:35 +00002583 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002584 default:
2585 return new ARMTargetInfo(T);
2586 }
Eli Friedmanb5366062008-05-20 14:21:01 +00002587
Daniel Dunbar52322032009-08-18 05:47:58 +00002588 case llvm::Triple::bfin:
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002589 return new BlackfinTargetInfo(T);
2590
Daniel Dunbar52322032009-08-18 05:47:58 +00002591 case llvm::Triple::msp430:
2592 return new MSP430TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +00002593
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002594 case llvm::Triple::mips:
2595 if (os == llvm::Triple::Psp)
2596 return new PSPTargetInfo<MipsTargetInfo>(T);
2597 if (os == llvm::Triple::Linux)
2598 return new LinuxTargetInfo<MipsTargetInfo>(T);
2599 return new MipsTargetInfo(T);
2600
2601 case llvm::Triple::mipsel:
2602 if (os == llvm::Triple::Psp)
2603 return new PSPTargetInfo<MipselTargetInfo>(T);
2604 if (os == llvm::Triple::Linux)
2605 return new LinuxTargetInfo<MipselTargetInfo>(T);
2606 return new MipselTargetInfo(T);
2607
Daniel Dunbar52322032009-08-18 05:47:58 +00002608 case llvm::Triple::ppc:
2609 if (os == llvm::Triple::Darwin)
Roman Divacky965b0b72011-01-06 08:27:10 +00002610 return new DarwinPPC32TargetInfo(T);
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002611 else if (os == llvm::Triple::FreeBSD)
2612 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002613 return new PPC32TargetInfo(T);
2614
2615 case llvm::Triple::ppc64:
2616 if (os == llvm::Triple::Darwin)
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00002617 return new DarwinPPC64TargetInfo(T);
John Thompsone467e192009-11-19 17:18:50 +00002618 else if (os == llvm::Triple::Lv2)
2619 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002620 else if (os == llvm::Triple::FreeBSD)
2621 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002622 return new PPC64TargetInfo(T);
2623
Chris Lattner5178f562010-03-06 21:21:27 +00002624 case llvm::Triple::mblaze:
2625 return new MBlazeTargetInfo(T);
2626
Daniel Dunbar52322032009-08-18 05:47:58 +00002627 case llvm::Triple::sparc:
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002628 if (os == llvm::Triple::AuroraUX)
2629 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002630 if (os == llvm::Triple::Solaris)
2631 return new SolarisSparcV8TargetInfo(T);
2632 return new SparcV8TargetInfo(T);
2633
John Thompsone467e192009-11-19 17:18:50 +00002634 // FIXME: Need a real SPU target.
2635 case llvm::Triple::cellspu:
2636 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2637
Daniel Dunbar52322032009-08-18 05:47:58 +00002638 case llvm::Triple::systemz:
2639 return new SystemZTargetInfo(T);
2640
Eli Friedmana9c3d712009-08-19 20:47:07 +00002641 case llvm::Triple::tce:
2642 return new TCETargetInfo(T);
2643
Daniel Dunbar52322032009-08-18 05:47:58 +00002644 case llvm::Triple::x86:
2645 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002646 case llvm::Triple::AuroraUX:
2647 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002648 case llvm::Triple::Darwin:
2649 return new DarwinI386TargetInfo(T);
2650 case llvm::Triple::Linux:
2651 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2652 case llvm::Triple::DragonFly:
2653 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2654 case llvm::Triple::NetBSD:
2655 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2656 case llvm::Triple::OpenBSD:
2657 return new OpenBSDI386TargetInfo(T);
2658 case llvm::Triple::FreeBSD:
2659 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner3e2ee142010-07-07 16:01:42 +00002660 case llvm::Triple::Minix:
2661 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002662 case llvm::Triple::Solaris:
2663 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2664 case llvm::Triple::Cygwin:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002665 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002666 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002667 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002668 case llvm::Triple::Win32:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002669 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattnerb986aba2010-04-11 19:29:39 +00002670 case llvm::Triple::Haiku:
2671 return new HaikuX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002672 default:
2673 return new X86_32TargetInfo(T);
2674 }
2675
2676 case llvm::Triple::x86_64:
2677 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002678 case llvm::Triple::AuroraUX:
2679 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002680 case llvm::Triple::Darwin:
2681 return new DarwinX86_64TargetInfo(T);
2682 case llvm::Triple::Linux:
2683 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner002ba6b2010-01-09 05:41:14 +00002684 case llvm::Triple::DragonFly:
2685 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002686 case llvm::Triple::NetBSD:
2687 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2688 case llvm::Triple::OpenBSD:
2689 return new OpenBSDX86_64TargetInfo(T);
2690 case llvm::Triple::FreeBSD:
2691 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2692 case llvm::Triple::Solaris:
2693 return new SolarisTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002694 case llvm::Triple::MinGW64:
2695 return new MinGWX86_64TargetInfo(T);
2696 case llvm::Triple::Win32: // This is what Triple.h supports now.
Douglas Gregorde7a3572011-02-01 15:06:18 +00002697 if (Triple.getEnvironment() == llvm::Triple::MachO)
2698 return new DarwinX86_64TargetInfo(T);
2699 else
2700 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002701 default:
2702 return new X86_64TargetInfo(T);
2703 }
2704 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002705}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002706
2707/// CreateTargetInfo - Return the target info object for the specified target
2708/// triple.
2709TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002710 TargetOptions &Opts) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002711 llvm::Triple Triple(Opts.Triple);
2712
2713 // Construct the target
2714 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2715 if (!Target) {
2716 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2717 return 0;
2718 }
2719
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002720 // Set the target CPU if specified.
2721 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2722 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2723 return 0;
2724 }
2725
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002726 // Set the target ABI if specified.
2727 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2728 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2729 return 0;
2730 }
2731
Charles Davis95a546e2010-06-11 01:06:47 +00002732 // Set the target C++ ABI.
John McCall86353412010-08-21 22:46:04 +00002733 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis95a546e2010-06-11 01:06:47 +00002734 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2735 return 0;
2736 }
2737
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002738 // Compute the default target features, we need the target to handle this
2739 // because features may have dependencies on one another.
2740 llvm::StringMap<bool> Features;
2741 Target->getDefaultFeatures(Opts.CPU, Features);
2742
2743 // Apply the user specified deltas.
2744 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2745 ie = Opts.Features.end(); it != ie; ++it) {
2746 const char *Name = it->c_str();
2747
2748 // Apply the feature via the target.
2749 if ((Name[0] != '-' && Name[0] != '+') ||
2750 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2751 Diags.Report(diag::err_target_invalid_feature) << Name;
2752 return 0;
2753 }
2754 }
2755
2756 // Add the features to the compile options.
2757 //
2758 // FIXME: If we are completely confident that we have the right set, we only
2759 // need to pass the minuses.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002760 Opts.Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002761 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2762 ie = Features.end(); it != ie; ++it)
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002763 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2764 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002765
2766 return Target.take();
2767}