blob: ebd67e876ded42de00542f1b51b6e557f87e4d67 [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;
Daniel Dunbar75942372011-03-19 02:06:21 +0000162 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000163 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000164 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000165 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000166
Anders Carlsson851318a2010-06-08 22:47:50 +0000167 virtual const char *getStaticInitSectionSpecifier() const {
168 // FIXME: We should return 0 when building kexts.
169 return "__TEXT,__StaticInit,regular,pure_instructions";
170 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000171
Torok Edwinb2b37c62009-06-30 17:10:35 +0000172};
173
Chris Lattner30ba6742009-08-10 19:03:04 +0000174
Torok Edwinb2b37c62009-06-30 17:10:35 +0000175// DragonFlyBSD Target
176template<typename Target>
177class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
178protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000179 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000180 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000181 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000182 Builder.defineMacro("__DragonFly__");
183 Builder.defineMacro("__DragonFly_cc_version", "100001");
184 Builder.defineMacro("__ELF__");
185 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
186 Builder.defineMacro("__tune_i386__");
187 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000188 }
189public:
Mike Stump11289f42009-09-09 15:08:12 +0000190 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000191 : OSTargetInfo<Target>(triple) {}
192};
193
194// FreeBSD Target
195template<typename Target>
196class FreeBSDTargetInfo : public OSTargetInfo<Target> {
197protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000198 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000199 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000200 // FreeBSD defines; list based off of gcc output
201
Daniel Dunbar40165182009-08-24 09:10:05 +0000202 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000203 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000204
Benjamin Kramer31a68e72010-01-30 19:55:01 +0000205 Builder.defineMacro("__FreeBSD__", Release);
206 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000207 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
208 DefineStd(Builder, "unix", Opts);
209 Builder.defineMacro("__ELF__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000210 }
211public:
Mike Stump11289f42009-09-09 15:08:12 +0000212 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands9cb27e92009-07-08 13:55:08 +0000213 : OSTargetInfo<Target>(triple) {
214 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000215
216 llvm::Triple Triple(triple);
217 switch (Triple.getArch()) {
218 default:
219 case llvm::Triple::x86:
220 case llvm::Triple::x86_64:
221 this->MCountName = ".mcount";
222 break;
223 case llvm::Triple::mips:
224 case llvm::Triple::mipsel:
225 case llvm::Triple::ppc:
226 case llvm::Triple::ppc64:
227 this->MCountName = "_mcount";
228 break;
229 case llvm::Triple::arm:
230 this->MCountName = "__mcount";
231 break;
232 }
233
Duncan Sands9cb27e92009-07-08 13:55:08 +0000234 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000235};
236
Chris Lattner3e2ee142010-07-07 16:01:42 +0000237// Minix Target
238template<typename Target>
239class MinixTargetInfo : public OSTargetInfo<Target> {
240protected:
241 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
242 MacroBuilder &Builder) const {
243 // Minix defines
244
245 Builder.defineMacro("__minix", "3");
246 Builder.defineMacro("_EM_WSIZE", "4");
247 Builder.defineMacro("_EM_PSIZE", "4");
248 Builder.defineMacro("_EM_SSIZE", "2");
249 Builder.defineMacro("_EM_LSIZE", "4");
250 Builder.defineMacro("_EM_FSIZE", "4");
251 Builder.defineMacro("_EM_DSIZE", "8");
252 DefineStd(Builder, "unix", Opts);
253 }
254public:
255 MinixTargetInfo(const std::string &triple)
256 : OSTargetInfo<Target>(triple) {
257 this->UserLabelPrefix = "";
258 }
259};
260
Torok Edwinb2b37c62009-06-30 17:10:35 +0000261// Linux target
262template<typename Target>
263class LinuxTargetInfo : public OSTargetInfo<Target> {
264protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000265 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000266 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000267 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000268 DefineStd(Builder, "unix", Opts);
269 DefineStd(Builder, "linux", Opts);
270 Builder.defineMacro("__gnu_linux__");
271 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000272 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000273 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000274 if (Opts.CPlusPlus)
275 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000276 }
277public:
Mike Stump11289f42009-09-09 15:08:12 +0000278 LinuxTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000279 : OSTargetInfo<Target>(triple) {
280 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000281 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000282 }
283};
284
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000285// NetBSD Target
286template<typename Target>
287class NetBSDTargetInfo : public OSTargetInfo<Target> {
288protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000289 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000290 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000291 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000292 Builder.defineMacro("__NetBSD__");
293 Builder.defineMacro("__unix__");
294 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000295 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000296 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000297 }
298public:
Mike Stump11289f42009-09-09 15:08:12 +0000299 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000300 : OSTargetInfo<Target>(triple) {
301 this->UserLabelPrefix = "";
302 }
303};
304
Torok Edwinb2b37c62009-06-30 17:10:35 +0000305// OpenBSD Target
306template<typename Target>
307class OpenBSDTargetInfo : public OSTargetInfo<Target> {
308protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000309 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000310 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000311 // OpenBSD defines; list based off of gcc output
312
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000313 Builder.defineMacro("__OpenBSD__");
314 DefineStd(Builder, "unix", Opts);
315 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000316 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000317 Builder.defineMacro("_POSIX_THREADS");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000318 }
319public:
Mike Stump11289f42009-09-09 15:08:12 +0000320 OpenBSDTargetInfo(const std::string &triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000321 : OSTargetInfo<Target>(triple) {}
322};
323
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000324// PSP Target
325template<typename Target>
326class PSPTargetInfo : public OSTargetInfo<Target> {
327protected:
328 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000329 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000330 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000331 Builder.defineMacro("PSP");
332 Builder.defineMacro("_PSP");
333 Builder.defineMacro("__psp__");
334 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000335 }
336public:
337 PSPTargetInfo(const std::string& triple)
338 : OSTargetInfo<Target>(triple) {
339 this->UserLabelPrefix = "";
340 }
341};
342
John Thompsone467e192009-11-19 17:18:50 +0000343// PS3 PPU Target
344template<typename Target>
345class PS3PPUTargetInfo : public OSTargetInfo<Target> {
346protected:
347 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000348 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000349 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000350 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000351 Builder.defineMacro("__PPU__");
352 Builder.defineMacro("__CELLOS_LV2__");
353 Builder.defineMacro("__ELF__");
354 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000355 Builder.defineMacro("_ARCH_PPC64");
356 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000357 }
358public:
359 PS3PPUTargetInfo(const std::string& triple)
360 : OSTargetInfo<Target>(triple) {
361 this->UserLabelPrefix = "";
John Thompson6f8dba72009-12-18 14:21:08 +0000362 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000363 this->IntMaxType = TargetInfo::SignedLongLong;
364 this->UIntMaxType = TargetInfo::UnsignedLongLong;
365 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000366 this->SizeType = TargetInfo::UnsignedInt;
John Thompson07a61a42010-06-24 22:44:13 +0000367 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
368 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompsone467e192009-11-19 17:18:50 +0000369 }
370};
371
372// FIXME: Need a real SPU target.
373// PS3 SPU Target
374template<typename Target>
375class PS3SPUTargetInfo : public OSTargetInfo<Target> {
376protected:
377 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000378 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000379 // PS3 PPU defines.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000380 Builder.defineMacro("__SPU__");
381 Builder.defineMacro("__ELF__");
John Thompsone467e192009-11-19 17:18:50 +0000382 }
383public:
384 PS3SPUTargetInfo(const std::string& triple)
385 : OSTargetInfo<Target>(triple) {
386 this->UserLabelPrefix = "";
387 }
388};
389
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000390// AuroraUX target
391template<typename Target>
392class AuroraUXTargetInfo : public OSTargetInfo<Target> {
393protected:
394 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000395 MacroBuilder &Builder) const {
396 DefineStd(Builder, "sun", Opts);
397 DefineStd(Builder, "unix", Opts);
398 Builder.defineMacro("__ELF__");
399 Builder.defineMacro("__svr4__");
400 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000401 }
402public:
403 AuroraUXTargetInfo(const std::string& triple)
404 : OSTargetInfo<Target>(triple) {
405 this->UserLabelPrefix = "";
406 this->WCharType = this->SignedLong;
407 // FIXME: WIntType should be SignedLong
408 }
409};
410
Torok Edwinb2b37c62009-06-30 17:10:35 +0000411// Solaris target
412template<typename Target>
413class SolarisTargetInfo : public OSTargetInfo<Target> {
414protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000415 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000416 MacroBuilder &Builder) const {
417 DefineStd(Builder, "sun", Opts);
418 DefineStd(Builder, "unix", Opts);
419 Builder.defineMacro("__ELF__");
420 Builder.defineMacro("__svr4__");
421 Builder.defineMacro("__SVR4");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000422 }
423public:
Mike Stump11289f42009-09-09 15:08:12 +0000424 SolarisTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000425 : OSTargetInfo<Target>(triple) {
426 this->UserLabelPrefix = "";
427 this->WCharType = this->SignedLong;
428 // FIXME: WIntType should be SignedLong
429 }
430};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000431
432// Windows target
433template<typename Target>
434class WindowsTargetInfo : public OSTargetInfo<Target> {
435protected:
436 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
437 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000438 Builder.defineMacro("_WIN32");
439 }
440 void getVisualStudioDefines(const LangOptions &Opts,
441 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000442 if (Opts.CPlusPlus) {
443 if (Opts.RTTI)
444 Builder.defineMacro("_CPPRTTI");
445
446 if (Opts.Exceptions)
447 Builder.defineMacro("_CPPUNWIND");
448 }
449
450 if (!Opts.CharIsSigned)
451 Builder.defineMacro("_CHAR_UNSIGNED");
452
453 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
454 // but it works for now.
455 if (Opts.POSIXThreads)
456 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000457
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000458 if (Opts.MSCVersion != 0)
459 Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
460
461 if (Opts.Microsoft) {
462 Builder.defineMacro("_MSC_EXTENSIONS");
463
464 if (Opts.CPlusPlus0x) {
465 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
466 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
467 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
468 }
469 }
470
471 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000472 }
473
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000474public:
475 WindowsTargetInfo(const std::string &triple)
476 : OSTargetInfo<Target>(triple) {}
477};
478
Mike Stump11289f42009-09-09 15:08:12 +0000479} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000480
Chris Lattner09d98f52008-10-05 21:50:58 +0000481//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000482// Specific target implementations.
483//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000484
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000485namespace {
486// PPC abstract base class
487class PPCTargetInfo : public TargetInfo {
488 static const Builtin::Info BuiltinInfo[];
489 static const char * const GCCRegNames[];
490 static const TargetInfo::GCCRegAlias GCCRegAliases[];
491
492public:
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000493 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
494
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000495 virtual void getTargetBuiltins(const Builtin::Info *&Records,
496 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000497 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000498 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000499 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000500
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000501 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000502 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000503
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000504 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000505 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000506 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000507 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000508 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000509 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000510 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000511 default: return false;
512 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000513 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000514 case 'b': // Base register
515 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000516 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000517 break;
518 // FIXME: The following are added to allow parsing.
519 // I just took a guess at what the actions should be.
520 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000521 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000522 case 'v': // Altivec vector register
523 Info.setAllowsRegister();
524 break;
525 case 'w':
526 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000527 case 'd':// VSX vector register to hold vector double data
528 case 'f':// VSX vector register to hold vector float data
529 case 's':// VSX vector register to hold scalar float data
530 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000531 break;
532 default:
533 return false;
534 }
535 Info.setAllowsRegister();
536 Name++; // Skip over 'w'.
537 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000538 case 'h': // `MQ', `CTR', or `LINK' register
539 case 'q': // `MQ' register
540 case 'c': // `CTR' register
541 case 'l': // `LINK' register
542 case 'x': // `CR' register (condition register) number 0
543 case 'y': // `CR' register (condition register)
544 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000545 Info.setAllowsRegister();
546 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000547 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000548 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000549 // (use `L' instead for SImode constants)
550 case 'K': // Unsigned 16-bit constant
551 case 'L': // Signed 16-bit constant shifted left 16 bits
552 case 'M': // Constant larger than 31
553 case 'N': // Exact power of 2
554 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000555 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000556 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000557 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000558 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000559 break;
560 case 'm': // Memory operand. Note that on PowerPC targets, m can
561 // include addresses that update the base register. It
562 // is therefore only safe to use `m' in an asm statement
563 // if that asm statement accesses the operand exactly once.
564 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000565 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000566 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000567 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000568 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000569 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
570 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000571 // register to be updated.
572 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000573 if (Name[1] != 's')
574 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000575 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000576 // include any automodification of the base register. Unlike
577 // `m', this constraint can be used in asm statements that
578 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000579 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000580 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000581 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000582 break;
583 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000584 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000585 case 'Z': // Memory operand that is an indexed or indirect from a
586 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000587 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000588 Info.setAllowsMemory();
589 Info.setAllowsRegister();
590 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000591 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000592 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000593 // register (`p' is preferable for asm statements)
594 case 'S': // Constant suitable as a 64-bit mask operand
595 case 'T': // Constant suitable as a 32-bit mask operand
596 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000597 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000598 // instructions
599 case 'W': // Vector constant that does not require memory
600 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000601 break;
602 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000603 }
John Thompson07a61a42010-06-24 22:44:13 +0000604 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000605 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000606 virtual const char *getClobbers() const {
607 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000608 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000609};
Anders Carlssonf511f642007-11-27 04:11:28 +0000610
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000611const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000612#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
613#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
614 ALL_LANGUAGES, false },
Chris Lattner5abdec72009-06-14 01:05:48 +0000615#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000616};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000617
618
Chris Lattnerecd49032009-03-02 22:27:17 +0000619/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
620/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000621void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000622 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000623 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000624 Builder.defineMacro("__ppc__");
625 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000626 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000627 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000628 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000629 Builder.defineMacro("_ARCH_PPC64");
630 Builder.defineMacro("_LP64");
631 Builder.defineMacro("__LP64__");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000632 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000633 Builder.defineMacro("__ppc64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000634 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000635 Builder.defineMacro("__ppc__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000636 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000637
Chris Lattnerecd49032009-03-02 22:27:17 +0000638 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000639 Builder.defineMacro("_BIG_ENDIAN");
640 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000641
Chris Lattnerecd49032009-03-02 22:27:17 +0000642 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000643 Builder.defineMacro("__NATURAL_ALIGNMENT__");
644 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000645
Chris Lattnerecd49032009-03-02 22:27:17 +0000646 // FIXME: Should be controlled by command line option.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000647 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000648
John Thompsone467e192009-11-19 17:18:50 +0000649 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000650 Builder.defineMacro("__VEC__", "10206");
651 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000652 }
Chris Lattnerecd49032009-03-02 22:27:17 +0000653}
654
Chris Lattner17df24e2008-04-21 18:56:49 +0000655
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000656const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000657 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
658 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
659 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
660 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
661 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
662 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
663 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
664 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000665 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000666 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000667 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +0000668 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
669 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
670 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
671 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000672 "vrsave", "vscr",
673 "spe_acc", "spefscr",
674 "sfp"
675};
Chris Lattner10a5b382007-01-29 05:24:35 +0000676
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000677void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000678 unsigned &NumNames) const {
679 Names = GCCRegNames;
680 NumNames = llvm::array_lengthof(GCCRegNames);
681}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000682
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000683const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
684 // While some of these aliases do map to different registers
685 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000686 { { "0" }, "r0" },
687 { { "1"}, "r1" },
688 { { "2" }, "r2" },
689 { { "3" }, "r3" },
690 { { "4" }, "r4" },
691 { { "5" }, "r5" },
692 { { "6" }, "r6" },
693 { { "7" }, "r7" },
694 { { "8" }, "r8" },
695 { { "9" }, "r9" },
696 { { "10" }, "r10" },
697 { { "11" }, "r11" },
698 { { "12" }, "r12" },
699 { { "13" }, "r13" },
700 { { "14" }, "r14" },
701 { { "15" }, "r15" },
702 { { "16" }, "r16" },
703 { { "17" }, "r17" },
704 { { "18" }, "r18" },
705 { { "19" }, "r19" },
706 { { "20" }, "r20" },
707 { { "21" }, "r21" },
708 { { "22" }, "r22" },
709 { { "23" }, "r23" },
710 { { "24" }, "r24" },
711 { { "25" }, "r25" },
712 { { "26" }, "r26" },
713 { { "27" }, "r27" },
714 { { "28" }, "r28" },
715 { { "29" }, "r29" },
716 { { "30" }, "r30" },
717 { { "31" }, "r31" },
718 { { "fr0" }, "f0" },
719 { { "fr1" }, "f1" },
720 { { "fr2" }, "f2" },
721 { { "fr3" }, "f3" },
722 { { "fr4" }, "f4" },
723 { { "fr5" }, "f5" },
724 { { "fr6" }, "f6" },
725 { { "fr7" }, "f7" },
726 { { "fr8" }, "f8" },
727 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +0000728 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +0000729 { { "fr11" }, "f11" },
730 { { "fr12" }, "f12" },
731 { { "fr13" }, "f13" },
732 { { "fr14" }, "f14" },
733 { { "fr15" }, "f15" },
734 { { "fr16" }, "f16" },
735 { { "fr17" }, "f17" },
736 { { "fr18" }, "f18" },
737 { { "fr19" }, "f19" },
738 { { "fr20" }, "f20" },
739 { { "fr21" }, "f21" },
740 { { "fr22" }, "f22" },
741 { { "fr23" }, "f23" },
742 { { "fr24" }, "f24" },
743 { { "fr25" }, "f25" },
744 { { "fr26" }, "f26" },
745 { { "fr27" }, "f27" },
746 { { "fr28" }, "f28" },
747 { { "fr29" }, "f29" },
748 { { "fr30" }, "f30" },
749 { { "fr31" }, "f31" },
750 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000751};
752
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000753void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000754 unsigned &NumAliases) const {
755 Aliases = GCCRegAliases;
756 NumAliases = llvm::array_lengthof(GCCRegAliases);
757}
758} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +0000759
Chris Lattner5ba61f02006-10-14 07:39:34 +0000760namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000761class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000762public:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000763 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedman873f65a2008-08-21 00:13:15 +0000764 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 +0000765 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000766
767 if (getTriple().getOS() == llvm::Triple::FreeBSD)
Roman Divacky965b0b72011-01-06 08:27:10 +0000768 SizeType = UnsignedInt;
769 }
770
771 virtual const char *getVAListDeclaration() const {
772 // This is the ELF definition, and is overridden by the Darwin sub-target
773 return "typedef struct __va_list_tag {"
774 " unsigned char gpr;"
775 " unsigned char fpr;"
776 " unsigned short reserved;"
777 " void* overflow_arg_area;"
778 " void* reg_save_area;"
779 "} __builtin_va_list[1];";
Eli Friedman873f65a2008-08-21 00:13:15 +0000780 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000781};
782} // end anonymous namespace.
783
784namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000785class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +0000786public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000787 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000788 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +0000789 IntMaxType = SignedLong;
790 UIntMaxType = UnsignedLong;
791 Int64Type = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +0000792 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 +0000793 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000794 }
Roman Divacky965b0b72011-01-06 08:27:10 +0000795 virtual const char *getVAListDeclaration() const {
796 return "typedef char* __builtin_va_list;";
797 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000798};
799} // end anonymous namespace.
800
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000801
802namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +0000803class DarwinPPC32TargetInfo :
804 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000805public:
Roman Divacky965b0b72011-01-06 08:27:10 +0000806 DarwinPPC32TargetInfo(const std::string& triple)
807 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000808 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +0000809 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
810 }
811 virtual const char *getVAListDeclaration() const {
812 return "typedef char* __builtin_va_list;";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +0000813 }
814};
815
816class DarwinPPC64TargetInfo :
817 public DarwinTargetInfo<PPC64TargetInfo> {
818public:
819 DarwinPPC64TargetInfo(const std::string& triple)
820 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
821 HasAlignMac68kSupport = true;
822 }
823};
824} // end anonymous namespace.
825
Chris Lattner5ba61f02006-10-14 07:39:34 +0000826namespace {
Chris Lattner5178f562010-03-06 21:21:27 +0000827// MBlaze abstract base class
828class MBlazeTargetInfo : public TargetInfo {
829 static const char * const GCCRegNames[];
830 static const TargetInfo::GCCRegAlias GCCRegAliases[];
831
832public:
833 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Peck69bf1282010-12-12 20:56:47 +0000834 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner5178f562010-03-06 21:21:27 +0000835 }
836
837 virtual void getTargetBuiltins(const Builtin::Info *&Records,
838 unsigned &NumRecords) const {
839 // FIXME: Implement.
840 Records = 0;
841 NumRecords = 0;
842 }
843
844 virtual void getTargetDefines(const LangOptions &Opts,
845 MacroBuilder &Builder) const;
846
847 virtual const char *getVAListDeclaration() const {
848 return "typedef char* __builtin_va_list;";
849 }
850 virtual const char *getTargetPrefix() const {
851 return "mblaze";
852 }
853 virtual void getGCCRegNames(const char * const *&Names,
854 unsigned &NumNames) const;
855 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
856 unsigned &NumAliases) const;
857 virtual bool validateAsmConstraint(const char *&Name,
858 TargetInfo::ConstraintInfo &Info) const {
859 switch (*Name) {
860 default: return false;
861 case 'O': // Zero
862 return true;
863 case 'b': // Base register
864 case 'f': // Floating point register
865 Info.setAllowsRegister();
866 return true;
867 }
868 }
869 virtual const char *getClobbers() const {
870 return "";
871 }
872};
873
874/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
875/// #defines that are not tied to a specific subtarget.
876void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
877 MacroBuilder &Builder) const {
878 // Target identification.
879 Builder.defineMacro("__microblaze__");
880 Builder.defineMacro("_ARCH_MICROBLAZE");
881 Builder.defineMacro("__MICROBLAZE__");
882
883 // Target properties.
884 Builder.defineMacro("_BIG_ENDIAN");
885 Builder.defineMacro("__BIG_ENDIAN__");
886
887 // Subtarget options.
888 Builder.defineMacro("__REGISTER_PREFIX__", "");
889}
890
891
892const char * const MBlazeTargetInfo::GCCRegNames[] = {
893 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
894 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
895 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
896 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
897 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
898 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
899 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
900 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
901 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
902 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
903};
904
905void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
906 unsigned &NumNames) const {
907 Names = GCCRegNames;
908 NumNames = llvm::array_lengthof(GCCRegNames);
909}
910
911const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
912 { {"f0"}, "r0" },
913 { {"f1"}, "r1" },
914 { {"f2"}, "r2" },
915 { {"f3"}, "r3" },
916 { {"f4"}, "r4" },
917 { {"f5"}, "r5" },
918 { {"f6"}, "r6" },
919 { {"f7"}, "r7" },
920 { {"f8"}, "r8" },
921 { {"f9"}, "r9" },
922 { {"f10"}, "r10" },
923 { {"f11"}, "r11" },
924 { {"f12"}, "r12" },
925 { {"f13"}, "r13" },
926 { {"f14"}, "r14" },
927 { {"f15"}, "r15" },
928 { {"f16"}, "r16" },
929 { {"f17"}, "r17" },
930 { {"f18"}, "r18" },
931 { {"f19"}, "r19" },
932 { {"f20"}, "r20" },
933 { {"f21"}, "r21" },
934 { {"f22"}, "r22" },
935 { {"f23"}, "r23" },
936 { {"f24"}, "r24" },
937 { {"f25"}, "r25" },
938 { {"f26"}, "r26" },
939 { {"f27"}, "r27" },
940 { {"f28"}, "r28" },
941 { {"f29"}, "r29" },
942 { {"f30"}, "r30" },
943 { {"f31"}, "r31" },
944};
945
946void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
947 unsigned &NumAliases) const {
948 Aliases = GCCRegAliases;
949 NumAliases = llvm::array_lengthof(GCCRegAliases);
950}
951} // end anonymous namespace.
952
953namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000954// Namespace for x86 abstract base class
955const Builtin::Info BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000956#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
957#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
958 ALL_LANGUAGES, false },
Chris Lattner5abdec72009-06-14 01:05:48 +0000959#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +0000960};
Eli Friedmanb5366062008-05-20 14:21:01 +0000961
Nuno Lopescfca1f02009-12-23 17:49:57 +0000962static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +0000963 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
964 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
965 "argp", "flags", "fspr", "dirflag", "frame",
966 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
967 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
968 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
969 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
970};
971
972const TargetInfo::GCCRegAlias GCCRegAliases[] = {
973 { { "al", "ah", "eax", "rax" }, "ax" },
974 { { "bl", "bh", "ebx", "rbx" }, "bx" },
975 { { "cl", "ch", "ecx", "rcx" }, "cx" },
976 { { "dl", "dh", "edx", "rdx" }, "dx" },
977 { { "esi", "rsi" }, "si" },
978 { { "edi", "rdi" }, "di" },
979 { { "esp", "rsp" }, "sp" },
980 { { "ebp", "rbp" }, "bp" },
981};
982
983// X86 target abstract base class; x86-32 and x86-64 are very close, so
984// most of the implementation can be shared.
985class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +0000986 enum X86SSEEnum {
987 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
988 } SSELevel;
Anders Carlssone437c682010-01-27 03:47:49 +0000989 enum AMD3DNowEnum {
990 NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
991 } AMD3DNowLevel;
992
Eric Christophere1ddaf92010-04-02 23:50:19 +0000993 bool HasAES;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +0000994 bool HasAVX;
995
Eli Friedman3fd920a2008-08-20 02:34:37 +0000996public:
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000997 X86TargetInfo(const std::string& triple)
Eric Christophere1ddaf92010-04-02 23:50:19 +0000998 : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +0000999 HasAES(false), HasAVX(false) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001000 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001001 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001002 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1003 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001004 Records = BuiltinInfo;
1005 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001006 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001007 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001008 unsigned &NumNames) const {
1009 Names = GCCRegNames;
1010 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001011 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001012 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001013 unsigned &NumAliases) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001014 Aliases = GCCRegAliases;
1015 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +00001016 }
Anders Carlsson58436352009-02-28 17:11:49 +00001017 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001018 TargetInfo::ConstraintInfo &info) const;
1019 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001020 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001021 return "~{dirflag},~{fpsr},~{flags}";
1022 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001023 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001024 MacroBuilder &Builder) const;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001025 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1026 const std::string &Name,
1027 bool Enabled) const;
Mike Stump11289f42009-09-09 15:08:12 +00001028 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001029 llvm::StringMap<bool> &Features) const;
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001030 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Chris Lattner5ba61f02006-10-14 07:39:34 +00001031};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001032
Mike Stump11289f42009-09-09 15:08:12 +00001033void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001034 llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001035 // FIXME: This should not be here.
1036 Features["3dnow"] = false;
1037 Features["3dnowa"] = false;
1038 Features["mmx"] = false;
1039 Features["sse"] = false;
1040 Features["sse2"] = false;
1041 Features["sse3"] = false;
1042 Features["ssse3"] = false;
1043 Features["sse41"] = false;
1044 Features["sse42"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001045 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001046 Features["avx"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001047
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001048 // LLVM does not currently recognize this.
1049 // Features["sse4a"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001050
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001051 // FIXME: This *really* should not be here.
1052
1053 // X86_64 always has SSE2.
1054 if (PointerWidth == 64)
1055 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1056
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001057 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1058 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1059 ;
1060 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1061 setFeatureEnabled(Features, "mmx", true);
1062 else if (CPU == "pentium3")
1063 setFeatureEnabled(Features, "sse", true);
1064 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
1065 setFeatureEnabled(Features, "sse2", true);
1066 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
1067 setFeatureEnabled(Features, "sse3", true);
1068 else if (CPU == "core2")
1069 setFeatureEnabled(Features, "ssse3", true);
1070 else if (CPU == "penryn") {
1071 setFeatureEnabled(Features, "sse4", true);
1072 Features["sse42"] = false;
1073 } else if (CPU == "atom")
1074 setFeatureEnabled(Features, "sse3", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001075 else if (CPU == "corei7") {
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001076 setFeatureEnabled(Features, "sse4", true);
Eric Christophere1ddaf92010-04-02 23:50:19 +00001077 setFeatureEnabled(Features, "aes", true);
1078 }
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001079 else if (CPU == "k6" || CPU == "winchip-c6")
1080 setFeatureEnabled(Features, "mmx", true);
Mike Stump11289f42009-09-09 15:08:12 +00001081 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001082 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
1083 setFeatureEnabled(Features, "mmx", true);
1084 setFeatureEnabled(Features, "3dnow", true);
1085 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1086 setFeatureEnabled(Features, "sse", true);
1087 setFeatureEnabled(Features, "3dnowa", true);
1088 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1089 CPU == "athlon-fx") {
Mike Stump11289f42009-09-09 15:08:12 +00001090 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001091 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackydacbfe42010-12-29 13:28:29 +00001092 } else if (CPU == "k8-sse3") {
1093 setFeatureEnabled(Features, "sse3", true);
1094 setFeatureEnabled(Features, "3dnowa", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00001095 } else if (CPU == "c3-2")
1096 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001097}
1098
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001099bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump11289f42009-09-09 15:08:12 +00001100 const std::string &Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001101 bool Enabled) const {
Eric Christopher399ffa52010-03-04 02:26:37 +00001102 // FIXME: This *really* should not be here. We need some way of translating
1103 // options into llvm subtarget features.
1104 if (!Features.count(Name) &&
1105 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001106 return false;
1107
1108 if (Enabled) {
1109 if (Name == "mmx")
1110 Features["mmx"] = true;
1111 else if (Name == "sse")
1112 Features["mmx"] = Features["sse"] = true;
1113 else if (Name == "sse2")
1114 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1115 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001116 Features["mmx"] = Features["sse"] = Features["sse2"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001117 Features["sse3"] = true;
1118 else if (Name == "ssse3")
Mike Stump11289f42009-09-09 15:08:12 +00001119 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001120 Features["ssse3"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001121 else if (Name == "sse4" || Name == "sse4.2")
Mike Stump11289f42009-09-09 15:08:12 +00001122 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001123 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00001124 else if (Name == "sse4.1")
1125 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1126 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001127 else if (Name == "3dnow")
1128 Features["3dnowa"] = true;
1129 else if (Name == "3dnowa")
1130 Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001131 else if (Name == "aes")
1132 Features["aes"] = true;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001133 else if (Name == "avx")
1134 Features["avx"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001135 } else {
1136 if (Name == "mmx")
Mike Stump11289f42009-09-09 15:08:12 +00001137 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001138 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1139 else if (Name == "sse")
Mike Stump11289f42009-09-09 15:08:12 +00001140 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001141 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1142 else if (Name == "sse2")
Mike Stump11289f42009-09-09 15:08:12 +00001143 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001144 Features["sse41"] = Features["sse42"] = false;
1145 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00001146 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001147 Features["sse42"] = false;
1148 else if (Name == "ssse3")
1149 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1150 else if (Name == "sse4")
1151 Features["sse41"] = Features["sse42"] = false;
Eric Christophercfeceff2010-03-04 02:31:44 +00001152 else if (Name == "sse4.2")
1153 Features["sse42"] = false;
1154 else if (Name == "sse4.1")
1155 Features["sse41"] = Features["sse42"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001156 else if (Name == "3dnow")
1157 Features["3dnow"] = Features["3dnowa"] = false;
1158 else if (Name == "3dnowa")
1159 Features["3dnowa"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00001160 else if (Name == "aes")
1161 Features["aes"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001162 else if (Name == "avx")
1163 Features["avx"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001164 }
1165
1166 return true;
1167}
1168
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001169/// HandleTargetOptions - Perform initialization based on the user
1170/// configured set of features.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001171void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00001172 // Remember the maximum enabled sselevel.
1173 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1174 // Ignore disabled features.
1175 if (Features[i][0] == '-')
1176 continue;
1177
Eric Christophere1ddaf92010-04-02 23:50:19 +00001178 if (Features[i].substr(1) == "aes") {
1179 HasAES = true;
1180 continue;
1181 }
1182
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001183 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1184 // For now let it be enabled together with other SSE levels.
1185 if (Features[i].substr(1) == "avx") {
1186 HasAVX = true;
1187 continue;
1188 }
1189
Daniel Dunbar979586e2009-11-11 09:38:56 +00001190 assert(Features[i][0] == '+' && "Invalid target feature!");
1191 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1192 .Case("sse42", SSE42)
1193 .Case("sse41", SSE41)
1194 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00001195 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00001196 .Case("sse2", SSE2)
1197 .Case("sse", SSE1)
1198 .Case("mmx", MMX)
1199 .Default(NoMMXSSE);
1200 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001201
1202 AMD3DNowEnum ThreeDNowLevel =
Anders Carlssone437c682010-01-27 03:47:49 +00001203 llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1204 .Case("3dnowa", AMD3DNowAthlon)
1205 .Case("3dnow", AMD3DNow)
1206 .Default(NoAMD3DNow);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001207
Anders Carlssone437c682010-01-27 03:47:49 +00001208 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00001209 }
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001210}
Chris Lattnerecd49032009-03-02 22:27:17 +00001211
1212/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1213/// that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001214void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001215 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001216 // Target identification.
1217 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001218 Builder.defineMacro("_LP64");
1219 Builder.defineMacro("__LP64__");
1220 Builder.defineMacro("__amd64__");
1221 Builder.defineMacro("__amd64");
1222 Builder.defineMacro("__x86_64");
1223 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001224 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001225 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00001226 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001227
Eric Christophere1ddaf92010-04-02 23:50:19 +00001228 if (HasAES)
1229 Builder.defineMacro("__AES__");
1230
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001231 if (HasAVX)
1232 Builder.defineMacro("__AVX__");
1233
Chris Lattnerecd49032009-03-02 22:27:17 +00001234 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001235 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001236
Chris Lattnerecd49032009-03-02 22:27:17 +00001237 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001238 Builder.defineMacro("__nocona");
1239 Builder.defineMacro("__nocona__");
1240 Builder.defineMacro("__tune_nocona__");
1241 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner96e43572009-03-02 22:40:39 +00001242
Chris Lattner6df41af2009-04-19 17:32:33 +00001243 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1244 // functions in glibc header files that use FP Stack inline asm which the
1245 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001246 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001247
Chris Lattner96e43572009-03-02 22:40:39 +00001248 // Each case falls through to the previous one here.
1249 switch (SSELevel) {
1250 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001251 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00001252 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001253 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00001254 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001255 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001256 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001257 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00001258 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001259 Builder.defineMacro("__SSE2__");
1260 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001261 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001262 Builder.defineMacro("__SSE__");
1263 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00001264 case MMX:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001265 Builder.defineMacro("__MMX__");
Chris Lattner96e43572009-03-02 22:40:39 +00001266 case NoMMXSSE:
1267 break;
1268 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001269
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001270 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001271 switch (SSELevel) {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001272 case SSE42:
1273 case SSE41:
1274 case SSSE3:
1275 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001276 case SSE2:
1277 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1278 break;
1279 case SSE1:
1280 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1281 break;
1282 default:
1283 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1284 }
1285 }
1286
Anders Carlssone437c682010-01-27 03:47:49 +00001287 // Each case falls through to the previous one here.
1288 switch (AMD3DNowLevel) {
1289 case AMD3DNowAthlon:
1290 Builder.defineMacro("__3dNOW_A__");
1291 case AMD3DNow:
1292 Builder.defineMacro("__3dNOW__");
1293 case NoAMD3DNow:
1294 break;
1295 }
Chris Lattnerecd49032009-03-02 22:27:17 +00001296}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001297
1298
Eli Friedman3fd920a2008-08-20 02:34:37 +00001299bool
Anders Carlsson58436352009-02-28 17:11:49 +00001300X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001301 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00001302 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001303 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00001304 case 'Y': // first letter of a pair:
1305 switch (*(Name+1)) {
1306 default: return false;
1307 case '0': // First SSE register.
1308 case 't': // Any SSE register, when SSE2 is enabled.
1309 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1310 case 'm': // any MMX register, when inter-unit moves enabled.
1311 break; // falls through to setAllowsRegister.
1312 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001313 case 'a': // eax.
1314 case 'b': // ebx.
1315 case 'c': // ecx.
1316 case 'd': // edx.
1317 case 'S': // esi.
1318 case 'D': // edi.
1319 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00001320 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001321 case 't': // top of floating point stack.
1322 case 'u': // second from top of floating point stack.
1323 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00001324 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00001325 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001326 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00001327 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1328 case 'l': // "Index" registers: any general register that can be used as an
1329 // index in a base+index memory access.
1330 Info.setAllowsRegister();
1331 return true;
1332 case 'C': // SSE floating point constant.
1333 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001334 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001335 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001336 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00001337 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00001338 return true;
1339 }
Dale Johannesen46742a42010-08-24 22:33:12 +00001340 return false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001341}
1342
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00001343
Eli Friedman3fd920a2008-08-20 02:34:37 +00001344std::string
1345X86TargetInfo::convertConstraint(const char Constraint) const {
1346 switch (Constraint) {
1347 case 'a': return std::string("{ax}");
1348 case 'b': return std::string("{bx}");
1349 case 'c': return std::string("{cx}");
1350 case 'd': return std::string("{dx}");
1351 case 'S': return std::string("{si}");
1352 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00001353 case 'p': // address
1354 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00001355 case 't': // top of floating point stack.
1356 return std::string("{st}");
1357 case 'u': // second from top of floating point stack.
1358 return std::string("{st(1)}"); // second from top of floating point stack.
1359 default:
1360 return std::string(1, Constraint);
1361 }
1362}
Eli Friedman3fd920a2008-08-20 02:34:37 +00001363} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00001364
1365namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001366// X86-32 generic target
1367class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001368public:
Eli Friedman3fd920a2008-08-20 02:34:37 +00001369 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1370 DoubleAlign = LongLongAlign = 32;
1371 LongDoubleWidth = 96;
1372 LongDoubleAlign = 32;
Eli Friedman873f65a2008-08-21 00:13:15 +00001373 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1374 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001375 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman32ca82a2009-03-29 20:31:09 +00001376 SizeType = UnsignedInt;
1377 PtrDiffType = SignedInt;
1378 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001379 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001380
1381 // Use fpret for all types.
1382 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1383 (1 << TargetInfo::Double) |
1384 (1 << TargetInfo::LongDouble));
Eli Friedman3fd920a2008-08-20 02:34:37 +00001385 }
1386 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001387 return "typedef char* __builtin_va_list;";
Eli Friedman3fd920a2008-08-20 02:34:37 +00001388 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001389
Chris Lattnerd545ad12009-09-23 06:06:36 +00001390 int getEHDataRegisterNumber(unsigned RegNo) const {
1391 if (RegNo == 0) return 0;
1392 if (RegNo == 1) return 2;
1393 return -1;
1394 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001395};
1396} // end anonymous namespace
1397
1398namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00001399class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1400public:
1401 OpenBSDI386TargetInfo(const std::string& triple) :
1402 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1403 SizeType = UnsignedLong;
1404 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00001405 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00001406 }
1407};
1408} // end anonymous namespace
1409
1410namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00001411class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001412public:
Torok Edwinb2b37c62009-06-30 17:10:35 +00001413 DarwinI386TargetInfo(const std::string& triple) :
1414 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001415 LongDoubleWidth = 128;
1416 LongDoubleAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00001417 SizeType = UnsignedLong;
1418 IntPtrType = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +00001419 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1420 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001421 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbarbd606522010-05-27 00:35:16 +00001422 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00001423 }
1424
Eli Friedman3fd920a2008-08-20 02:34:37 +00001425};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00001426} // end anonymous namespace
1427
1428namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001429// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001430class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001431public:
1432 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001433 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00001434 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00001435 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00001436 DoubleAlign = LongLongAlign = 64;
1437 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 +00001438 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1439 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001440 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001441 virtual void getTargetDefines(const LangOptions &Opts,
1442 MacroBuilder &Builder) const {
1443 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1444 }
1445};
1446} // end anonymous namespace
1447
1448namespace {
1449
1450// x86-32 Windows Visual Studio target
1451class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1452public:
1453 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1454 : WindowsX86_32TargetInfo(triple) {
1455 LongDoubleWidth = 64;
1456 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1457 }
1458 virtual void getTargetDefines(const LangOptions &Opts,
1459 MacroBuilder &Builder) const {
1460 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1461 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1462 // The value of the following reflects processor type.
1463 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1464 // We lost the original triple, so we use the default.
1465 Builder.defineMacro("_M_IX86", "600");
1466 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001467};
1468} // end anonymous namespace
1469
1470namespace {
1471// x86-32 MinGW target
1472class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1473public:
1474 MinGWX86_32TargetInfo(const std::string& triple)
1475 : WindowsX86_32TargetInfo(triple) {
1476 }
1477 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001478 MacroBuilder &Builder) const {
1479 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001480 DefineStd(Builder, "WIN32", Opts);
1481 DefineStd(Builder, "WINNT", Opts);
1482 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001483 Builder.defineMacro("__MSVCRT__");
1484 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00001485
1486 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1487 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1488 if (Opts.Microsoft)
1489 // Provide "as-is" __declspec.
1490 Builder.defineMacro("__declspec", "__declspec");
1491 else
1492 // Provide alias of __attribute__ like mingw32-gcc.
1493 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001494 }
1495};
1496} // end anonymous namespace
1497
1498namespace {
1499// x86-32 Cygwin target
1500class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1501public:
1502 CygwinX86_32TargetInfo(const std::string& triple)
1503 : X86_32TargetInfo(triple) {
1504 TLSSupported = false;
1505 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001506 DoubleAlign = LongLongAlign = 64;
1507 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1508 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001509 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001510 }
1511 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001512 MacroBuilder &Builder) const {
1513 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1514 Builder.defineMacro("__CYGWIN__");
1515 Builder.defineMacro("__CYGWIN32__");
1516 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00001517 if (Opts.CPlusPlus)
1518 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00001519 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00001520};
1521} // end anonymous namespace
1522
1523namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00001524// x86-32 Haiku target
1525class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1526public:
1527 HaikuX86_32TargetInfo(const std::string& triple)
1528 : X86_32TargetInfo(triple) {
1529 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00001530 IntPtrType = SignedLong;
1531 PtrDiffType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00001532 this->UserLabelPrefix = "";
Eli Friedman04831922010-08-22 01:00:03 +00001533 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00001534 virtual void getTargetDefines(const LangOptions &Opts,
1535 MacroBuilder &Builder) const {
1536 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1537 Builder.defineMacro("__INTEL__");
1538 Builder.defineMacro("__HAIKU__");
1539 }
1540};
1541} // end anonymous namespace
1542
1543namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001544// x86-64 generic target
1545class X86_64TargetInfo : public X86TargetInfo {
1546public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001547 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001548 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00001549 LongDoubleWidth = 128;
1550 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00001551 LargeArrayMinWidth = 128;
1552 LargeArrayAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001553 IntMaxType = SignedLong;
1554 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001555 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00001556 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00001557
Eli Friedman873f65a2008-08-21 00:13:15 +00001558 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1559 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001560 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00001561
1562 // Use fpret only for long double.
1563 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Chris Lattner10a5b382007-01-29 05:24:35 +00001564 }
Anders Carlssona7408e72007-10-13 00:45:48 +00001565 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00001566 return "typedef struct __va_list_tag {"
1567 " unsigned gp_offset;"
1568 " unsigned fp_offset;"
1569 " void* overflow_arg_area;"
1570 " void* reg_save_area;"
John McCall61d82582010-05-28 18:25:28 +00001571 "} __va_list_tag;"
Eli Friedmanfb36b022009-07-03 00:45:06 +00001572 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001573 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001574
Chris Lattnerd545ad12009-09-23 06:06:36 +00001575 int getEHDataRegisterNumber(unsigned RegNo) const {
1576 if (RegNo == 0) return 0;
1577 if (RegNo == 1) return 1;
1578 return -1;
1579 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00001580};
1581} // end anonymous namespace
1582
1583namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001584// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001585class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001586public:
1587 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001588 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001589 TLSSupported = false;
1590 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00001591 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00001592 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00001593 IntMaxType = SignedLongLong;
1594 UIntMaxType = UnsignedLongLong;
1595 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00001596 SizeType = UnsignedLongLong;
1597 PtrDiffType = SignedLongLong;
1598 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00001599 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001600 }
1601 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001602 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001603 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001604 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001605 }
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00001606 virtual const char *getVAListDeclaration() const {
1607 return "typedef char* __builtin_va_list;";
1608 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001609};
1610} // end anonymous namespace
1611
1612namespace {
1613// x86-64 Windows Visual Studio target
1614class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1615public:
1616 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1617 : WindowsX86_64TargetInfo(triple) {
1618 }
1619 virtual void getTargetDefines(const LangOptions &Opts,
1620 MacroBuilder &Builder) const {
1621 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1622 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001623 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00001624 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001625 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001626};
1627} // end anonymous namespace
1628
1629namespace {
1630// x86-64 MinGW target
1631class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1632public:
1633 MinGWX86_64TargetInfo(const std::string& triple)
1634 : WindowsX86_64TargetInfo(triple) {
1635 }
1636 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001637 MacroBuilder &Builder) const {
1638 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00001639 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001640 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00001641 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001642 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00001643
1644 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1645 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1646 if (Opts.Microsoft)
1647 // Provide "as-is" __declspec.
1648 Builder.defineMacro("__declspec", "__declspec");
1649 else
1650 // Provide alias of __attribute__ like mingw32-gcc.
1651 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00001652 }
1653};
1654} // end anonymous namespace
1655
1656namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00001657class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1658public:
Mike Stump11289f42009-09-09 15:08:12 +00001659 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman2857ccb2009-07-01 03:36:11 +00001660 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1661 Int64Type = SignedLongLong;
1662 }
1663};
1664} // end anonymous namespace
1665
1666namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00001667class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1668public:
Mike Stump11289f42009-09-09 15:08:12 +00001669 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman245f2292009-07-05 22:31:18 +00001670 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1671 IntMaxType = SignedLongLong;
1672 UIntMaxType = UnsignedLongLong;
1673 Int64Type = SignedLongLong;
1674 }
1675};
1676} // end anonymous namespace
1677
1678namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001679class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001680 // Possible FPU choices.
1681 enum FPUMode {
1682 NoFPU,
1683 VFP2FPU,
1684 VFP3FPU,
1685 NeonFPU
1686 };
1687
1688 static bool FPUModeIsVFP(FPUMode Mode) {
1689 return Mode >= VFP2FPU && Mode <= NeonFPU;
1690 }
1691
1692 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1693 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001694
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001695 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001696
1697 unsigned FPU : 3;
1698
Daniel Dunbar893d4752009-12-19 04:15:38 +00001699 unsigned IsThumb : 1;
1700
1701 // Initialized via features.
1702 unsigned SoftFloat : 1;
1703 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001704
Chris Lattner5cc15e02010-03-03 19:03:45 +00001705 static const Builtin::Info BuiltinInfo[];
1706
Chris Lattner17df24e2008-04-21 18:56:49 +00001707public:
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001708 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001709 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001710 {
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001711 SizeType = UnsignedInt;
1712 PtrDiffType = SignedInt;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001713
Chris Lattner1a8f3942010-04-23 16:29:58 +00001714 // {} in inline assembly are neon specifiers, not assembly variant
1715 // specifiers.
1716 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001717
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001718 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00001719 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00001720 if (IsThumb) {
1721 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1722 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001723 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001724 } else {
1725 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1726 "i64:64:64-f32:32:32-f64:64:64-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001727 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001728 }
John McCall86353412010-08-21 22:46:04 +00001729
1730 // ARM targets default to using the ARM C++ ABI.
1731 CXXABI = CXXABI_ARM;
Eli Friedmanb5366062008-05-20 14:21:01 +00001732 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001733 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001734 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00001735 ABI = Name;
1736
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001737 // The defaults (above) are for AAPCS, check if we need to change them.
1738 //
1739 // FIXME: We need support for -meabi... we could just mangle it into the
1740 // name.
1741 if (Name == "apcs-gnu") {
Daniel Dunbar377dc2f2010-01-27 20:23:08 +00001742 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001743 SizeType = UnsignedLong;
1744
Daniel Dunbarf8125062010-04-22 16:14:54 +00001745 // Do not respect the alignment of bit-field types when laying out
1746 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1747 UseBitFieldTypeAlignment = false;
1748
Daniel Dunbar03184792009-09-22 21:44:58 +00001749 if (IsThumb) {
1750 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1751 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001752 "v64:64:64-v128:128:128-a0:0:32-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001753 } else {
1754 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1755 "i64:32:32-f32:32:32-f64:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001756 "v64:64:64-v128:128:128-a0:0:64-n32");
Daniel Dunbar03184792009-09-22 21:44:58 +00001757 }
1758
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00001759 // FIXME: Override "preferred align" for double and long long.
1760 } else if (Name == "aapcs") {
1761 // FIXME: Enumerated types are variable width in straight AAPCS.
1762 } else if (Name == "aapcs-linux") {
1763 ;
1764 } else
1765 return false;
1766
1767 return true;
1768 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001769
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001770 void getDefaultFeatures(const std::string &CPU,
1771 llvm::StringMap<bool> &Features) const {
1772 // FIXME: This should not be here.
1773 Features["vfp2"] = false;
1774 Features["vfp3"] = false;
1775 Features["neon"] = false;
1776
1777 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1778 Features["vfp2"] = true;
1779 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1780 Features["neon"] = true;
1781 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001782
Daniel Dunbar893d4752009-12-19 04:15:38 +00001783 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1784 const std::string &Name,
1785 bool Enabled) const {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001786 if (Name == "soft-float" || Name == "soft-float-abi") {
1787 Features[Name] = Enabled;
1788 } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1789 // These effectively are a single option, reset them when any is enabled.
1790 if (Enabled)
1791 Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1792 Features[Name] = Enabled;
1793 } else
Daniel Dunbar893d4752009-12-19 04:15:38 +00001794 return false;
1795
Daniel Dunbar893d4752009-12-19 04:15:38 +00001796 return true;
1797 }
1798
1799 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001800 FPU = NoFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00001801 SoftFloat = SoftFloatABI = false;
1802 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1803 if (Features[i] == "+soft-float")
1804 SoftFloat = true;
1805 else if (Features[i] == "+soft-float-abi")
1806 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001807 else if (Features[i] == "+vfp2")
1808 FPU = VFP2FPU;
1809 else if (Features[i] == "+vfp3")
1810 FPU = VFP3FPU;
1811 else if (Features[i] == "+neon")
1812 FPU = NeonFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00001813 }
1814
1815 // Remove front-end specific options which the backend handles differently.
1816 std::vector<std::string>::iterator it;
1817 it = std::find(Features.begin(), Features.end(), "+soft-float");
1818 if (it != Features.end())
1819 Features.erase(it);
1820 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
1821 if (it != Features.end())
1822 Features.erase(it);
1823 }
1824
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001825 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
1826 return llvm::StringSwitch<const char*>(Name)
1827 .Cases("arm8", "arm810", "4")
1828 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
1829 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
1830 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
1831 .Case("ep9312", "4T")
1832 .Cases("arm10tdmi", "arm1020t", "5T")
1833 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
1834 .Case("arm926ej-s", "5TEJ")
1835 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
1836 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001837 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001838 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001839 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001840 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1841 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson44acad82011-01-06 16:57:20 +00001842 .Case("cortex-m3", "7M")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001843 .Default(0);
1844 }
1845 virtual bool setCPU(const std::string &Name) {
1846 if (!getCPUDefineSuffix(Name))
1847 return false;
1848
1849 CPU = Name;
1850 return true;
1851 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001852 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001853 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001854 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001855 Builder.defineMacro("__arm");
1856 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001857
Chris Lattnerecd49032009-03-02 22:27:17 +00001858 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001859 Builder.defineMacro("__ARMEL__");
1860 Builder.defineMacro("__LITTLE_ENDIAN__");
1861 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001862
1863 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001864 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001865
Mike Stump9d54bd72009-04-08 02:07:04 +00001866 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001867
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001868 // FIXME: It's more complicated than this and we don't really support
1869 // interworking.
1870 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001871 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001872
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001873 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001874 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001875
Daniel Dunbar893d4752009-12-19 04:15:38 +00001876 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001877 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00001878
1879 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001880 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001881
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001882 bool IsThumb2 = IsThumb && (CPUArch == "6T2" || CPUArch.startswith("7"));
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001883 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001884 Builder.defineMacro("__THUMBEL__");
1885 Builder.defineMacro("__thumb__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001886 if (IsThumb2)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001887 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00001888 }
1889
1890 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001891 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001892
1893 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001894 Builder.defineMacro("__VFP_FP__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00001895
1896 // This only gets set when Neon instructions are actually available, unlike
1897 // the VFP define, hence the soft float and arch check. This is subtly
1898 // different from gcc, we follow the intent which was that it should be set
1899 // when Neon instructions are actually available.
1900 if (FPU == NeonFPU && !SoftFloat && IsThumb2)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001901 Builder.defineMacro("__ARM_NEON__");
Chris Lattner17df24e2008-04-21 18:56:49 +00001902 }
1903 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1904 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00001905 Records = BuiltinInfo;
1906 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00001907 }
1908 virtual const char *getVAListDeclaration() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001909 return "typedef char* __builtin_va_list;";
Chris Lattner17df24e2008-04-21 18:56:49 +00001910 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001911 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001912 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001913 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001914 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00001915 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00001916 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001917 // FIXME: Check if this is complete
Anders Carlsson58436352009-02-28 17:11:49 +00001918 switch (*Name) {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001919 default:
Nate Begeman2908fa02008-04-22 05:03:19 +00001920 case 'l': // r0-r7
1921 case 'h': // r8-r15
1922 case 'w': // VFP Floating point register single precision
1923 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00001924 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00001925 return true;
1926 }
Chris Lattner17df24e2008-04-21 18:56:49 +00001927 return false;
1928 }
1929 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00001930 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00001931 return "";
1932 }
1933};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001934
1935const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001936 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001937 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001938 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
1939
1940 // Float registers
1941 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1942 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1943 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001944 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00001945
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001946 // Double registers
1947 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
1948 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00001949 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
1950 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001951
1952 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00001953 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1954 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001955};
1956
1957void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00001958 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001959 Names = GCCRegNames;
1960 NumNames = llvm::array_lengthof(GCCRegNames);
1961}
1962
1963const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001964 { { "a1" }, "r0" },
1965 { { "a2" }, "r1" },
1966 { { "a3" }, "r2" },
1967 { { "a4" }, "r3" },
1968 { { "v1" }, "r4" },
1969 { { "v2" }, "r5" },
1970 { { "v3" }, "r6" },
1971 { { "v4" }, "r7" },
1972 { { "v5" }, "r8" },
1973 { { "v6", "rfp" }, "r9" },
1974 { { "sl" }, "r10" },
1975 { { "fp" }, "r11" },
1976 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00001977 { { "r13" }, "sp" },
1978 { { "r14" }, "lr" },
1979 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00001980 // The S, D and Q registers overlap, but aren't really aliases; we
1981 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001982};
1983
1984void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1985 unsigned &NumAliases) const {
1986 Aliases = GCCRegAliases;
1987 NumAliases = llvm::array_lengthof(GCCRegAliases);
1988}
Chris Lattner5cc15e02010-03-03 19:03:45 +00001989
1990const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001991#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
1992#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1993 ALL_LANGUAGES, false },
Chris Lattner5cc15e02010-03-03 19:03:45 +00001994#include "clang/Basic/BuiltinsARM.def"
1995};
Chris Lattner17df24e2008-04-21 18:56:49 +00001996} // end anonymous namespace.
1997
Eli Friedmanf05b7722008-08-20 07:44:10 +00001998
1999namespace {
Mike Stump11289f42009-09-09 15:08:12 +00002000class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002001 public DarwinTargetInfo<ARMTargetInfo> {
2002protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00002003 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002004 MacroBuilder &Builder) const {
Daniel Dunbard86666f2010-01-26 01:44:04 +00002005 getDarwinDefines(Builder, Opts, Triple);
Eli Friedmand88c8a12009-04-19 21:38:35 +00002006 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002007
Torok Edwinb2b37c62009-06-30 17:10:35 +00002008public:
Mike Stump11289f42009-09-09 15:08:12 +00002009 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00002010 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2011 HasAlignMac68kSupport = true;
2012 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00002013};
2014} // end anonymous namespace.
2015
Chris Lattner5ba61f02006-10-14 07:39:34 +00002016namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002017class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00002018 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2019 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002020 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00002021public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002022 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2023 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +00002024 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 +00002025 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002026 }
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002027 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2028 const std::string &Name,
2029 bool Enabled) const {
2030 if (Name == "soft-float")
2031 Features[Name] = Enabled;
2032 else
2033 return false;
2034
2035 return true;
2036 }
2037 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2038 SoftFloat = false;
2039 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2040 if (Features[i] == "+soft-float")
2041 SoftFloat = true;
2042 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002043 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002044 MacroBuilder &Builder) const {
2045 DefineStd(Builder, "sparc", Opts);
2046 Builder.defineMacro("__sparcv8");
2047 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002048
2049 if (SoftFloat)
2050 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00002051 }
2052 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2053 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002054 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00002055 }
2056 virtual const char *getVAListDeclaration() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002057 return "typedef void* __builtin_va_list;";
Gabor Greif49991682008-02-21 16:29:08 +00002058 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002059 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002060 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002061 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002062 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00002063 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00002064 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002065 // FIXME: Implement!
2066 return false;
Gabor Greif49991682008-02-21 16:29:08 +00002067 }
2068 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002069 // FIXME: Implement!
2070 return "";
Gabor Greif49991682008-02-21 16:29:08 +00002071 }
2072};
2073
Chris Lattner9b415d62009-01-27 01:58:38 +00002074const char * const SparcV8TargetInfo::GCCRegNames[] = {
2075 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2076 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2077 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2078 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2079};
2080
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002081void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00002082 unsigned &NumNames) const {
2083 Names = GCCRegNames;
2084 NumNames = llvm::array_lengthof(GCCRegNames);
2085}
2086
2087const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002088 { { "g0" }, "r0" },
2089 { { "g1" }, "r1" },
2090 { { "g2" }, "r2" },
2091 { { "g3" }, "r3" },
2092 { { "g4" }, "r4" },
2093 { { "g5" }, "r5" },
2094 { { "g6" }, "r6" },
2095 { { "g7" }, "r7" },
2096 { { "o0" }, "r8" },
2097 { { "o1" }, "r9" },
2098 { { "o2" }, "r10" },
2099 { { "o3" }, "r11" },
2100 { { "o4" }, "r12" },
2101 { { "o5" }, "r13" },
2102 { { "o6", "sp" }, "r14" },
2103 { { "o7" }, "r15" },
2104 { { "l0" }, "r16" },
2105 { { "l1" }, "r17" },
2106 { { "l2" }, "r18" },
2107 { { "l3" }, "r19" },
2108 { { "l4" }, "r20" },
2109 { { "l5" }, "r21" },
2110 { { "l6" }, "r22" },
2111 { { "l7" }, "r23" },
2112 { { "i0" }, "r24" },
2113 { { "i1" }, "r25" },
2114 { { "i2" }, "r26" },
2115 { { "i3" }, "r27" },
2116 { { "i4" }, "r28" },
2117 { { "i5" }, "r29" },
2118 { { "i6", "fp" }, "r30" },
2119 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00002120};
2121
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002122void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00002123 unsigned &NumAliases) const {
2124 Aliases = GCCRegAliases;
2125 NumAliases = llvm::array_lengthof(GCCRegAliases);
2126}
Gabor Greif49991682008-02-21 16:29:08 +00002127} // end anonymous namespace.
2128
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002129namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002130class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2131public:
2132 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2133 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2134 SizeType = UnsignedInt;
2135 PtrDiffType = SignedInt;
2136 }
2137};
Torok Edwinb2b37c62009-06-30 17:10:35 +00002138class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002139public:
2140 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwinb2b37c62009-06-30 17:10:35 +00002141 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00002142 SizeType = UnsignedInt;
2143 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00002144 }
2145};
2146} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00002147
Chris Lattnerb781dc792008-05-08 05:58:21 +00002148namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002149 class MSP430TargetInfo : public TargetInfo {
2150 static const char * const GCCRegNames[];
2151 public:
2152 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2153 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00002154 IntWidth = 16; IntAlign = 16;
2155 LongWidth = 32; LongLongWidth = 64;
2156 LongAlign = LongLongAlign = 16;
2157 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002158 SizeType = UnsignedInt;
2159 IntMaxType = SignedLong;
2160 UIntMaxType = UnsignedLong;
2161 IntPtrType = SignedShort;
2162 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00002163 SigAtomicType = SignedLong;
Anton Korobeynikovd94329a2009-12-19 01:32:37 +00002164 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002165 }
2166 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002167 MacroBuilder &Builder) const {
2168 Builder.defineMacro("MSP430");
2169 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002170 // FIXME: defines for different 'flavours' of MCU
2171 }
2172 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2173 unsigned &NumRecords) const {
2174 // FIXME: Implement.
2175 Records = 0;
2176 NumRecords = 0;
2177 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002178 virtual void getGCCRegNames(const char * const *&Names,
2179 unsigned &NumNames) const;
2180 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2181 unsigned &NumAliases) const {
2182 // No aliases.
2183 Aliases = 0;
2184 NumAliases = 0;
2185 }
2186 virtual bool validateAsmConstraint(const char *&Name,
2187 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00002188 // No target constraints for now.
2189 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002190 }
2191 virtual const char *getClobbers() const {
2192 // FIXME: Is this really right?
2193 return "";
2194 }
2195 virtual const char *getVAListDeclaration() const {
2196 // FIXME: implement
Anton Korobeynikov2f910822009-05-08 18:24:57 +00002197 return "typedef char* __builtin_va_list;";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00002198 }
2199 };
2200
2201 const char * const MSP430TargetInfo::GCCRegNames[] = {
2202 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2203 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2204 };
2205
2206 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2207 unsigned &NumNames) const {
2208 Names = GCCRegNames;
2209 NumNames = llvm::array_lengthof(GCCRegNames);
2210 }
2211}
2212
2213
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002214namespace {
2215 class SystemZTargetInfo : public TargetInfo {
2216 static const char * const GCCRegNames[];
2217 public:
2218 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2219 TLSSupported = false;
2220 IntWidth = IntAlign = 32;
2221 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2222 PointerWidth = PointerAlign = 64;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002223 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2224 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002225 }
2226 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002227 MacroBuilder &Builder) const {
2228 Builder.defineMacro("__s390__");
2229 Builder.defineMacro("__s390x__");
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002230 }
2231 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2232 unsigned &NumRecords) const {
2233 // FIXME: Implement.
2234 Records = 0;
2235 NumRecords = 0;
2236 }
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002237
Anton Korobeynikovb5b703b2009-07-16 20:09:57 +00002238 virtual void getGCCRegNames(const char * const *&Names,
2239 unsigned &NumNames) const;
2240 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2241 unsigned &NumAliases) const {
2242 // No aliases.
2243 Aliases = 0;
2244 NumAliases = 0;
2245 }
2246 virtual bool validateAsmConstraint(const char *&Name,
2247 TargetInfo::ConstraintInfo &info) const {
2248 // FIXME: implement
2249 return true;
2250 }
2251 virtual const char *getClobbers() const {
2252 // FIXME: Is this really right?
2253 return "";
2254 }
2255 virtual const char *getVAListDeclaration() const {
2256 // FIXME: implement
2257 return "typedef char* __builtin_va_list;";
2258 }
2259 };
2260
2261 const char * const SystemZTargetInfo::GCCRegNames[] = {
2262 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2263 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2264 };
2265
2266 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2267 unsigned &NumNames) const {
2268 Names = GCCRegNames;
2269 NumNames = llvm::array_lengthof(GCCRegNames);
2270 }
2271}
2272
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002273namespace {
2274 class BlackfinTargetInfo : public TargetInfo {
2275 static const char * const GCCRegNames[];
2276 public:
2277 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2278 TLSSupported = false;
2279 DoubleAlign = 32;
2280 LongLongAlign = 32;
2281 LongDoubleAlign = 32;
Chris Lattner5c67237f2009-11-07 18:59:41 +00002282 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002283 }
2284
2285 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002286 MacroBuilder &Builder) const {
2287 DefineStd(Builder, "bfin", Opts);
2288 DefineStd(Builder, "BFIN", Opts);
2289 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002290 // FIXME: This one is really dependent on -mcpu
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002291 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002292 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2293 }
2294
2295 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2296 unsigned &NumRecords) const {
2297 // FIXME: Implement.
2298 Records = 0;
2299 NumRecords = 0;
2300 }
2301
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002302 virtual void getGCCRegNames(const char * const *&Names,
2303 unsigned &NumNames) const;
2304
2305 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2306 unsigned &NumAliases) const {
2307 // No aliases.
2308 Aliases = 0;
2309 NumAliases = 0;
2310 }
2311
2312 virtual bool validateAsmConstraint(const char *&Name,
2313 TargetInfo::ConstraintInfo &Info) const {
2314 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2315 Info.setAllowsRegister();
2316 return true;
2317 }
2318 return false;
2319 }
2320
2321 virtual const char *getClobbers() const {
2322 return "";
2323 }
2324
2325 virtual const char *getVAListDeclaration() const {
2326 return "typedef char* __builtin_va_list;";
2327 }
2328 };
2329
2330 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2331 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2332 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2333 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2334 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2335 "a0", "a1", "cc",
2336 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2337 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2338 };
2339
2340 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2341 unsigned &NumNames) const {
2342 Names = GCCRegNames;
2343 NumNames = llvm::array_lengthof(GCCRegNames);
2344 }
2345}
2346
Eli Friedmana9c3d712009-08-19 20:47:07 +00002347namespace {
2348
Mike Stump11289f42009-09-09 15:08:12 +00002349 // LLVM and Clang cannot be used directly to output native binaries for
2350 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00002351 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00002352 //
2353 // TCE uses the llvm bitcode as input and uses it for generating customized
2354 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00002355 // publicly available in http://tce.cs.tut.fi
2356
2357 class TCETargetInfo : public TargetInfo{
2358 public:
2359 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2360 TLSSupported = false;
2361 IntWidth = 32;
2362 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00002363 PointerWidth = 32;
2364 IntAlign = 32;
2365 LongAlign = LongLongAlign = 32;
2366 PointerAlign = 32;
2367 SizeType = UnsignedInt;
2368 IntMaxType = SignedLong;
2369 UIntMaxType = UnsignedLong;
2370 IntPtrType = SignedInt;
2371 PtrDiffType = SignedInt;
2372 FloatWidth = 32;
2373 FloatAlign = 32;
2374 DoubleWidth = 32;
2375 DoubleAlign = 32;
2376 LongDoubleWidth = 32;
2377 LongDoubleAlign = 32;
2378 FloatFormat = &llvm::APFloat::IEEEsingle;
2379 DoubleFormat = &llvm::APFloat::IEEEsingle;
2380 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner09797542010-03-04 21:07:38 +00002381 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2382 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumidba4ed32011-02-18 08:44:38 +00002383 "f32:32:32-f64:32:32-v64:32:32-"
2384 "v128:32:32-a0:0:32-n32";
Eli Friedmana9c3d712009-08-19 20:47:07 +00002385 }
2386
2387 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002388 MacroBuilder &Builder) const {
2389 DefineStd(Builder, "tce", Opts);
2390 Builder.defineMacro("__TCE__");
2391 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00002392 }
2393 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2394 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00002395 virtual const char *getClobbers() const {
2396 return "";
2397 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002398 virtual const char *getVAListDeclaration() const {
2399 return "typedef void* __builtin_va_list;";
2400 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00002401 virtual void getGCCRegNames(const char * const *&Names,
2402 unsigned &NumNames) const {}
2403 virtual bool validateAsmConstraint(const char *&Name,
2404 TargetInfo::ConstraintInfo &info) const {
2405 return true;
2406 }
2407 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2408 unsigned &NumAliases) const {}
2409 };
2410}
2411
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002412namespace {
2413class MipsTargetInfo : public TargetInfo {
Eric Christopher0b26a612010-03-02 02:41:08 +00002414 std::string ABI, CPU;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002415 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2416 static const char * const GCCRegNames[];
2417public:
Eric Christopher0b26a612010-03-02 02:41:08 +00002418 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002419 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2420 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2421 }
Eric Christopher0b26a612010-03-02 02:41:08 +00002422 virtual const char *getABI() const { return ABI.c_str(); }
2423 virtual bool setABI(const std::string &Name) {
2424
2425 if ((Name == "o32") || (Name == "eabi")) {
2426 ABI = Name;
2427 return true;
2428 } else
2429 return false;
2430 }
2431 virtual bool setCPU(const std::string &Name) {
2432 CPU = Name;
2433 return true;
2434 }
2435 void getDefaultFeatures(const std::string &CPU,
2436 llvm::StringMap<bool> &Features) const {
2437 Features[ABI] = true;
2438 Features[CPU] = true;
2439 }
2440 virtual void getArchDefines(const LangOptions &Opts,
2441 MacroBuilder &Builder) const {
2442 if (ABI == "o32")
2443 Builder.defineMacro("__mips_o32");
2444 else if (ABI == "eabi")
2445 Builder.defineMacro("__mips_eabi");
2446 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002447 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002448 MacroBuilder &Builder) const {
2449 DefineStd(Builder, "mips", Opts);
2450 Builder.defineMacro("_mips");
2451 DefineStd(Builder, "MIPSEB", Opts);
2452 Builder.defineMacro("_MIPSEB");
2453 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002454 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002455 }
2456 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2457 unsigned &NumRecords) const {
2458 // FIXME: Implement!
2459 }
2460 virtual const char *getVAListDeclaration() const {
2461 return "typedef void* __builtin_va_list;";
2462 }
2463 virtual void getGCCRegNames(const char * const *&Names,
2464 unsigned &NumNames) const;
2465 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2466 unsigned &NumAliases) const;
2467 virtual bool validateAsmConstraint(const char *&Name,
2468 TargetInfo::ConstraintInfo &Info) const {
2469 switch (*Name) {
2470 default:
2471 case 'r': // CPU registers.
2472 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2473 case 'y': // Equivalent to "r", backwards compatibility only.
2474 case 'f': // floating-point registers.
2475 Info.setAllowsRegister();
2476 return true;
2477 }
2478 return false;
2479 }
2480
2481 virtual const char *getClobbers() const {
2482 // FIXME: Implement!
2483 return "";
2484 }
2485};
2486
2487const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002488 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002489 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2490 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2491 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2492 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2493 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2494 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2495 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2496 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2497 "$fcc5","$fcc6","$fcc7"
2498};
2499
2500void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2501 unsigned &NumNames) const {
2502 Names = GCCRegNames;
2503 NumNames = llvm::array_lengthof(GCCRegNames);
2504}
2505
2506const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2507 { { "at" }, "$1" },
2508 { { "v0" }, "$2" },
2509 { { "v1" }, "$3" },
2510 { { "a0" }, "$4" },
2511 { { "a1" }, "$5" },
2512 { { "a2" }, "$6" },
2513 { { "a3" }, "$7" },
2514 { { "t0" }, "$8" },
2515 { { "t1" }, "$9" },
2516 { { "t2" }, "$10" },
2517 { { "t3" }, "$11" },
2518 { { "t4" }, "$12" },
2519 { { "t5" }, "$13" },
2520 { { "t6" }, "$14" },
2521 { { "t7" }, "$15" },
2522 { { "s0" }, "$16" },
2523 { { "s1" }, "$17" },
2524 { { "s2" }, "$18" },
2525 { { "s3" }, "$19" },
2526 { { "s4" }, "$20" },
2527 { { "s5" }, "$21" },
2528 { { "s6" }, "$22" },
2529 { { "s7" }, "$23" },
2530 { { "t8" }, "$24" },
2531 { { "t9" }, "$25" },
2532 { { "k0" }, "$26" },
2533 { { "k1" }, "$27" },
2534 { { "gp" }, "$28" },
2535 { { "sp" }, "$29" },
2536 { { "fp" }, "$30" },
2537 { { "ra" }, "$31" }
2538};
2539
2540void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2541 unsigned &NumAliases) const {
2542 Aliases = GCCRegAliases;
2543 NumAliases = llvm::array_lengthof(GCCRegAliases);
2544}
2545} // end anonymous namespace.
2546
2547namespace {
2548class MipselTargetInfo : public MipsTargetInfo {
2549public:
2550 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2551 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2552 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2553 }
2554
2555 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002556 MacroBuilder &Builder) const;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002557};
2558
2559void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002560 MacroBuilder &Builder) const {
2561 DefineStd(Builder, "mips", Opts);
2562 Builder.defineMacro("_mips");
2563 DefineStd(Builder, "MIPSEL", Opts);
2564 Builder.defineMacro("_MIPSEL");
2565 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher0b26a612010-03-02 02:41:08 +00002566 getArchDefines(Opts, Builder);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002567}
2568} // end anonymous namespace.
2569
Chris Lattner5ba61f02006-10-14 07:39:34 +00002570//===----------------------------------------------------------------------===//
2571// Driver code
2572//===----------------------------------------------------------------------===//
2573
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002574static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar52322032009-08-18 05:47:58 +00002575 llvm::Triple Triple(T);
2576 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00002577
Daniel Dunbar52322032009-08-18 05:47:58 +00002578 switch (Triple.getArch()) {
2579 default:
2580 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00002581
Daniel Dunbar52322032009-08-18 05:47:58 +00002582 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00002583 case llvm::Triple::thumb:
Daniel Dunbar52322032009-08-18 05:47:58 +00002584 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00002585 case llvm::Triple::Linux:
2586 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002587 case llvm::Triple::Darwin:
Eli Friedman873f65a2008-08-21 00:13:15 +00002588 return new DarwinARMTargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002589 case llvm::Triple::FreeBSD:
Torok Edwinb2b37c62009-06-30 17:10:35 +00002590 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002591 default:
2592 return new ARMTargetInfo(T);
2593 }
Eli Friedmanb5366062008-05-20 14:21:01 +00002594
Daniel Dunbar52322032009-08-18 05:47:58 +00002595 case llvm::Triple::bfin:
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00002596 return new BlackfinTargetInfo(T);
2597
Daniel Dunbar52322032009-08-18 05:47:58 +00002598 case llvm::Triple::msp430:
2599 return new MSP430TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +00002600
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00002601 case llvm::Triple::mips:
2602 if (os == llvm::Triple::Psp)
2603 return new PSPTargetInfo<MipsTargetInfo>(T);
2604 if (os == llvm::Triple::Linux)
2605 return new LinuxTargetInfo<MipsTargetInfo>(T);
2606 return new MipsTargetInfo(T);
2607
2608 case llvm::Triple::mipsel:
2609 if (os == llvm::Triple::Psp)
2610 return new PSPTargetInfo<MipselTargetInfo>(T);
2611 if (os == llvm::Triple::Linux)
2612 return new LinuxTargetInfo<MipselTargetInfo>(T);
2613 return new MipselTargetInfo(T);
2614
Daniel Dunbar52322032009-08-18 05:47:58 +00002615 case llvm::Triple::ppc:
2616 if (os == llvm::Triple::Darwin)
Roman Divacky965b0b72011-01-06 08:27:10 +00002617 return new DarwinPPC32TargetInfo(T);
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002618 else if (os == llvm::Triple::FreeBSD)
2619 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002620 return new PPC32TargetInfo(T);
2621
2622 case llvm::Triple::ppc64:
2623 if (os == llvm::Triple::Darwin)
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00002624 return new DarwinPPC64TargetInfo(T);
John Thompsone467e192009-11-19 17:18:50 +00002625 else if (os == llvm::Triple::Lv2)
2626 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00002627 else if (os == llvm::Triple::FreeBSD)
2628 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002629 return new PPC64TargetInfo(T);
2630
Chris Lattner5178f562010-03-06 21:21:27 +00002631 case llvm::Triple::mblaze:
2632 return new MBlazeTargetInfo(T);
2633
Daniel Dunbar52322032009-08-18 05:47:58 +00002634 case llvm::Triple::sparc:
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002635 if (os == llvm::Triple::AuroraUX)
2636 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002637 if (os == llvm::Triple::Solaris)
2638 return new SolarisSparcV8TargetInfo(T);
2639 return new SparcV8TargetInfo(T);
2640
John Thompsone467e192009-11-19 17:18:50 +00002641 // FIXME: Need a real SPU target.
2642 case llvm::Triple::cellspu:
2643 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2644
Daniel Dunbar52322032009-08-18 05:47:58 +00002645 case llvm::Triple::systemz:
2646 return new SystemZTargetInfo(T);
2647
Eli Friedmana9c3d712009-08-19 20:47:07 +00002648 case llvm::Triple::tce:
2649 return new TCETargetInfo(T);
2650
Daniel Dunbar52322032009-08-18 05:47:58 +00002651 case llvm::Triple::x86:
2652 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002653 case llvm::Triple::AuroraUX:
2654 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002655 case llvm::Triple::Darwin:
2656 return new DarwinI386TargetInfo(T);
2657 case llvm::Triple::Linux:
2658 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2659 case llvm::Triple::DragonFly:
2660 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2661 case llvm::Triple::NetBSD:
2662 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2663 case llvm::Triple::OpenBSD:
2664 return new OpenBSDI386TargetInfo(T);
2665 case llvm::Triple::FreeBSD:
2666 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner3e2ee142010-07-07 16:01:42 +00002667 case llvm::Triple::Minix:
2668 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002669 case llvm::Triple::Solaris:
2670 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2671 case llvm::Triple::Cygwin:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002672 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002673 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002674 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002675 case llvm::Triple::Win32:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002676 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattnerb986aba2010-04-11 19:29:39 +00002677 case llvm::Triple::Haiku:
2678 return new HaikuX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002679 default:
2680 return new X86_32TargetInfo(T);
2681 }
2682
2683 case llvm::Triple::x86_64:
2684 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00002685 case llvm::Triple::AuroraUX:
2686 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002687 case llvm::Triple::Darwin:
2688 return new DarwinX86_64TargetInfo(T);
2689 case llvm::Triple::Linux:
2690 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner002ba6b2010-01-09 05:41:14 +00002691 case llvm::Triple::DragonFly:
2692 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002693 case llvm::Triple::NetBSD:
2694 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2695 case llvm::Triple::OpenBSD:
2696 return new OpenBSDX86_64TargetInfo(T);
2697 case llvm::Triple::FreeBSD:
2698 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2699 case llvm::Triple::Solaris:
2700 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00002701 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002702 return new MinGWX86_64TargetInfo(T);
2703 case llvm::Triple::Win32: // This is what Triple.h supports now.
Douglas Gregorde7a3572011-02-01 15:06:18 +00002704 if (Triple.getEnvironment() == llvm::Triple::MachO)
2705 return new DarwinX86_64TargetInfo(T);
2706 else
2707 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00002708 default:
2709 return new X86_64TargetInfo(T);
2710 }
2711 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002712}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002713
2714/// CreateTargetInfo - Return the target info object for the specified target
2715/// triple.
2716TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002717 TargetOptions &Opts) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002718 llvm::Triple Triple(Opts.Triple);
2719
2720 // Construct the target
2721 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2722 if (!Target) {
2723 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2724 return 0;
2725 }
2726
Daniel Dunbaracde99e2009-12-18 18:42:37 +00002727 // Set the target CPU if specified.
2728 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2729 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2730 return 0;
2731 }
2732
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002733 // Set the target ABI if specified.
2734 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2735 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2736 return 0;
2737 }
2738
Charles Davis95a546e2010-06-11 01:06:47 +00002739 // Set the target C++ ABI.
John McCall86353412010-08-21 22:46:04 +00002740 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis95a546e2010-06-11 01:06:47 +00002741 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2742 return 0;
2743 }
2744
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002745 // Compute the default target features, we need the target to handle this
2746 // because features may have dependencies on one another.
2747 llvm::StringMap<bool> Features;
2748 Target->getDefaultFeatures(Opts.CPU, Features);
2749
2750 // Apply the user specified deltas.
2751 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2752 ie = Opts.Features.end(); it != ie; ++it) {
2753 const char *Name = it->c_str();
2754
2755 // Apply the feature via the target.
2756 if ((Name[0] != '-' && Name[0] != '+') ||
2757 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2758 Diags.Report(diag::err_target_invalid_feature) << Name;
2759 return 0;
2760 }
2761 }
2762
2763 // Add the features to the compile options.
2764 //
2765 // FIXME: If we are completely confident that we have the right set, we only
2766 // need to pass the minuses.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002767 Opts.Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002768 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2769 ie = Features.end(); it != ie; ++it)
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002770 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2771 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00002772
2773 return Target.take();
2774}