blob: a9667bb2dd356da5d4fe9f7cd023010665b397ab [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;
Daniel Dunbar13adc7f2011-02-21 23:12:51 +0000155 this->MCountName = "\01mcount";
Torok Edwinb2b37c62009-06-30 17:10:35 +0000156 }
157
Anders Carlsson0b0a1222010-01-30 18:33:31 +0000158 virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000159 // Let MCSectionMachO validate this.
160 llvm::StringRef Segment, Section;
161 unsigned TAA, StubSize;
162 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
163 TAA, StubSize);
164 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000165
Anders Carlsson851318a2010-06-08 22:47:50 +0000166 virtual const char *getStaticInitSectionSpecifier() const {
167 // FIXME: We should return 0 when building kexts.
168 return "__TEXT,__StaticInit,regular,pure_instructions";
169 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000170
Torok Edwinb2b37c62009-06-30 17:10:35 +0000171};
172
Chris Lattner30ba6742009-08-10 19:03:04 +0000173
Torok Edwinb2b37c62009-06-30 17:10:35 +0000174// DragonFlyBSD Target
175template<typename Target>
176class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
177protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000178 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000179 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000180 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000181 Builder.defineMacro("__DragonFly__");
182 Builder.defineMacro("__DragonFly_cc_version", "100001");
183 Builder.defineMacro("__ELF__");
184 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
185 Builder.defineMacro("__tune_i386__");
186 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000187 }
188public:
Mike Stump11289f42009-09-09 15:08:12 +0000189 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000190 : OSTargetInfo<Target>(triple) {}
191};
192
193// FreeBSD Target
194template<typename Target>
195class FreeBSDTargetInfo : public OSTargetInfo<Target> {
196protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000197 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000198 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000199 // FreeBSD defines; list based off of gcc output
200
Daniel Dunbar40165182009-08-24 09:10:05 +0000201 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000202 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000203
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000204 Builder.defineMacro("__FreeBSD__", Release);
205 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000206 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
207 DefineStd(Builder, "unix", Opts);
208 Builder.defineMacro("__ELF__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000209 }
210public:
Mike Stump11289f42009-09-09 15:08:12 +0000211 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands9cb27e92009-07-08 13:55:08 +0000212 : OSTargetInfo<Target>(triple) {
213 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000214
215 llvm::Triple Triple(triple);
216 switch (Triple.getArch()) {
217 default:
218 case llvm::Triple::x86:
219 case llvm::Triple::x86_64:
220 this->MCountName = ".mcount";
221 break;
222 case llvm::Triple::mips:
223 case llvm::Triple::mipsel:
224 case llvm::Triple::ppc:
225 case llvm::Triple::ppc64:
226 this->MCountName = "_mcount";
227 break;
228 case llvm::Triple::arm:
229 this->MCountName = "__mcount";
230 break;
231 }
232
Duncan Sands9cb27e92009-07-08 13:55:08 +0000233 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234};
235
Chris Lattner3e2ee142010-07-07 16:01:42 +0000236// Minix Target
237template<typename Target>
238class MinixTargetInfo : public OSTargetInfo<Target> {
239protected:
240 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
241 MacroBuilder &Builder) const {
242 // Minix defines
243
244 Builder.defineMacro("__minix", "3");
245 Builder.defineMacro("_EM_WSIZE", "4");
246 Builder.defineMacro("_EM_PSIZE", "4");
247 Builder.defineMacro("_EM_SSIZE", "2");
248 Builder.defineMacro("_EM_LSIZE", "4");
249 Builder.defineMacro("_EM_FSIZE", "4");
250 Builder.defineMacro("_EM_DSIZE", "8");
251 DefineStd(Builder, "unix", Opts);
252 }
253public:
254 MinixTargetInfo(const std::string &triple)
255 : OSTargetInfo<Target>(triple) {
256 this->UserLabelPrefix = "";
257 }
258};
259
Torok Edwinb2b37c62009-06-30 17:10:35 +0000260// Linux target
261template<typename Target>
262class LinuxTargetInfo : public OSTargetInfo<Target> {
263protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000264 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000265 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000267 DefineStd(Builder, "unix", Opts);
268 DefineStd(Builder, "linux", Opts);
269 Builder.defineMacro("__gnu_linux__");
270 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000271 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000272 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000273 if (Opts.CPlusPlus)
274 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000275 }
276public:
Mike Stump11289f42009-09-09 15:08:12 +0000277 LinuxTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000278 : OSTargetInfo<Target>(triple) {
279 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000280 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281 }
282};
283
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000284// NetBSD Target
285template<typename Target>
286class NetBSDTargetInfo : public OSTargetInfo<Target> {
287protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000288 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000289 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000290 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000291 Builder.defineMacro("__NetBSD__");
292 Builder.defineMacro("__unix__");
293 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000294 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000295 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000296 }
297public:
Mike Stump11289f42009-09-09 15:08:12 +0000298 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000299 : OSTargetInfo<Target>(triple) {
300 this->UserLabelPrefix = "";
301 }
302};
303
Torok Edwinb2b37c62009-06-30 17:10:35 +0000304// OpenBSD Target
305template<typename Target>
306class OpenBSDTargetInfo : public OSTargetInfo<Target> {
307protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000308 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000309 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 // OpenBSD defines; list based off of gcc output
311
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000312 Builder.defineMacro("__OpenBSD__");
313 DefineStd(Builder, "unix", Opts);
314 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000315 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000316 Builder.defineMacro("_POSIX_THREADS");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000317 }
318public:
Mike Stump11289f42009-09-09 15:08:12 +0000319 OpenBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000320 : OSTargetInfo<Target>(triple) {}
321};
322
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000323// PSP Target
324template<typename Target>
325class PSPTargetInfo : public OSTargetInfo<Target> {
326protected:
327 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000328 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000329 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000330 Builder.defineMacro("PSP");
331 Builder.defineMacro("_PSP");
332 Builder.defineMacro("__psp__");
333 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000334 }
335public:
336 PSPTargetInfo(const std::string& triple)
337 : OSTargetInfo<Target>(triple) {
338 this->UserLabelPrefix = "";
339 }
340};
341
John Thompsone467e192009-11-19 17:18:50 +0000342// PS3 PPU Target
343template<typename Target>
344class PS3PPUTargetInfo : public OSTargetInfo<Target> {
345protected:
346 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000347 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000348 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000349 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000350 Builder.defineMacro("__PPU__");
351 Builder.defineMacro("__CELLOS_LV2__");
352 Builder.defineMacro("__ELF__");
353 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000354 Builder.defineMacro("_ARCH_PPC64");
355 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000356 }
357public:
358 PS3PPUTargetInfo(const std::string& triple)
359 : OSTargetInfo<Target>(triple) {
360 this->UserLabelPrefix = "";
John Thompson6f8dba72009-12-18 14:21:08 +0000361 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000362 this->IntMaxType = TargetInfo::SignedLongLong;
363 this->UIntMaxType = TargetInfo::UnsignedLongLong;
364 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000365 this->SizeType = TargetInfo::UnsignedInt;
John Thompson07a61a42010-06-24 22:44:13 +0000366 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
367 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompsone467e192009-11-19 17:18:50 +0000368 }
369};
370
371// FIXME: Need a real SPU target.
372// PS3 SPU Target
373template<typename Target>
374class PS3SPUTargetInfo : public OSTargetInfo<Target> {
375protected:
376 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000377 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000378 // PS3 PPU defines.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000379 Builder.defineMacro("__SPU__");
380 Builder.defineMacro("__ELF__");
John Thompsone467e192009-11-19 17:18:50 +0000381 }
382public:
383 PS3SPUTargetInfo(const std::string& triple)
384 : OSTargetInfo<Target>(triple) {
385 this->UserLabelPrefix = "";
386 }
387};
388
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000389// AuroraUX target
390template<typename Target>
391class AuroraUXTargetInfo : public OSTargetInfo<Target> {
392protected:
393 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000394 MacroBuilder &Builder) const {
395 DefineStd(Builder, "sun", Opts);
396 DefineStd(Builder, "unix", Opts);
397 Builder.defineMacro("__ELF__");
398 Builder.defineMacro("__svr4__");
399 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000400 }
401public:
402 AuroraUXTargetInfo(const std::string& triple)
403 : OSTargetInfo<Target>(triple) {
404 this->UserLabelPrefix = "";
405 this->WCharType = this->SignedLong;
406 // FIXME: WIntType should be SignedLong
407 }
408};
409
Torok Edwinb2b37c62009-06-30 17:10:35 +0000410// Solaris target
411template<typename Target>
412class SolarisTargetInfo : public OSTargetInfo<Target> {
413protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000414 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000415 MacroBuilder &Builder) const {
416 DefineStd(Builder, "sun", Opts);
417 DefineStd(Builder, "unix", Opts);
418 Builder.defineMacro("__ELF__");
419 Builder.defineMacro("__svr4__");
420 Builder.defineMacro("__SVR4");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000421 }
422public:
Mike Stump11289f42009-09-09 15:08:12 +0000423 SolarisTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000424 : OSTargetInfo<Target>(triple) {
425 this->UserLabelPrefix = "";
426 this->WCharType = this->SignedLong;
427 // FIXME: WIntType should be SignedLong
428 }
429};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000430
431// Windows target
432template<typename Target>
433class WindowsTargetInfo : public OSTargetInfo<Target> {
434protected:
435 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
436 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000437 Builder.defineMacro("_WIN32");
438 }
439 void getVisualStudioDefines(const LangOptions &Opts,
440 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000441 if (Opts.CPlusPlus) {
442 if (Opts.RTTI)
443 Builder.defineMacro("_CPPRTTI");
444
445 if (Opts.Exceptions)
446 Builder.defineMacro("_CPPUNWIND");
447 }
448
449 if (!Opts.CharIsSigned)
450 Builder.defineMacro("_CHAR_UNSIGNED");
451
452 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
453 // but it works for now.
454 if (Opts.POSIXThreads)
455 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000456
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000457 if (Opts.MSCVersion != 0)
458 Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
459
460 if (Opts.Microsoft) {
461 Builder.defineMacro("_MSC_EXTENSIONS");
462
463 if (Opts.CPlusPlus0x) {
464 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
465 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
466 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
467 }
468 }
469
470 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000471 }
472
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000473public:
474 WindowsTargetInfo(const std::string &triple)
475 : OSTargetInfo<Target>(triple) {}
476};
477
Mike Stump11289f42009-09-09 15:08:12 +0000478} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000479
Chris Lattner09d98f52008-10-05 21:50:58 +0000480//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000481// Specific target implementations.
482//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000483
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000484namespace {
485// PPC abstract base class
486class PPCTargetInfo : public TargetInfo {
487 static const Builtin::Info BuiltinInfo[];
488 static const char * const GCCRegNames[];
489 static const TargetInfo::GCCRegAlias GCCRegAliases[];
490
491public:
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000492 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
493
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000494 virtual void getTargetBuiltins(const Builtin::Info *&Records,
495 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000496 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000497 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000498 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000499
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000500 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000501 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000502
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000503 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000504 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000505 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000506 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000507 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000508 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000509 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000510 default: return false;
511 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000512 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000513 case 'b': // Base register
514 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000515 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000516 break;
517 // FIXME: The following are added to allow parsing.
518 // I just took a guess at what the actions should be.
519 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000520 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000521 case 'v': // Altivec vector register
522 Info.setAllowsRegister();
523 break;
524 case 'w':
525 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000526 case 'd':// VSX vector register to hold vector double data
527 case 'f':// VSX vector register to hold vector float data
528 case 's':// VSX vector register to hold scalar float data
529 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000530 break;
531 default:
532 return false;
533 }
534 Info.setAllowsRegister();
535 Name++; // Skip over 'w'.
536 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000537 case 'h': // `MQ', `CTR', or `LINK' register
538 case 'q': // `MQ' register
539 case 'c': // `CTR' register
540 case 'l': // `LINK' register
541 case 'x': // `CR' register (condition register) number 0
542 case 'y': // `CR' register (condition register)
543 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000544 Info.setAllowsRegister();
545 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000546 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000547 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000548 // (use `L' instead for SImode constants)
549 case 'K': // Unsigned 16-bit constant
550 case 'L': // Signed 16-bit constant shifted left 16 bits
551 case 'M': // Constant larger than 31
552 case 'N': // Exact power of 2
553 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000554 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000555 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000556 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000557 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000558 break;
559 case 'm': // Memory operand. Note that on PowerPC targets, m can
560 // include addresses that update the base register. It
561 // is therefore only safe to use `m' in an asm statement
562 // if that asm statement accesses the operand exactly once.
563 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000564 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000565 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000566 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000567 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000568 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
569 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000570 // register to be updated.
571 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000572 if (Name[1] != 's')
573 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000574 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000575 // include any automodification of the base register. Unlike
576 // `m', this constraint can be used in asm statements that
577 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000578 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000579 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000580 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000581 break;
582 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000583 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000584 case 'Z': // Memory operand that is an indexed or indirect from a
585 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000586 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000587 Info.setAllowsMemory();
588 Info.setAllowsRegister();
589 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000590 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000591 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000592 // register (`p' is preferable for asm statements)
593 case 'S': // Constant suitable as a 64-bit mask operand
594 case 'T': // Constant suitable as a 32-bit mask operand
595 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000596 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000597 // instructions
598 case 'W': // Vector constant that does not require memory
599 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000600 break;
601 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000602 }
John Thompson07a61a42010-06-24 22:44:13 +0000603 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000604 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000605 virtual const char *getClobbers() const {
606 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000607 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000608};
Anders Carlssonf511f642007-11-27 04:11:28 +0000609
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000610const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000611#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
612#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
613 ALL_LANGUAGES, false },
Chris Lattner5abdec72009-06-14 01:05:48 +0000614#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000615};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000616
617
Chris Lattnerecd49032009-03-02 22:27:17 +0000618/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
619/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000620void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000621 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000622 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000623 Builder.defineMacro("__ppc__");
624 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000625 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000626 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000627 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000628 Builder.defineMacro("_ARCH_PPC64");
629 Builder.defineMacro("_LP64");
630 Builder.defineMacro("__LP64__");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000631 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000632 Builder.defineMacro("__ppc64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000633 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000634 Builder.defineMacro("__ppc__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000635 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000636
Chris Lattnerecd49032009-03-02 22:27:17 +0000637 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000638 Builder.defineMacro("_BIG_ENDIAN");
639 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000640
Chris Lattnerecd49032009-03-02 22:27:17 +0000641 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000642 Builder.defineMacro("__NATURAL_ALIGNMENT__");
643 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000644
Chris Lattnerecd49032009-03-02 22:27:17 +0000645 // FIXME: Should be controlled by command line option.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000646 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000647
John Thompsone467e192009-11-19 17:18:50 +0000648 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000649 Builder.defineMacro("__VEC__", "10206");
650 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000651 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000652}
653
Chris Lattner17df24e2008-04-21 18:56:49 +0000654
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000655const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000656 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
657 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
658 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
659 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
660 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
661 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
662 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
663 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000664 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000665 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000666 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000667 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
668 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
669 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
670 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000671 "vrsave", "vscr",
672 "spe_acc", "spefscr",
673 "sfp"
674};
Chris Lattner10a5b382007-01-29 05:24:35 +0000675
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000676void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000677 unsigned &NumNames) const {
678 Names = GCCRegNames;
679 NumNames = llvm::array_lengthof(GCCRegNames);
680}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000681
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000682const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
683 // While some of these aliases do map to different registers
684 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000685 { { "0" }, "r0" },
686 { { "1"}, "r1" },
687 { { "2" }, "r2" },
688 { { "3" }, "r3" },
689 { { "4" }, "r4" },
690 { { "5" }, "r5" },
691 { { "6" }, "r6" },
692 { { "7" }, "r7" },
693 { { "8" }, "r8" },
694 { { "9" }, "r9" },
695 { { "10" }, "r10" },
696 { { "11" }, "r11" },
697 { { "12" }, "r12" },
698 { { "13" }, "r13" },
699 { { "14" }, "r14" },
700 { { "15" }, "r15" },
701 { { "16" }, "r16" },
702 { { "17" }, "r17" },
703 { { "18" }, "r18" },
704 { { "19" }, "r19" },
705 { { "20" }, "r20" },
706 { { "21" }, "r21" },
707 { { "22" }, "r22" },
708 { { "23" }, "r23" },
709 { { "24" }, "r24" },
710 { { "25" }, "r25" },
711 { { "26" }, "r26" },
712 { { "27" }, "r27" },
713 { { "28" }, "r28" },
714 { { "29" }, "r29" },
715 { { "30" }, "r30" },
716 { { "31" }, "r31" },
717 { { "fr0" }, "f0" },
718 { { "fr1" }, "f1" },
719 { { "fr2" }, "f2" },
720 { { "fr3" }, "f3" },
721 { { "fr4" }, "f4" },
722 { { "fr5" }, "f5" },
723 { { "fr6" }, "f6" },
724 { { "fr7" }, "f7" },
725 { { "fr8" }, "f8" },
726 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +0000727 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000728 { { "fr11" }, "f11" },
729 { { "fr12" }, "f12" },
730 { { "fr13" }, "f13" },
731 { { "fr14" }, "f14" },
732 { { "fr15" }, "f15" },
733 { { "fr16" }, "f16" },
734 { { "fr17" }, "f17" },
735 { { "fr18" }, "f18" },
736 { { "fr19" }, "f19" },
737 { { "fr20" }, "f20" },
738 { { "fr21" }, "f21" },
739 { { "fr22" }, "f22" },
740 { { "fr23" }, "f23" },
741 { { "fr24" }, "f24" },
742 { { "fr25" }, "f25" },
743 { { "fr26" }, "f26" },
744 { { "fr27" }, "f27" },
745 { { "fr28" }, "f28" },
746 { { "fr29" }, "f29" },
747 { { "fr30" }, "f30" },
748 { { "fr31" }, "f31" },
749 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000750};
751
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000752void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000753 unsigned &NumAliases) const {
754 Aliases = GCCRegAliases;
755 NumAliases = llvm::array_lengthof(GCCRegAliases);
756}
757} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000758
Chris Lattner5ba61f02006-10-14 07:39:34 +0000759namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000760class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000761public:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000762 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000763 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 +0000764 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000765
766 if (getTriple().getOS() == llvm::Triple::FreeBSD)
Roman Divacky965b0b72011-01-06 08:27:10 +0000767 SizeType = UnsignedInt;
768 }
769
770 virtual const char *getVAListDeclaration() const {
771 // This is the ELF definition, and is overridden by the Darwin sub-target
772 return "typedef struct __va_list_tag {"
773 " unsigned char gpr;"
774 " unsigned char fpr;"
775 " unsigned short reserved;"
776 " void* overflow_arg_area;"
777 " void* reg_save_area;"
778 "} __builtin_va_list[1];";
Eli Friedman873f65a2008-08-21 00:13:15 +0000779 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000780};
781} // end anonymous namespace.
782
783namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000784class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000785public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000786 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000787 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +0000788 IntMaxType = SignedLong;
789 UIntMaxType = UnsignedLong;
790 Int64Type = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +0000791 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 +0000792 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000793 }
Roman Divacky965b0b72011-01-06 08:27:10 +0000794 virtual const char *getVAListDeclaration() const {
795 return "typedef char* __builtin_va_list;";
796 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000797};
798} // end anonymous namespace.
799
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000800
801namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +0000802class DarwinPPC32TargetInfo :
803 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000804public:
Roman Divacky965b0b72011-01-06 08:27:10 +0000805 DarwinPPC32TargetInfo(const std::string& triple)
806 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000807 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +0000808 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
809 }
810 virtual const char *getVAListDeclaration() const {
811 return "typedef char* __builtin_va_list;";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000812 }
813};
814
815class DarwinPPC64TargetInfo :
816 public DarwinTargetInfo<PPC64TargetInfo> {
817public:
818 DarwinPPC64TargetInfo(const std::string& triple)
819 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
820 HasAlignMac68kSupport = true;
821 }
822};
823} // end anonymous namespace.
824
Chris Lattner5ba61f02006-10-14 07:39:34 +0000825namespace {
Chris Lattner5178f562010-03-06 21:21:27 +0000826// MBlaze abstract base class
827class MBlazeTargetInfo : public TargetInfo {
828 static const char * const GCCRegNames[];
829 static const TargetInfo::GCCRegAlias GCCRegAliases[];
830
831public:
832 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Peck69bf1282010-12-12 20:56:47 +0000833 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner5178f562010-03-06 21:21:27 +0000834 }
835
836 virtual void getTargetBuiltins(const Builtin::Info *&Records,
837 unsigned &NumRecords) const {
838 // FIXME: Implement.
839 Records = 0;
840 NumRecords = 0;
841 }
842
843 virtual void getTargetDefines(const LangOptions &Opts,
844 MacroBuilder &Builder) const;
845
846 virtual const char *getVAListDeclaration() const {
847 return "typedef char* __builtin_va_list;";
848 }
849 virtual const char *getTargetPrefix() const {
850 return "mblaze";
851 }
852 virtual void getGCCRegNames(const char * const *&Names,
853 unsigned &NumNames) const;
854 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
855 unsigned &NumAliases) const;
856 virtual bool validateAsmConstraint(const char *&Name,
857 TargetInfo::ConstraintInfo &Info) const {
858 switch (*Name) {
859 default: return false;
860 case 'O': // Zero
861 return true;
862 case 'b': // Base register
863 case 'f': // Floating point register
864 Info.setAllowsRegister();
865 return true;
866 }
867 }
868 virtual const char *getClobbers() const {
869 return "";
870 }
871};
872
873/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
874/// #defines that are not tied to a specific subtarget.
875void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
876 MacroBuilder &Builder) const {
877 // Target identification.
878 Builder.defineMacro("__microblaze__");
879 Builder.defineMacro("_ARCH_MICROBLAZE");
880 Builder.defineMacro("__MICROBLAZE__");
881
882 // Target properties.
883 Builder.defineMacro("_BIG_ENDIAN");
884 Builder.defineMacro("__BIG_ENDIAN__");
885
886 // Subtarget options.
887 Builder.defineMacro("__REGISTER_PREFIX__", "");
888}
889
890
891const char * const MBlazeTargetInfo::GCCRegNames[] = {
892 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
893 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
894 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
895 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
896 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
897 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
898 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
899 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
900 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
901 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
902};
903
904void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
905 unsigned &NumNames) const {
906 Names = GCCRegNames;
907 NumNames = llvm::array_lengthof(GCCRegNames);
908}
909
910const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
911 { {"f0"}, "r0" },
912 { {"f1"}, "r1" },
913 { {"f2"}, "r2" },
914 { {"f3"}, "r3" },
915 { {"f4"}, "r4" },
916 { {"f5"}, "r5" },
917 { {"f6"}, "r6" },
918 { {"f7"}, "r7" },
919 { {"f8"}, "r8" },
920 { {"f9"}, "r9" },
921 { {"f10"}, "r10" },
922 { {"f11"}, "r11" },
923 { {"f12"}, "r12" },
924 { {"f13"}, "r13" },
925 { {"f14"}, "r14" },
926 { {"f15"}, "r15" },
927 { {"f16"}, "r16" },
928 { {"f17"}, "r17" },
929 { {"f18"}, "r18" },
930 { {"f19"}, "r19" },
931 { {"f20"}, "r20" },
932 { {"f21"}, "r21" },
933 { {"f22"}, "r22" },
934 { {"f23"}, "r23" },
935 { {"f24"}, "r24" },
936 { {"f25"}, "r25" },
937 { {"f26"}, "r26" },
938 { {"f27"}, "r27" },
939 { {"f28"}, "r28" },
940 { {"f29"}, "r29" },
941 { {"f30"}, "r30" },
942 { {"f31"}, "r31" },
943};
944
945void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
946 unsigned &NumAliases) const {
947 Aliases = GCCRegAliases;
948 NumAliases = llvm::array_lengthof(GCCRegAliases);
949}
950} // end anonymous namespace.
951
952namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000953// Namespace for x86 abstract base class
954const Builtin::Info BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000955#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
956#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
957 ALL_LANGUAGES, false },
Chris Lattner5abdec72009-06-14 01:05:48 +0000958#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +0000959};
Eli Friedmanb5366062008-05-20 14:21:01 +0000960
Nuno Lopescfca1f02009-12-23 17:49:57 +0000961static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000962 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
963 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
964 "argp", "flags", "fspr", "dirflag", "frame",
965 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
966 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
967 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
968 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
969};
970
971const TargetInfo::GCCRegAlias GCCRegAliases[] = {
972 { { "al", "ah", "eax", "rax" }, "ax" },
973 { { "bl", "bh", "ebx", "rbx" }, "bx" },
974 { { "cl", "ch", "ecx", "rcx" }, "cx" },
975 { { "dl", "dh", "edx", "rdx" }, "dx" },
976 { { "esi", "rsi" }, "si" },
977 { { "edi", "rdi" }, "di" },
978 { { "esp", "rsp" }, "sp" },
979 { { "ebp", "rbp" }, "bp" },
980};
981
982// X86 target abstract base class; x86-32 and x86-64 are very close, so
983// most of the implementation can be shared.
984class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +0000985 enum X86SSEEnum {
986 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
987 } SSELevel;
Anders Carlssone437c682010-01-27 03:47:49 +0000988 enum AMD3DNowEnum {
989 NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
990 } AMD3DNowLevel;
991
Eric Christophere1ddaf92010-04-02 23:50:19 +0000992 bool HasAES;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +0000993 bool HasAVX;
994
Eli Friedman3fd920a2008-08-20 02:34:37 +0000995public:
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000996 X86TargetInfo(const std::string& triple)
Eric Christophere1ddaf92010-04-02 23:50:19 +0000997 : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +0000998 HasAES(false), HasAVX(false) {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000999 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001000 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001001 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1002 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001003 Records = BuiltinInfo;
1004 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001005 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001006 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001007 unsigned &NumNames) const {
1008 Names = GCCRegNames;
1009 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001010 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001011 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001012 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001013 Aliases = GCCRegAliases;
1014 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +00001015 }
Anders Carlsson58436352009-02-28 17:11:49 +00001016 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001017 TargetInfo::ConstraintInfo &info) const;
1018 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001019 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001020 return "~{dirflag},~{fpsr},~{flags}";
1021 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001022 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001023 MacroBuilder &Builder) const;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001024 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1025 const std::string &Name,
1026 bool Enabled) const;
Mike Stump11289f42009-09-09 15:08:12 +00001027 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001028 llvm::StringMap<bool> &Features) const;
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001029 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Chris Lattner5ba61f02006-10-14 07:39:34 +00001030};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001031
Mike Stump11289f42009-09-09 15:08:12 +00001032void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001033 llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001034 // FIXME: This should not be here.
1035 Features["3dnow"] = false;
1036 Features["3dnowa"] = false;
1037 Features["mmx"] = false;
1038 Features["sse"] = false;
1039 Features["sse2"] = false;
1040 Features["sse3"] = false;
1041 Features["ssse3"] = false;
1042 Features["sse41"] = false;
1043 Features["sse42"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001044 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001045 Features["avx"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001046
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001047 // LLVM does not currently recognize this.
1048 // Features["sse4a"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001049
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001050 // FIXME: This *really* should not be here.
1051
1052 // X86_64 always has SSE2.
1053 if (PointerWidth == 64)
1054 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1055
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001056 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1057 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1058 ;
1059 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1060 setFeatureEnabled(Features, "mmx", true);
1061 else if (CPU == "pentium3")
1062 setFeatureEnabled(Features, "sse", true);
1063 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
1064 setFeatureEnabled(Features, "sse2", true);
1065 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
1066 setFeatureEnabled(Features, "sse3", true);
1067 else if (CPU == "core2")
1068 setFeatureEnabled(Features, "ssse3", true);
1069 else if (CPU == "penryn") {
1070 setFeatureEnabled(Features, "sse4", true);
1071 Features["sse42"] = false;
1072 } else if (CPU == "atom")
1073 setFeatureEnabled(Features, "sse3", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001074 else if (CPU == "corei7") {
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001075 setFeatureEnabled(Features, "sse4", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001076 setFeatureEnabled(Features, "aes", true);
1077 }
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001078 else if (CPU == "k6" || CPU == "winchip-c6")
1079 setFeatureEnabled(Features, "mmx", true);
Mike Stump11289f42009-09-09 15:08:12 +00001080 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001081 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
1082 setFeatureEnabled(Features, "mmx", true);
1083 setFeatureEnabled(Features, "3dnow", true);
1084 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1085 setFeatureEnabled(Features, "sse", true);
1086 setFeatureEnabled(Features, "3dnowa", true);
1087 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1088 CPU == "athlon-fx") {
Mike Stump11289f42009-09-09 15:08:12 +00001089 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001090 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackydacbfe42010-12-29 13:28:29 +00001091 } else if (CPU == "k8-sse3") {
1092 setFeatureEnabled(Features, "sse3", true);
1093 setFeatureEnabled(Features, "3dnowa", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001094 } else if (CPU == "c3-2")
1095 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001096}
1097
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001098bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump11289f42009-09-09 15:08:12 +00001099 const std::string &Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001100 bool Enabled) const {
Eric Christopher399ffa52010-03-04 02:26:37 +00001101 // FIXME: This *really* should not be here. We need some way of translating
1102 // options into llvm subtarget features.
1103 if (!Features.count(Name) &&
1104 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001105 return false;
1106
1107 if (Enabled) {
1108 if (Name == "mmx")
1109 Features["mmx"] = true;
1110 else if (Name == "sse")
1111 Features["mmx"] = Features["sse"] = true;
1112 else if (Name == "sse2")
1113 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1114 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001115 Features["mmx"] = Features["sse"] = Features["sse2"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001116 Features["sse3"] = true;
1117 else if (Name == "ssse3")
Mike Stump11289f42009-09-09 15:08:12 +00001118 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001119 Features["ssse3"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001120 else if (Name == "sse4" || Name == "sse4.2")
Mike Stump11289f42009-09-09 15:08:12 +00001121 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001122 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001123 else if (Name == "sse4.1")
1124 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1125 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001126 else if (Name == "3dnow")
1127 Features["3dnowa"] = true;
1128 else if (Name == "3dnowa")
1129 Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001130 else if (Name == "aes")
1131 Features["aes"] = true;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001132 else if (Name == "avx")
1133 Features["avx"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001134 } else {
1135 if (Name == "mmx")
Mike Stump11289f42009-09-09 15:08:12 +00001136 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001137 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1138 else if (Name == "sse")
Mike Stump11289f42009-09-09 15:08:12 +00001139 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001140 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1141 else if (Name == "sse2")
Mike Stump11289f42009-09-09 15:08:12 +00001142 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001143 Features["sse41"] = Features["sse42"] = false;
1144 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001145 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001146 Features["sse42"] = false;
1147 else if (Name == "ssse3")
1148 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1149 else if (Name == "sse4")
1150 Features["sse41"] = Features["sse42"] = false;
Eric Christophercfeceff2010-03-04 02:31:44 +00001151 else if (Name == "sse4.2")
1152 Features["sse42"] = false;
1153 else if (Name == "sse4.1")
1154 Features["sse41"] = Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001155 else if (Name == "3dnow")
1156 Features["3dnow"] = Features["3dnowa"] = false;
1157 else if (Name == "3dnowa")
1158 Features["3dnowa"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001159 else if (Name == "aes")
1160 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001161 else if (Name == "avx")
1162 Features["avx"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001163 }
1164
1165 return true;
1166}
1167
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001168/// HandleTargetOptions - Perform initialization based on the user
1169/// configured set of features.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001170void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00001171 // Remember the maximum enabled sselevel.
1172 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1173 // Ignore disabled features.
1174 if (Features[i][0] == '-')
1175 continue;
1176
Eric Christophere1ddaf92010-04-02 23:50:19 +00001177 if (Features[i].substr(1) == "aes") {
1178 HasAES = true;
1179 continue;
1180 }
1181
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001182 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1183 // For now let it be enabled together with other SSE levels.
1184 if (Features[i].substr(1) == "avx") {
1185 HasAVX = true;
1186 continue;
1187 }
1188
Daniel Dunbar979586e2009-11-11 09:38:56 +00001189 assert(Features[i][0] == '+' && "Invalid target feature!");
1190 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1191 .Case("sse42", SSE42)
1192 .Case("sse41", SSE41)
1193 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00001194 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00001195 .Case("sse2", SSE2)
1196 .Case("sse", SSE1)
1197 .Case("mmx", MMX)
1198 .Default(NoMMXSSE);
1199 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001200
1201 AMD3DNowEnum ThreeDNowLevel =
Anders Carlssone437c682010-01-27 03:47:49 +00001202 llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1203 .Case("3dnowa", AMD3DNowAthlon)
1204 .Case("3dnow", AMD3DNow)
1205 .Default(NoAMD3DNow);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001206
Anders Carlssone437c682010-01-27 03:47:49 +00001207 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001208 }
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001209}
Chris Lattnerecd49032009-03-02 22:27:17 +00001210
1211/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1212/// that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001213void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001214 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001215 // Target identification.
1216 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001217 Builder.defineMacro("_LP64");
1218 Builder.defineMacro("__LP64__");
1219 Builder.defineMacro("__amd64__");
1220 Builder.defineMacro("__amd64");
1221 Builder.defineMacro("__x86_64");
1222 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001223 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001224 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00001225 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001226
Eric Christophere1ddaf92010-04-02 23:50:19 +00001227 if (HasAES)
1228 Builder.defineMacro("__AES__");
1229
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001230 if (HasAVX)
1231 Builder.defineMacro("__AVX__");
1232
Chris Lattnerecd49032009-03-02 22:27:17 +00001233 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001234 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001235
Chris Lattnerecd49032009-03-02 22:27:17 +00001236 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001237 Builder.defineMacro("__nocona");
1238 Builder.defineMacro("__nocona__");
1239 Builder.defineMacro("__tune_nocona__");
1240 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner96e43572009-03-02 22:40:39 +00001241
Chris Lattner6df41af2009-04-19 17:32:33 +00001242 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1243 // functions in glibc header files that use FP Stack inline asm which the
1244 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001245 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001246
Chris Lattner96e43572009-03-02 22:40:39 +00001247 // Each case falls through to the previous one here.
1248 switch (SSELevel) {
1249 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001250 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00001251 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001252 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00001253 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001254 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001255 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001256 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001257 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001258 Builder.defineMacro("__SSE2__");
1259 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001260 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001261 Builder.defineMacro("__SSE__");
1262 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001263 case MMX:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001264 Builder.defineMacro("__MMX__");
Chris Lattner96e43572009-03-02 22:40:39 +00001265 case NoMMXSSE:
1266 break;
1267 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001268
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001269 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001270 switch (SSELevel) {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001271 case SSE42:
1272 case SSE41:
1273 case SSSE3:
1274 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001275 case SSE2:
1276 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1277 break;
1278 case SSE1:
1279 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1280 break;
1281 default:
1282 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1283 }
1284 }
1285
Anders Carlssone437c682010-01-27 03:47:49 +00001286 // Each case falls through to the previous one here.
1287 switch (AMD3DNowLevel) {
1288 case AMD3DNowAthlon:
1289 Builder.defineMacro("__3dNOW_A__");
1290 case AMD3DNow:
1291 Builder.defineMacro("__3dNOW__");
1292 case NoAMD3DNow:
1293 break;
1294 }
Chris Lattnerecd49032009-03-02 22:27:17 +00001295}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001296
1297
Eli Friedman3fd920a2008-08-20 02:34:37 +00001298bool
Anders Carlsson58436352009-02-28 17:11:49 +00001299X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001300 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00001301 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001302 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00001303 case 'Y': // first letter of a pair:
1304 switch (*(Name+1)) {
1305 default: return false;
1306 case '0': // First SSE register.
1307 case 't': // Any SSE register, when SSE2 is enabled.
1308 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1309 case 'm': // any MMX register, when inter-unit moves enabled.
1310 break; // falls through to setAllowsRegister.
1311 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001312 case 'a': // eax.
1313 case 'b': // ebx.
1314 case 'c': // ecx.
1315 case 'd': // edx.
1316 case 'S': // esi.
1317 case 'D': // edi.
1318 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00001319 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001320 case 't': // top of floating point stack.
1321 case 'u': // second from top of floating point stack.
1322 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00001323 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00001324 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001325 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00001326 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1327 case 'l': // "Index" registers: any general register that can be used as an
1328 // index in a base+index memory access.
1329 Info.setAllowsRegister();
1330 return true;
1331 case 'C': // SSE floating point constant.
1332 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001333 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001334 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001335 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001336 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001337 return true;
1338 }
Dale Johannesen46742a42010-08-24 22:33:12 +00001339 return false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001340}
1341
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00001342
Eli Friedman3fd920a2008-08-20 02:34:37 +00001343std::string
1344X86TargetInfo::convertConstraint(const char Constraint) const {
1345 switch (Constraint) {
1346 case 'a': return std::string("{ax}");
1347 case 'b': return std::string("{bx}");
1348 case 'c': return std::string("{cx}");
1349 case 'd': return std::string("{dx}");
1350 case 'S': return std::string("{si}");
1351 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00001352 case 'p': // address
1353 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00001354 case 't': // top of floating point stack.
1355 return std::string("{st}");
1356 case 'u': // second from top of floating point stack.
1357 return std::string("{st(1)}"); // second from top of floating point stack.
1358 default:
1359 return std::string(1, Constraint);
1360 }
1361}
Eli Friedman3fd920a2008-08-20 02:34:37 +00001362} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00001363
1364namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001365// X86-32 generic target
1366class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001367public:
Eli Friedman3fd920a2008-08-20 02:34:37 +00001368 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1369 DoubleAlign = LongLongAlign = 32;
1370 LongDoubleWidth = 96;
1371 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +00001372 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1373 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001374 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman32ca82a2009-03-29 20:31:09 +00001375 SizeType = UnsignedInt;
1376 PtrDiffType = SignedInt;
1377 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001378 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001379
1380 // Use fpret for all types.
1381 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1382 (1 << TargetInfo::Double) |
1383 (1 << TargetInfo::LongDouble));
Eli Friedman3fd920a2008-08-20 02:34:37 +00001384 }
1385 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001386 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +00001387 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001388
Chris Lattnerd545ad12009-09-23 06:06:36 +00001389 int getEHDataRegisterNumber(unsigned RegNo) const {
1390 if (RegNo == 0) return 0;
1391 if (RegNo == 1) return 2;
1392 return -1;
1393 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001394};
1395} // end anonymous namespace
1396
1397namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00001398class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1399public:
1400 OpenBSDI386TargetInfo(const std::string& triple) :
1401 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1402 SizeType = UnsignedLong;
1403 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00001404 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00001405 }
1406};
1407} // end anonymous namespace
1408
1409namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00001410class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001411public:
Torok Edwinb2b37c62009-06-30 17:10:35 +00001412 DarwinI386TargetInfo(const std::string& triple) :
1413 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001414 LongDoubleWidth = 128;
1415 LongDoubleAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00001416 SizeType = UnsignedLong;
1417 IntPtrType = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +00001418 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1419 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001420 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbarbd606522010-05-27 00:35:16 +00001421 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00001422 }
1423
Eli Friedman3fd920a2008-08-20 02:34:37 +00001424};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00001425} // end anonymous namespace
1426
1427namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001428// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001429class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001430public:
1431 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001432 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00001433 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00001434 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00001435 DoubleAlign = LongLongAlign = 64;
1436 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 +00001437 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1438 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001439 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001440 virtual void getTargetDefines(const LangOptions &Opts,
1441 MacroBuilder &Builder) const {
1442 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1443 }
1444};
1445} // end anonymous namespace
1446
1447namespace {
1448
1449// x86-32 Windows Visual Studio target
1450class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1451public:
1452 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1453 : WindowsX86_32TargetInfo(triple) {
1454 LongDoubleWidth = 64;
1455 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1456 }
1457 virtual void getTargetDefines(const LangOptions &Opts,
1458 MacroBuilder &Builder) const {
1459 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1460 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1461 // The value of the following reflects processor type.
1462 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1463 // We lost the original triple, so we use the default.
1464 Builder.defineMacro("_M_IX86", "600");
1465 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001466};
1467} // end anonymous namespace
1468
1469namespace {
1470// x86-32 MinGW target
1471class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1472public:
1473 MinGWX86_32TargetInfo(const std::string& triple)
1474 : WindowsX86_32TargetInfo(triple) {
1475 }
1476 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001477 MacroBuilder &Builder) const {
1478 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001479 DefineStd(Builder, "WIN32", Opts);
1480 DefineStd(Builder, "WINNT", Opts);
1481 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001482 Builder.defineMacro("__MSVCRT__");
1483 Builder.defineMacro("__MINGW32__");
1484 Builder.defineMacro("__declspec", "__declspec");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001485 }
1486};
1487} // end anonymous namespace
1488
1489namespace {
1490// x86-32 Cygwin target
1491class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1492public:
1493 CygwinX86_32TargetInfo(const std::string& triple)
1494 : X86_32TargetInfo(triple) {
1495 TLSSupported = false;
1496 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001497 DoubleAlign = LongLongAlign = 64;
1498 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1499 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001500 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001501 }
1502 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001503 MacroBuilder &Builder) const {
1504 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1505 Builder.defineMacro("__CYGWIN__");
1506 Builder.defineMacro("__CYGWIN32__");
1507 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00001508 if (Opts.CPlusPlus)
1509 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00001510 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001511};
1512} // end anonymous namespace
1513
1514namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00001515// x86-32 Haiku target
1516class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1517public:
1518 HaikuX86_32TargetInfo(const std::string& triple)
1519 : X86_32TargetInfo(triple) {
1520 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00001521 IntPtrType = SignedLong;
1522 PtrDiffType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00001523 this->UserLabelPrefix = "";
Eli Friedman04831922010-08-22 01:00:03 +00001524 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00001525 virtual void getTargetDefines(const LangOptions &Opts,
1526 MacroBuilder &Builder) const {
1527 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1528 Builder.defineMacro("__INTEL__");
1529 Builder.defineMacro("__HAIKU__");
1530 }
1531};
1532} // end anonymous namespace
1533
1534namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001535// x86-64 generic target
1536class X86_64TargetInfo : public X86TargetInfo {
1537public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001538 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001539 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00001540 LongDoubleWidth = 128;
1541 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00001542 LargeArrayMinWidth = 128;
1543 LargeArrayAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001544 IntMaxType = SignedLong;
1545 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001546 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001547 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001548
Eli Friedman873f65a2008-08-21 00:13:15 +00001549 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1550 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001551 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001552
1553 // Use fpret only for long double.
1554 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Chris Lattner10a5b382007-01-29 05:24:35 +00001555 }
Anders Carlssona7408e72007-10-13 00:45:48 +00001556 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001557 return "typedef struct __va_list_tag {"
1558 " unsigned gp_offset;"
1559 " unsigned fp_offset;"
1560 " void* overflow_arg_area;"
1561 " void* reg_save_area;"
John McCall61d82582010-05-28 18:25:28 +00001562 "} __va_list_tag;"
Eli Friedmanfb36b022009-07-03 00:45:06 +00001563 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001564 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001565
Chris Lattnerd545ad12009-09-23 06:06:36 +00001566 int getEHDataRegisterNumber(unsigned RegNo) const {
1567 if (RegNo == 0) return 0;
1568 if (RegNo == 1) return 1;
1569 return -1;
1570 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001571};
1572} // end anonymous namespace
1573
1574namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001575// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001576class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001577public:
1578 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001579 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001580 TLSSupported = false;
1581 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00001582 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001583 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00001584 IntMaxType = SignedLongLong;
1585 UIntMaxType = UnsignedLongLong;
1586 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00001587 SizeType = UnsignedLongLong;
1588 PtrDiffType = SignedLongLong;
1589 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00001590 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001591 }
1592 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001593 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001594 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001595 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001596 }
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00001597 virtual const char *getVAListDeclaration() const {
1598 return "typedef char* __builtin_va_list;";
1599 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001600};
1601} // end anonymous namespace
1602
1603namespace {
1604// x86-64 Windows Visual Studio target
1605class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1606public:
1607 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1608 : WindowsX86_64TargetInfo(triple) {
1609 }
1610 virtual void getTargetDefines(const LangOptions &Opts,
1611 MacroBuilder &Builder) const {
1612 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1613 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001614 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001615 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001616 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001617};
1618} // end anonymous namespace
1619
1620namespace {
1621// x86-64 MinGW target
1622class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1623public:
1624 MinGWX86_64TargetInfo(const std::string& triple)
1625 : WindowsX86_64TargetInfo(triple) {
1626 }
1627 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001628 MacroBuilder &Builder) const {
1629 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001630 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001631 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00001632 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001633 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumice5519a2011-01-17 22:56:16 +00001634 Builder.defineMacro("__declspec", "__declspec");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001635 }
1636};
1637} // end anonymous namespace
1638
1639namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00001640class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1641public:
Mike Stump11289f42009-09-09 15:08:12 +00001642 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman2857ccb2009-07-01 03:36:11 +00001643 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1644 Int64Type = SignedLongLong;
1645 }
1646};
1647} // end anonymous namespace
1648
1649namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00001650class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1651public:
Mike Stump11289f42009-09-09 15:08:12 +00001652 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman245f2292009-07-05 22:31:18 +00001653 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1654 IntMaxType = SignedLongLong;
1655 UIntMaxType = UnsignedLongLong;
1656 Int64Type = SignedLongLong;
1657 }
1658};
1659} // end anonymous namespace
1660
1661namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001662class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001663 // Possible FPU choices.
1664 enum FPUMode {
1665 NoFPU,
1666 VFP2FPU,
1667 VFP3FPU,
1668 NeonFPU
1669 };
1670
1671 static bool FPUModeIsVFP(FPUMode Mode) {
1672 return Mode >= VFP2FPU && Mode <= NeonFPU;
1673 }
1674
1675 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1676 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001677
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001678 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001679
1680 unsigned FPU : 3;
1681
Daniel Dunbar893d4752009-12-19 04:15:38 +00001682 unsigned IsThumb : 1;
1683
1684 // Initialized via features.
1685 unsigned SoftFloat : 1;
1686 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001687
Chris Lattner5cc15e02010-03-03 19:03:45 +00001688 static const Builtin::Info BuiltinInfo[];
1689
Chris Lattner17df24e2008-04-21 18:56:49 +00001690public:
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001691 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001692 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001693 {
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001694 SizeType = UnsignedInt;
1695 PtrDiffType = SignedInt;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001696
Chris Lattner1a8f3942010-04-23 16:29:58 +00001697 // {} in inline assembly are neon specifiers, not assembly variant
1698 // specifiers.
1699 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001700
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001701 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00001702 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00001703 if (IsThumb) {
1704 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1705 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001706 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001707 } else {
1708 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1709 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001710 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001711 }
John McCall86353412010-08-21 22:46:04 +00001712
1713 // ARM targets default to using the ARM C++ ABI.
1714 CXXABI = CXXABI_ARM;
Eli Friedmanb5366062008-05-20 14:21:01 +00001715 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001716 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001717 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001718 ABI = Name;
1719
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001720 // The defaults (above) are for AAPCS, check if we need to change them.
1721 //
1722 // FIXME: We need support for -meabi... we could just mangle it into the
1723 // name.
1724 if (Name == "apcs-gnu") {
Daniel Dunbar377dc2f2010-01-27 20:23:08 +00001725 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001726 SizeType = UnsignedLong;
1727
Daniel Dunbarf8125062010-04-22 16:14:54 +00001728 // Do not respect the alignment of bit-field types when laying out
1729 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1730 UseBitFieldTypeAlignment = false;
1731
Daniel Dunbar03184792009-09-22 21:44:58 +00001732 if (IsThumb) {
1733 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1734 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001735 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001736 } else {
1737 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1738 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001739 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001740 }
1741
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001742 // FIXME: Override "preferred align" for double and long long.
1743 } else if (Name == "aapcs") {
1744 // FIXME: Enumerated types are variable width in straight AAPCS.
1745 } else if (Name == "aapcs-linux") {
1746 ;
1747 } else
1748 return false;
1749
1750 return true;
1751 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001752
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001753 void getDefaultFeatures(const std::string &CPU,
1754 llvm::StringMap<bool> &Features) const {
1755 // FIXME: This should not be here.
1756 Features["vfp2"] = false;
1757 Features["vfp3"] = false;
1758 Features["neon"] = false;
1759
1760 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1761 Features["vfp2"] = true;
1762 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1763 Features["neon"] = true;
1764 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001765
Daniel Dunbar893d4752009-12-19 04:15:38 +00001766 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1767 const std::string &Name,
1768 bool Enabled) const {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001769 if (Name == "soft-float" || Name == "soft-float-abi") {
1770 Features[Name] = Enabled;
1771 } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1772 // These effectively are a single option, reset them when any is enabled.
1773 if (Enabled)
1774 Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1775 Features[Name] = Enabled;
1776 } else
Daniel Dunbar893d4752009-12-19 04:15:38 +00001777 return false;
1778
Daniel Dunbar893d4752009-12-19 04:15:38 +00001779 return true;
1780 }
1781
1782 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001783 FPU = NoFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00001784 SoftFloat = SoftFloatABI = false;
1785 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1786 if (Features[i] == "+soft-float")
1787 SoftFloat = true;
1788 else if (Features[i] == "+soft-float-abi")
1789 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001790 else if (Features[i] == "+vfp2")
1791 FPU = VFP2FPU;
1792 else if (Features[i] == "+vfp3")
1793 FPU = VFP3FPU;
1794 else if (Features[i] == "+neon")
1795 FPU = NeonFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00001796 }
1797
1798 // Remove front-end specific options which the backend handles differently.
1799 std::vector<std::string>::iterator it;
1800 it = std::find(Features.begin(), Features.end(), "+soft-float");
1801 if (it != Features.end())
1802 Features.erase(it);
1803 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
1804 if (it != Features.end())
1805 Features.erase(it);
1806 }
1807
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001808 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
1809 return llvm::StringSwitch<const char*>(Name)
1810 .Cases("arm8", "arm810", "4")
1811 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
1812 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
1813 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
1814 .Case("ep9312", "4T")
1815 .Cases("arm10tdmi", "arm1020t", "5T")
1816 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
1817 .Case("arm926ej-s", "5TEJ")
1818 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
1819 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001820 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001821 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001822 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001823 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1824 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson44acad82011-01-06 16:57:20 +00001825 .Case("cortex-m3", "7M")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001826 .Default(0);
1827 }
1828 virtual bool setCPU(const std::string &Name) {
1829 if (!getCPUDefineSuffix(Name))
1830 return false;
1831
1832 CPU = Name;
1833 return true;
1834 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001835 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001836 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001837 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001838 Builder.defineMacro("__arm");
1839 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001840
Chris Lattnerecd49032009-03-02 22:27:17 +00001841 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001842 Builder.defineMacro("__ARMEL__");
1843 Builder.defineMacro("__LITTLE_ENDIAN__");
1844 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001845
1846 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001847 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001848
Mike Stump9d54bd72009-04-08 02:07:04 +00001849 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001850
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001851 // FIXME: It's more complicated than this and we don't really support
1852 // interworking.
1853 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001854 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001855
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001856 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001857 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001858
Daniel Dunbar893d4752009-12-19 04:15:38 +00001859 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001860 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001861
1862 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001863 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001864
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001865 bool IsThumb2 = IsThumb && (CPUArch == "6T2" || CPUArch.startswith("7"));
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001866 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001867 Builder.defineMacro("__THUMBEL__");
1868 Builder.defineMacro("__thumb__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001869 if (IsThumb2)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001870 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001871 }
1872
1873 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001874 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001875
1876 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001877 Builder.defineMacro("__VFP_FP__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001878
1879 // This only gets set when Neon instructions are actually available, unlike
1880 // the VFP define, hence the soft float and arch check. This is subtly
1881 // different from gcc, we follow the intent which was that it should be set
1882 // when Neon instructions are actually available.
1883 if (FPU == NeonFPU && !SoftFloat && IsThumb2)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001884 Builder.defineMacro("__ARM_NEON__");
Chris Lattner17df24e2008-04-21 18:56:49 +00001885 }
1886 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1887 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00001888 Records = BuiltinInfo;
1889 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00001890 }
1891 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001892 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +00001893 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001894 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001895 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001896 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001897 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00001898 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001899 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001900 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +00001901 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001902 default:
Nate Begeman2908fa02008-04-22 05:03:19 +00001903 case 'l': // r0-r7
1904 case 'h': // r8-r15
1905 case 'w': // VFP Floating point register single precision
1906 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00001907 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00001908 return true;
1909 }
Chris Lattner17df24e2008-04-21 18:56:49 +00001910 return false;
1911 }
1912 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001913 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00001914 return "";
1915 }
1916};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001917
1918const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001919 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001920 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001921 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
1922
1923 // Float registers
1924 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1925 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1926 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001927 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001928
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001929 // Double registers
1930 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
1931 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00001932 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
1933 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001934
1935 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00001936 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1937 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001938};
1939
1940void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00001941 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001942 Names = GCCRegNames;
1943 NumNames = llvm::array_lengthof(GCCRegNames);
1944}
1945
1946const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001947 { { "a1" }, "r0" },
1948 { { "a2" }, "r1" },
1949 { { "a3" }, "r2" },
1950 { { "a4" }, "r3" },
1951 { { "v1" }, "r4" },
1952 { { "v2" }, "r5" },
1953 { { "v3" }, "r6" },
1954 { { "v4" }, "r7" },
1955 { { "v5" }, "r8" },
1956 { { "v6", "rfp" }, "r9" },
1957 { { "sl" }, "r10" },
1958 { { "fp" }, "r11" },
1959 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00001960 { { "r13" }, "sp" },
1961 { { "r14" }, "lr" },
1962 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001963 // The S, D and Q registers overlap, but aren't really aliases; we
1964 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001965};
1966
1967void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1968 unsigned &NumAliases) const {
1969 Aliases = GCCRegAliases;
1970 NumAliases = llvm::array_lengthof(GCCRegAliases);
1971}
Chris Lattner5cc15e02010-03-03 19:03:45 +00001972
1973const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001974#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
1975#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1976 ALL_LANGUAGES, false },
Chris Lattner5cc15e02010-03-03 19:03:45 +00001977#include "clang/Basic/BuiltinsARM.def"
1978};
Chris Lattner17df24e2008-04-21 18:56:49 +00001979} // end anonymous namespace.
1980
Eli Friedmanf05b7722008-08-20 07:44:10 +00001981
1982namespace {
Mike Stump11289f42009-09-09 15:08:12 +00001983class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00001984 public DarwinTargetInfo<ARMTargetInfo> {
1985protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00001986 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001987 MacroBuilder &Builder) const {
Daniel Dunbard86666f2010-01-26 01:44:04 +00001988 getDarwinDefines(Builder, Opts, Triple);
Eli Friedmand88c8a12009-04-19 21:38:35 +00001989 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00001990
Torok Edwinb2b37c62009-06-30 17:10:35 +00001991public:
Mike Stump11289f42009-09-09 15:08:12 +00001992 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00001993 : DarwinTargetInfo<ARMTargetInfo>(triple) {
1994 HasAlignMac68kSupport = true;
1995 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00001996};
1997} // end anonymous namespace.
1998
Chris Lattner5ba61f02006-10-14 07:39:34 +00001999namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002000class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00002001 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2002 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002003 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00002004public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002005 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2006 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +00002007 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 +00002008 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002009 }
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002010 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2011 const std::string &Name,
2012 bool Enabled) const {
2013 if (Name == "soft-float")
2014 Features[Name] = Enabled;
2015 else
2016 return false;
2017
2018 return true;
2019 }
2020 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2021 SoftFloat = false;
2022 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2023 if (Features[i] == "+soft-float")
2024 SoftFloat = true;
2025 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002026 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002027 MacroBuilder &Builder) const {
2028 DefineStd(Builder, "sparc", Opts);
2029 Builder.defineMacro("__sparcv8");
2030 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002031
2032 if (SoftFloat)
2033 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00002034 }
2035 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2036 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002037 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00002038 }
2039 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002040 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +00002041 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002042 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002043 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002044 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002045 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002046 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00002047 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002048 // FIXME: Implement!
2049 return false;
Gabor Greif49991682008-02-21 16:29:08 +00002050 }
2051 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002052 // FIXME: Implement!
2053 return "";
Gabor Greif49991682008-02-21 16:29:08 +00002054 }
2055};
2056
Chris Lattner9b415d62009-01-27 01:58:38 +00002057const char * const SparcV8TargetInfo::GCCRegNames[] = {
2058 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2059 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2060 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2061 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2062};
2063
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002064void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002065 unsigned &NumNames) const {
2066 Names = GCCRegNames;
2067 NumNames = llvm::array_lengthof(GCCRegNames);
2068}
2069
2070const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002071 { { "g0" }, "r0" },
2072 { { "g1" }, "r1" },
2073 { { "g2" }, "r2" },
2074 { { "g3" }, "r3" },
2075 { { "g4" }, "r4" },
2076 { { "g5" }, "r5" },
2077 { { "g6" }, "r6" },
2078 { { "g7" }, "r7" },
2079 { { "o0" }, "r8" },
2080 { { "o1" }, "r9" },
2081 { { "o2" }, "r10" },
2082 { { "o3" }, "r11" },
2083 { { "o4" }, "r12" },
2084 { { "o5" }, "r13" },
2085 { { "o6", "sp" }, "r14" },
2086 { { "o7" }, "r15" },
2087 { { "l0" }, "r16" },
2088 { { "l1" }, "r17" },
2089 { { "l2" }, "r18" },
2090 { { "l3" }, "r19" },
2091 { { "l4" }, "r20" },
2092 { { "l5" }, "r21" },
2093 { { "l6" }, "r22" },
2094 { { "l7" }, "r23" },
2095 { { "i0" }, "r24" },
2096 { { "i1" }, "r25" },
2097 { { "i2" }, "r26" },
2098 { { "i3" }, "r27" },
2099 { { "i4" }, "r28" },
2100 { { "i5" }, "r29" },
2101 { { "i6", "fp" }, "r30" },
2102 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00002103};
2104
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002105void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002106 unsigned &NumAliases) const {
2107 Aliases = GCCRegAliases;
2108 NumAliases = llvm::array_lengthof(GCCRegAliases);
2109}
Gabor Greif49991682008-02-21 16:29:08 +00002110} // end anonymous namespace.
2111
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002112namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002113class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2114public:
2115 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2116 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2117 SizeType = UnsignedInt;
2118 PtrDiffType = SignedInt;
2119 }
2120};
Torok Edwinb2b37c62009-06-30 17:10:35 +00002121class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002122public:
2123 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002124 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00002125 SizeType = UnsignedInt;
2126 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002127 }
2128};
2129} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00002130
Chris Lattnerb781dc792008-05-08 05:58:21 +00002131namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002132 class MSP430TargetInfo : public TargetInfo {
2133 static const char * const GCCRegNames[];
2134 public:
2135 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2136 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00002137 IntWidth = 16; IntAlign = 16;
2138 LongWidth = 32; LongLongWidth = 64;
2139 LongAlign = LongLongAlign = 16;
2140 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002141 SizeType = UnsignedInt;
2142 IntMaxType = SignedLong;
2143 UIntMaxType = UnsignedLong;
2144 IntPtrType = SignedShort;
2145 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00002146 SigAtomicType = SignedLong;
Anton Korobeynikovd94329a2009-12-19 01:32:37 +00002147 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002148 }
2149 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002150 MacroBuilder &Builder) const {
2151 Builder.defineMacro("MSP430");
2152 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002153 // FIXME: defines for different 'flavours' of MCU
2154 }
2155 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2156 unsigned &NumRecords) const {
2157 // FIXME: Implement.
2158 Records = 0;
2159 NumRecords = 0;
2160 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002161 virtual void getGCCRegNames(const char * const *&Names,
2162 unsigned &NumNames) const;
2163 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2164 unsigned &NumAliases) const {
2165 // No aliases.
2166 Aliases = 0;
2167 NumAliases = 0;
2168 }
2169 virtual bool validateAsmConstraint(const char *&Name,
2170 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00002171 // No target constraints for now.
2172 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002173 }
2174 virtual const char *getClobbers() const {
2175 // FIXME: Is this really right?
2176 return "";
2177 }
2178 virtual const char *getVAListDeclaration() const {
2179 // FIXME: implement
Anton Korobeynikov2f910822009-05-08 18:24:57 +00002180 return "typedef char* __builtin_va_list;";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002181 }
2182 };
2183
2184 const char * const MSP430TargetInfo::GCCRegNames[] = {
2185 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2186 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2187 };
2188
2189 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2190 unsigned &NumNames) const {
2191 Names = GCCRegNames;
2192 NumNames = llvm::array_lengthof(GCCRegNames);
2193 }
2194}
2195
2196
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002197namespace {
2198 class SystemZTargetInfo : public TargetInfo {
2199 static const char * const GCCRegNames[];
2200 public:
2201 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2202 TLSSupported = false;
2203 IntWidth = IntAlign = 32;
2204 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2205 PointerWidth = PointerAlign = 64;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002206 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2207 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002208 }
2209 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002210 MacroBuilder &Builder) const {
2211 Builder.defineMacro("__s390__");
2212 Builder.defineMacro("__s390x__");
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002213 }
2214 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2215 unsigned &NumRecords) const {
2216 // FIXME: Implement.
2217 Records = 0;
2218 NumRecords = 0;
2219 }
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002220
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002221 virtual void getGCCRegNames(const char * const *&Names,
2222 unsigned &NumNames) const;
2223 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2224 unsigned &NumAliases) const {
2225 // No aliases.
2226 Aliases = 0;
2227 NumAliases = 0;
2228 }
2229 virtual bool validateAsmConstraint(const char *&Name,
2230 TargetInfo::ConstraintInfo &info) const {
2231 // FIXME: implement
2232 return true;
2233 }
2234 virtual const char *getClobbers() const {
2235 // FIXME: Is this really right?
2236 return "";
2237 }
2238 virtual const char *getVAListDeclaration() const {
2239 // FIXME: implement
2240 return "typedef char* __builtin_va_list;";
2241 }
2242 };
2243
2244 const char * const SystemZTargetInfo::GCCRegNames[] = {
2245 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2246 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2247 };
2248
2249 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2250 unsigned &NumNames) const {
2251 Names = GCCRegNames;
2252 NumNames = llvm::array_lengthof(GCCRegNames);
2253 }
2254}
2255
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002256namespace {
2257 class BlackfinTargetInfo : public TargetInfo {
2258 static const char * const GCCRegNames[];
2259 public:
2260 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2261 TLSSupported = false;
2262 DoubleAlign = 32;
2263 LongLongAlign = 32;
2264 LongDoubleAlign = 32;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002265 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002266 }
2267
2268 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002269 MacroBuilder &Builder) const {
2270 DefineStd(Builder, "bfin", Opts);
2271 DefineStd(Builder, "BFIN", Opts);
2272 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002273 // FIXME: This one is really dependent on -mcpu
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002274 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002275 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2276 }
2277
2278 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2279 unsigned &NumRecords) const {
2280 // FIXME: Implement.
2281 Records = 0;
2282 NumRecords = 0;
2283 }
2284
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002285 virtual void getGCCRegNames(const char * const *&Names,
2286 unsigned &NumNames) const;
2287
2288 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2289 unsigned &NumAliases) const {
2290 // No aliases.
2291 Aliases = 0;
2292 NumAliases = 0;
2293 }
2294
2295 virtual bool validateAsmConstraint(const char *&Name,
2296 TargetInfo::ConstraintInfo &Info) const {
2297 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2298 Info.setAllowsRegister();
2299 return true;
2300 }
2301 return false;
2302 }
2303
2304 virtual const char *getClobbers() const {
2305 return "";
2306 }
2307
2308 virtual const char *getVAListDeclaration() const {
2309 return "typedef char* __builtin_va_list;";
2310 }
2311 };
2312
2313 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2314 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2315 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2316 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2317 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2318 "a0", "a1", "cc",
2319 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2320 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2321 };
2322
2323 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2324 unsigned &NumNames) const {
2325 Names = GCCRegNames;
2326 NumNames = llvm::array_lengthof(GCCRegNames);
2327 }
2328}
2329
Eli Friedmana9c3d712009-08-19 20:47:07 +00002330namespace {
2331
Mike Stump11289f42009-09-09 15:08:12 +00002332 // LLVM and Clang cannot be used directly to output native binaries for
2333 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00002334 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00002335 //
2336 // TCE uses the llvm bitcode as input and uses it for generating customized
2337 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00002338 // publicly available in http://tce.cs.tut.fi
2339
2340 class TCETargetInfo : public TargetInfo{
2341 public:
2342 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2343 TLSSupported = false;
2344 IntWidth = 32;
2345 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00002346 PointerWidth = 32;
2347 IntAlign = 32;
2348 LongAlign = LongLongAlign = 32;
2349 PointerAlign = 32;
2350 SizeType = UnsignedInt;
2351 IntMaxType = SignedLong;
2352 UIntMaxType = UnsignedLong;
2353 IntPtrType = SignedInt;
2354 PtrDiffType = SignedInt;
2355 FloatWidth = 32;
2356 FloatAlign = 32;
2357 DoubleWidth = 32;
2358 DoubleAlign = 32;
2359 LongDoubleWidth = 32;
2360 LongDoubleAlign = 32;
2361 FloatFormat = &llvm::APFloat::IEEEsingle;
2362 DoubleFormat = &llvm::APFloat::IEEEsingle;
2363 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner09797542010-03-04 21:07:38 +00002364 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2365 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumidba4ed32011-02-18 08:44:38 +00002366 "f32:32:32-f64:32:32-v64:32:32-"
2367 "v128:32:32-a0:0:32-n32";
Eli Friedmana9c3d712009-08-19 20:47:07 +00002368 }
2369
2370 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002371 MacroBuilder &Builder) const {
2372 DefineStd(Builder, "tce", Opts);
2373 Builder.defineMacro("__TCE__");
2374 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00002375 }
2376 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2377 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00002378 virtual const char *getClobbers() const {
2379 return "";
2380 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002381 virtual const char *getVAListDeclaration() const {
2382 return "typedef void* __builtin_va_list;";
2383 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002384 virtual void getGCCRegNames(const char * const *&Names,
2385 unsigned &NumNames) const {}
2386 virtual bool validateAsmConstraint(const char *&Name,
2387 TargetInfo::ConstraintInfo &info) const {
2388 return true;
2389 }
2390 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2391 unsigned &NumAliases) const {}
2392 };
2393}
2394
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002395namespace {
2396class MipsTargetInfo : public TargetInfo {
Eric Christopher0b26a612010-03-02 02:41:08 +00002397 std::string ABI, CPU;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002398 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2399 static const char * const GCCRegNames[];
2400public:
Eric Christopher0b26a612010-03-02 02:41:08 +00002401 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002402 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2403 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2404 }
Eric Christopher0b26a612010-03-02 02:41:08 +00002405 virtual const char *getABI() const { return ABI.c_str(); }
2406 virtual bool setABI(const std::string &Name) {
2407
2408 if ((Name == "o32") || (Name == "eabi")) {
2409 ABI = Name;
2410 return true;
2411 } else
2412 return false;
2413 }
2414 virtual bool setCPU(const std::string &Name) {
2415 CPU = Name;
2416 return true;
2417 }
2418 void getDefaultFeatures(const std::string &CPU,
2419 llvm::StringMap<bool> &Features) const {
2420 Features[ABI] = true;
2421 Features[CPU] = true;
2422 }
2423 virtual void getArchDefines(const LangOptions &Opts,
2424 MacroBuilder &Builder) const {
2425 if (ABI == "o32")
2426 Builder.defineMacro("__mips_o32");
2427 else if (ABI == "eabi")
2428 Builder.defineMacro("__mips_eabi");
2429 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002430 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002431 MacroBuilder &Builder) const {
2432 DefineStd(Builder, "mips", Opts);
2433 Builder.defineMacro("_mips");
2434 DefineStd(Builder, "MIPSEB", Opts);
2435 Builder.defineMacro("_MIPSEB");
2436 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002437 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002438 }
2439 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2440 unsigned &NumRecords) const {
2441 // FIXME: Implement!
2442 }
2443 virtual const char *getVAListDeclaration() const {
2444 return "typedef void* __builtin_va_list;";
2445 }
2446 virtual void getGCCRegNames(const char * const *&Names,
2447 unsigned &NumNames) const;
2448 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2449 unsigned &NumAliases) const;
2450 virtual bool validateAsmConstraint(const char *&Name,
2451 TargetInfo::ConstraintInfo &Info) const {
2452 switch (*Name) {
2453 default:
2454 case 'r': // CPU registers.
2455 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2456 case 'y': // Equivalent to "r", backwards compatibility only.
2457 case 'f': // floating-point registers.
2458 Info.setAllowsRegister();
2459 return true;
2460 }
2461 return false;
2462 }
2463
2464 virtual const char *getClobbers() const {
2465 // FIXME: Implement!
2466 return "";
2467 }
2468};
2469
2470const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002471 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002472 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2473 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2474 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2475 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2476 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2477 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2478 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2479 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2480 "$fcc5","$fcc6","$fcc7"
2481};
2482
2483void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2484 unsigned &NumNames) const {
2485 Names = GCCRegNames;
2486 NumNames = llvm::array_lengthof(GCCRegNames);
2487}
2488
2489const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2490 { { "at" }, "$1" },
2491 { { "v0" }, "$2" },
2492 { { "v1" }, "$3" },
2493 { { "a0" }, "$4" },
2494 { { "a1" }, "$5" },
2495 { { "a2" }, "$6" },
2496 { { "a3" }, "$7" },
2497 { { "t0" }, "$8" },
2498 { { "t1" }, "$9" },
2499 { { "t2" }, "$10" },
2500 { { "t3" }, "$11" },
2501 { { "t4" }, "$12" },
2502 { { "t5" }, "$13" },
2503 { { "t6" }, "$14" },
2504 { { "t7" }, "$15" },
2505 { { "s0" }, "$16" },
2506 { { "s1" }, "$17" },
2507 { { "s2" }, "$18" },
2508 { { "s3" }, "$19" },
2509 { { "s4" }, "$20" },
2510 { { "s5" }, "$21" },
2511 { { "s6" }, "$22" },
2512 { { "s7" }, "$23" },
2513 { { "t8" }, "$24" },
2514 { { "t9" }, "$25" },
2515 { { "k0" }, "$26" },
2516 { { "k1" }, "$27" },
2517 { { "gp" }, "$28" },
2518 { { "sp" }, "$29" },
2519 { { "fp" }, "$30" },
2520 { { "ra" }, "$31" }
2521};
2522
2523void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2524 unsigned &NumAliases) const {
2525 Aliases = GCCRegAliases;
2526 NumAliases = llvm::array_lengthof(GCCRegAliases);
2527}
2528} // end anonymous namespace.
2529
2530namespace {
2531class MipselTargetInfo : public MipsTargetInfo {
2532public:
2533 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2534 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2535 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2536 }
2537
2538 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002539 MacroBuilder &Builder) const;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002540};
2541
2542void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002543 MacroBuilder &Builder) const {
2544 DefineStd(Builder, "mips", Opts);
2545 Builder.defineMacro("_mips");
2546 DefineStd(Builder, "MIPSEL", Opts);
2547 Builder.defineMacro("_MIPSEL");
2548 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002549 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002550}
2551} // end anonymous namespace.
2552
Chris Lattner5ba61f02006-10-14 07:39:34 +00002553//===----------------------------------------------------------------------===//
2554// Driver code
2555//===----------------------------------------------------------------------===//
2556
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002557static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar52322032009-08-18 05:47:58 +00002558 llvm::Triple Triple(T);
2559 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00002560
Daniel Dunbar52322032009-08-18 05:47:58 +00002561 switch (Triple.getArch()) {
2562 default:
2563 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00002564
Daniel Dunbar52322032009-08-18 05:47:58 +00002565 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00002566 case llvm::Triple::thumb:
Daniel Dunbar52322032009-08-18 05:47:58 +00002567 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00002568 case llvm::Triple::Linux:
2569 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002570 case llvm::Triple::Darwin:
Eli Friedman873f65a2008-08-21 00:13:15 +00002571 return new DarwinARMTargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002572 case llvm::Triple::FreeBSD:
Torok Edwinb2b37c62009-06-30 17:10:35 +00002573 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002574 default:
2575 return new ARMTargetInfo(T);
2576 }
Eli Friedmanb5366062008-05-20 14:21:01 +00002577
Daniel Dunbar52322032009-08-18 05:47:58 +00002578 case llvm::Triple::bfin:
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002579 return new BlackfinTargetInfo(T);
2580
Daniel Dunbar52322032009-08-18 05:47:58 +00002581 case llvm::Triple::msp430:
2582 return new MSP430TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +00002583
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002584 case llvm::Triple::mips:
2585 if (os == llvm::Triple::Psp)
2586 return new PSPTargetInfo<MipsTargetInfo>(T);
2587 if (os == llvm::Triple::Linux)
2588 return new LinuxTargetInfo<MipsTargetInfo>(T);
2589 return new MipsTargetInfo(T);
2590
2591 case llvm::Triple::mipsel:
2592 if (os == llvm::Triple::Psp)
2593 return new PSPTargetInfo<MipselTargetInfo>(T);
2594 if (os == llvm::Triple::Linux)
2595 return new LinuxTargetInfo<MipselTargetInfo>(T);
2596 return new MipselTargetInfo(T);
2597
Daniel Dunbar52322032009-08-18 05:47:58 +00002598 case llvm::Triple::ppc:
2599 if (os == llvm::Triple::Darwin)
Roman Divacky965b0b72011-01-06 08:27:10 +00002600 return new DarwinPPC32TargetInfo(T);
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002601 else if (os == llvm::Triple::FreeBSD)
2602 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002603 return new PPC32TargetInfo(T);
2604
2605 case llvm::Triple::ppc64:
2606 if (os == llvm::Triple::Darwin)
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00002607 return new DarwinPPC64TargetInfo(T);
John Thompsone467e192009-11-19 17:18:50 +00002608 else if (os == llvm::Triple::Lv2)
2609 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002610 else if (os == llvm::Triple::FreeBSD)
2611 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002612 return new PPC64TargetInfo(T);
2613
Chris Lattner5178f562010-03-06 21:21:27 +00002614 case llvm::Triple::mblaze:
2615 return new MBlazeTargetInfo(T);
2616
Daniel Dunbar52322032009-08-18 05:47:58 +00002617 case llvm::Triple::sparc:
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002618 if (os == llvm::Triple::AuroraUX)
2619 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002620 if (os == llvm::Triple::Solaris)
2621 return new SolarisSparcV8TargetInfo(T);
2622 return new SparcV8TargetInfo(T);
2623
John Thompsone467e192009-11-19 17:18:50 +00002624 // FIXME: Need a real SPU target.
2625 case llvm::Triple::cellspu:
2626 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2627
Daniel Dunbar52322032009-08-18 05:47:58 +00002628 case llvm::Triple::systemz:
2629 return new SystemZTargetInfo(T);
2630
Eli Friedmana9c3d712009-08-19 20:47:07 +00002631 case llvm::Triple::tce:
2632 return new TCETargetInfo(T);
2633
Daniel Dunbar52322032009-08-18 05:47:58 +00002634 case llvm::Triple::x86:
2635 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002636 case llvm::Triple::AuroraUX:
2637 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002638 case llvm::Triple::Darwin:
2639 return new DarwinI386TargetInfo(T);
2640 case llvm::Triple::Linux:
2641 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2642 case llvm::Triple::DragonFly:
2643 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2644 case llvm::Triple::NetBSD:
2645 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2646 case llvm::Triple::OpenBSD:
2647 return new OpenBSDI386TargetInfo(T);
2648 case llvm::Triple::FreeBSD:
2649 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner3e2ee142010-07-07 16:01:42 +00002650 case llvm::Triple::Minix:
2651 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002652 case llvm::Triple::Solaris:
2653 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2654 case llvm::Triple::Cygwin:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002655 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002656 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002657 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002658 case llvm::Triple::Win32:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002659 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattnerb986aba2010-04-11 19:29:39 +00002660 case llvm::Triple::Haiku:
2661 return new HaikuX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002662 default:
2663 return new X86_32TargetInfo(T);
2664 }
2665
2666 case llvm::Triple::x86_64:
2667 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002668 case llvm::Triple::AuroraUX:
2669 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002670 case llvm::Triple::Darwin:
2671 return new DarwinX86_64TargetInfo(T);
2672 case llvm::Triple::Linux:
2673 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner002ba6b2010-01-09 05:41:14 +00002674 case llvm::Triple::DragonFly:
2675 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002676 case llvm::Triple::NetBSD:
2677 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2678 case llvm::Triple::OpenBSD:
2679 return new OpenBSDX86_64TargetInfo(T);
2680 case llvm::Triple::FreeBSD:
2681 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2682 case llvm::Triple::Solaris:
2683 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00002684 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002685 return new MinGWX86_64TargetInfo(T);
2686 case llvm::Triple::Win32: // This is what Triple.h supports now.
Douglas Gregorde7a3572011-02-01 15:06:18 +00002687 if (Triple.getEnvironment() == llvm::Triple::MachO)
2688 return new DarwinX86_64TargetInfo(T);
2689 else
2690 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002691 default:
2692 return new X86_64TargetInfo(T);
2693 }
2694 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002695}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002696
2697/// CreateTargetInfo - Return the target info object for the specified target
2698/// triple.
2699TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002700 TargetOptions &Opts) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002701 llvm::Triple Triple(Opts.Triple);
2702
2703 // Construct the target
2704 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2705 if (!Target) {
2706 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2707 return 0;
2708 }
2709
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002710 // Set the target CPU if specified.
2711 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2712 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2713 return 0;
2714 }
2715
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002716 // Set the target ABI if specified.
2717 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2718 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2719 return 0;
2720 }
2721
Charles Davis95a546e2010-06-11 01:06:47 +00002722 // Set the target C++ ABI.
John McCall86353412010-08-21 22:46:04 +00002723 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis95a546e2010-06-11 01:06:47 +00002724 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2725 return 0;
2726 }
2727
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002728 // Compute the default target features, we need the target to handle this
2729 // because features may have dependencies on one another.
2730 llvm::StringMap<bool> Features;
2731 Target->getDefaultFeatures(Opts.CPU, Features);
2732
2733 // Apply the user specified deltas.
2734 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2735 ie = Opts.Features.end(); it != ie; ++it) {
2736 const char *Name = it->c_str();
2737
2738 // Apply the feature via the target.
2739 if ((Name[0] != '-' && Name[0] != '+') ||
2740 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2741 Diags.Report(diag::err_target_invalid_feature) << Name;
2742 return 0;
2743 }
2744 }
2745
2746 // Add the features to the compile options.
2747 //
2748 // FIXME: If we are completely confident that we have the right set, we only
2749 // need to pass the minuses.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002750 Opts.Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002751 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2752 ie = Features.end(); it != ie; ++it)
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002753 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2754 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002755
2756 return Target.take();
2757}