blob: 5d363a49f455b1c3d42f480326ea0e0ec006dcda [file] [log] [blame]
Reid Spencer5f016e22007-07-11 17:01:13 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Reid Spencer5f016e22007-07-11 17:01:13 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikova7c47172009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenekbbced582007-12-12 18:05:32 +000011// target triple.
Reid Spencer5f016e22007-07-11 17:01:13 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencer5f016e22007-07-11 17:01:13 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattner8fc4dfb2008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth103b71c2010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman25531262008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbard58c03f2009-11-15 06:48:46 +000023#include "llvm/ADT/OwningPtr.h"
Daniel Dunbar29a790b2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Daniel Dunbar77659342009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar29a790b2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner4c28b1c2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner797c3c42009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
Dale Johannesen1e592cb2010-10-29 23:24:33 +000029#include "llvm/Type.h"
Benjamin Kramer48725082010-01-09 18:20:57 +000030#include <algorithm>
Reid Spencer5f016e22007-07-11 17:01:13 +000031using namespace clang;
32
Reid Spencer5f016e22007-07-11 17:01:13 +000033//===----------------------------------------------------------------------===//
34// Common code shared among targets.
35//===----------------------------------------------------------------------===//
36
Chris Lattnerca45cff2009-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 Kramera9992772010-01-09 17:55:51 +000040static void DefineStd(MacroBuilder &Builder, llvm::StringRef MacroName,
Chris Lattnerca45cff2009-03-20 16:06:38 +000041 const LangOptions &Opts) {
42 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000043
Chris Lattnerca45cff2009-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 Kramera9992772010-01-09 17:55:51 +000047 Builder.defineMacro(MacroName);
Anton Korobeynikova7c47172009-05-03 13:42:53 +000048
Chris Lattnerca45cff2009-03-20 16:06:38 +000049 // Define __unix.
Benjamin Kramera9992772010-01-09 17:55:51 +000050 Builder.defineMacro("__" + MacroName);
Anton Korobeynikova7c47172009-05-03 13:42:53 +000051
Chris Lattnerca45cff2009-03-20 16:06:38 +000052 // Define __unix__.
Benjamin Kramera9992772010-01-09 17:55:51 +000053 Builder.defineMacro("__" + MacroName + "__");
Chris Lattnerca45cff2009-03-20 16:06:38 +000054}
55
Chris Lattnerd29b6302008-10-05 21:50:58 +000056//===----------------------------------------------------------------------===//
57// Defines specific to certain operating systems.
58//===----------------------------------------------------------------------===//
Chris Lattner797c3c42009-08-10 19:03:04 +000059
Torok Edwin5f6c1942009-06-30 17:10:35 +000060namespace {
Douglas Gregora3844922009-07-01 15:12:53 +000061template<typename TgtInfo>
62class OSTargetInfo : public TgtInfo {
Torok Edwin5f6c1942009-06-30 17:10:35 +000063protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +000064 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +000065 MacroBuilder &Builder) const=0;
Torok Edwin5f6c1942009-06-30 17:10:35 +000066public:
Douglas Gregora3844922009-07-01 15:12:53 +000067 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Torok Edwin5f6c1942009-06-30 17:10:35 +000068 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +000069 MacroBuilder &Builder) const {
70 TgtInfo::getTargetDefines(Opts, Builder);
71 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwinb0a5b242009-06-30 17:00:25 +000072 }
Torok Edwin5f6c1942009-06-30 17:10:35 +000073
74};
Chris Lattner4c28b1c2009-08-12 06:24:27 +000075} // end anonymous namespace
Torok Edwinb0a5b242009-06-30 17:00:25 +000076
Chris Lattner797c3c42009-08-10 19:03:04 +000077
Daniel Dunbar21ae3192010-01-26 01:44:04 +000078static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000079 const llvm::Triple &Triple,
80 llvm::StringRef &PlatformName,
81 VersionTuple &PlatformMinVersion) {
Benjamin Kramera9992772010-01-09 17:55:51 +000082 Builder.defineMacro("__APPLE_CC__", "5621");
83 Builder.defineMacro("__APPLE__");
84 Builder.defineMacro("__MACH__");
85 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000086
Chris Lattner10d24272009-04-07 16:50:40 +000087 // __weak is always defined, for use in blocks and with objc pointers.
Benjamin Kramera9992772010-01-09 17:55:51 +000088 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000089
Chris Lattner10d24272009-04-07 16:50:40 +000090 // Darwin defines __strong even in C mode (just to nothing).
91 if (!Opts.ObjC1 || Opts.getGCMode() == LangOptions::NonGC)
Benjamin Kramera9992772010-01-09 17:55:51 +000092 Builder.defineMacro("__strong", "");
Chris Lattner10d24272009-04-07 16:50:40 +000093 else
Benjamin Kramera9992772010-01-09 17:55:51 +000094 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
Eli Friedman2de4fee2009-06-04 23:00:29 +000095
96 if (Opts.Static)
Benjamin Kramera9992772010-01-09 17:55:51 +000097 Builder.defineMacro("__STATIC__");
Eli Friedman2de4fee2009-06-04 23:00:29 +000098 else
Benjamin Kramera9992772010-01-09 17:55:51 +000099 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000100
101 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000102 Builder.defineMacro("_REENTRANT");
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000103
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000104 // Get the platform type and version number from the triple.
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000105 unsigned Maj, Min, Rev;
Mike Stump1eb44332009-09-09 15:08:12 +0000106
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000107 // If no version was given, default to to 10.4.0, for simplifying tests.
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000108 if (Triple.getOSName() == "darwin" || Triple.getOSName() == "osx") {
109 PlatformName = "macosx";
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000110 Min = Rev = 0;
111 Maj = 8;
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000112 } else {
113 // Otherwise, honor all three triple forms ("-darwinNNN[-iphoneos]",
114 // "-osxNNN", and "-iosNNN").
115
116 if (Triple.getOS() == llvm::Triple::Darwin) {
117 // For historical reasons that make little sense, the version passed here
118 // is the "darwin" version, which drops the 10 and offsets by 4.
119 Triple.getOSVersion(Maj, Min, Rev);
120
121 if (Triple.getEnvironmentName() == "iphoneos") {
122 PlatformName = "ios";
123 } else {
124 assert(Rev == 0 && "invalid triple, unexpected micro version!");
125 PlatformName = "macosx";
126 Rev = Min;
127 Min = Maj - 4;
128 Maj = 10;
129 }
130 } else if (Triple.getOS() == llvm::Triple::OSX) {
131 Triple.getOSVersion(Maj, Min, Rev);
132 PlatformName = "macosx";
133 } else {
134 assert(Triple.getOS() == llvm::Triple::IOS && "unexpected triple!");
135 Triple.getOSVersion(Maj, Min, Rev);
136 PlatformName = "ios";
137 }
138 }
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000139
140 // Set the appropriate OS version define.
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000141 if (PlatformName == "ios") {
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000142 assert(Maj < 10 && Min < 99 && Rev < 99 && "Invalid version!");
143 char Str[6];
144 Str[0] = '0' + Maj;
145 Str[1] = '0' + (Min / 10);
146 Str[2] = '0' + (Min % 10);
147 Str[3] = '0' + (Rev / 10);
148 Str[4] = '0' + (Rev % 10);
149 Str[5] = '\0';
150 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
151 } else {
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000152 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
153 assert(Maj < 99 && Min < 10 && Rev < 10 && "Invalid version!");
154 char Str[5];
155 Str[0] = '0' + (Maj / 10);
156 Str[1] = '0' + (Maj % 10);
157 Str[2] = '0' + Min;
158 Str[3] = '0' + Rev;
159 Str[4] = '\0';
160 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000161 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000162
163 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman618234a2008-08-20 02:34:37 +0000164}
Reid Spencer5f016e22007-07-11 17:01:13 +0000165
Chris Lattner797c3c42009-08-10 19:03:04 +0000166namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000167template<typename Target>
168class DarwinTargetInfo : public OSTargetInfo<Target> {
169protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000170 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000171 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000172 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
173 this->PlatformMinVersion);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000174 }
Mike Stump1eb44332009-09-09 15:08:12 +0000175
Torok Edwin5f6c1942009-06-30 17:10:35 +0000176public:
177 DarwinTargetInfo(const std::string& triple) :
178 OSTargetInfo<Target>(triple) {
Eric Christopherdd53ec92010-06-25 19:04:52 +0000179 this->TLSSupported = llvm::Triple(triple).getDarwinMajorNumber() > 10;
Daniel Dunbare177d3b2011-02-21 23:12:51 +0000180 this->MCountName = "\01mcount";
Torok Edwin5f6c1942009-06-30 17:10:35 +0000181 }
182
Anders Carlssonf959fb52010-01-30 18:33:31 +0000183 virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
Chris Lattner797c3c42009-08-10 19:03:04 +0000184 // Let MCSectionMachO validate this.
185 llvm::StringRef Segment, Section;
186 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000187 bool HasTAA;
Chris Lattner797c3c42009-08-10 19:03:04 +0000188 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000189 TAA, HasTAA, StubSize);
Chris Lattner797c3c42009-08-10 19:03:04 +0000190 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000191
Anders Carlsson18af3682010-06-08 22:47:50 +0000192 virtual const char *getStaticInitSectionSpecifier() const {
193 // FIXME: We should return 0 when building kexts.
194 return "__TEXT,__StaticInit,regular,pure_instructions";
195 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000196
Torok Edwin5f6c1942009-06-30 17:10:35 +0000197};
198
Chris Lattner797c3c42009-08-10 19:03:04 +0000199
Torok Edwin5f6c1942009-06-30 17:10:35 +0000200// DragonFlyBSD Target
201template<typename Target>
202class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
203protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000204 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000205 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000206 // DragonFly defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000207 Builder.defineMacro("__DragonFly__");
208 Builder.defineMacro("__DragonFly_cc_version", "100001");
209 Builder.defineMacro("__ELF__");
210 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
211 Builder.defineMacro("__tune_i386__");
212 DefineStd(Builder, "unix", Opts);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000213 }
214public:
Mike Stump1eb44332009-09-09 15:08:12 +0000215 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000216 : OSTargetInfo<Target>(triple) {}
217};
218
219// FreeBSD Target
220template<typename Target>
221class FreeBSDTargetInfo : public OSTargetInfo<Target> {
222protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000223 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000224 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000225 // FreeBSD defines; list based off of gcc output
226
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000227 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramer3bb65302010-01-30 19:55:01 +0000228 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000229
Benjamin Kramer3bb65302010-01-30 19:55:01 +0000230 Builder.defineMacro("__FreeBSD__", Release);
231 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramera9992772010-01-09 17:55:51 +0000232 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
233 DefineStd(Builder, "unix", Opts);
234 Builder.defineMacro("__ELF__");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000235 }
236public:
Mike Stump1eb44332009-09-09 15:08:12 +0000237 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands1e90faf2009-07-08 13:55:08 +0000238 : OSTargetInfo<Target>(triple) {
239 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000240
241 llvm::Triple Triple(triple);
242 switch (Triple.getArch()) {
243 default:
244 case llvm::Triple::x86:
245 case llvm::Triple::x86_64:
246 this->MCountName = ".mcount";
247 break;
248 case llvm::Triple::mips:
249 case llvm::Triple::mipsel:
250 case llvm::Triple::ppc:
251 case llvm::Triple::ppc64:
252 this->MCountName = "_mcount";
253 break;
254 case llvm::Triple::arm:
255 this->MCountName = "__mcount";
256 break;
257 }
258
Duncan Sands1e90faf2009-07-08 13:55:08 +0000259 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000260};
261
Chris Lattner38e317d2010-07-07 16:01:42 +0000262// Minix Target
263template<typename Target>
264class MinixTargetInfo : public OSTargetInfo<Target> {
265protected:
266 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
267 MacroBuilder &Builder) const {
268 // Minix defines
269
270 Builder.defineMacro("__minix", "3");
271 Builder.defineMacro("_EM_WSIZE", "4");
272 Builder.defineMacro("_EM_PSIZE", "4");
273 Builder.defineMacro("_EM_SSIZE", "2");
274 Builder.defineMacro("_EM_LSIZE", "4");
275 Builder.defineMacro("_EM_FSIZE", "4");
276 Builder.defineMacro("_EM_DSIZE", "8");
277 DefineStd(Builder, "unix", Opts);
278 }
279public:
280 MinixTargetInfo(const std::string &triple)
281 : OSTargetInfo<Target>(triple) {
282 this->UserLabelPrefix = "";
283 }
284};
285
Torok Edwin5f6c1942009-06-30 17:10:35 +0000286// Linux target
287template<typename Target>
288class LinuxTargetInfo : public OSTargetInfo<Target> {
289protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000290 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000291 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000292 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000293 DefineStd(Builder, "unix", Opts);
294 DefineStd(Builder, "linux", Opts);
295 Builder.defineMacro("__gnu_linux__");
296 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000297 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000298 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000299 if (Opts.CPlusPlus)
300 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000301 }
302public:
Mike Stump1eb44332009-09-09 15:08:12 +0000303 LinuxTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000304 : OSTargetInfo<Target>(triple) {
305 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000306 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000307 }
308};
309
Chris Lattnerb62bb282009-07-13 20:29:08 +0000310// NetBSD Target
311template<typename Target>
312class NetBSDTargetInfo : public OSTargetInfo<Target> {
313protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000314 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000315 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000316 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000317 Builder.defineMacro("__NetBSD__");
318 Builder.defineMacro("__unix__");
319 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000320 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000321 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000322 }
323public:
Mike Stump1eb44332009-09-09 15:08:12 +0000324 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerb62bb282009-07-13 20:29:08 +0000325 : OSTargetInfo<Target>(triple) {
326 this->UserLabelPrefix = "";
327 }
328};
329
Torok Edwin5f6c1942009-06-30 17:10:35 +0000330// OpenBSD Target
331template<typename Target>
332class OpenBSDTargetInfo : public OSTargetInfo<Target> {
333protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000334 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000335 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000336 // OpenBSD defines; list based off of gcc output
337
Benjamin Kramera9992772010-01-09 17:55:51 +0000338 Builder.defineMacro("__OpenBSD__");
339 DefineStd(Builder, "unix", Opts);
340 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000341 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000342 Builder.defineMacro("_POSIX_THREADS");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000343 }
344public:
Mike Stump1eb44332009-09-09 15:08:12 +0000345 OpenBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000346 : OSTargetInfo<Target>(triple) {}
347};
348
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000349// PSP Target
350template<typename Target>
351class PSPTargetInfo : public OSTargetInfo<Target> {
352protected:
353 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000354 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000355 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000356 Builder.defineMacro("PSP");
357 Builder.defineMacro("_PSP");
358 Builder.defineMacro("__psp__");
359 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000360 }
361public:
362 PSPTargetInfo(const std::string& triple)
363 : OSTargetInfo<Target>(triple) {
364 this->UserLabelPrefix = "";
365 }
366};
367
John Thompson3f6918a2009-11-19 17:18:50 +0000368// PS3 PPU Target
369template<typename Target>
370class PS3PPUTargetInfo : public OSTargetInfo<Target> {
371protected:
372 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000373 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000374 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000375 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000376 Builder.defineMacro("__PPU__");
377 Builder.defineMacro("__CELLOS_LV2__");
378 Builder.defineMacro("__ELF__");
379 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000380 Builder.defineMacro("_ARCH_PPC64");
381 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000382 }
383public:
384 PS3PPUTargetInfo(const std::string& triple)
385 : OSTargetInfo<Target>(triple) {
386 this->UserLabelPrefix = "";
John Thompsonec387af2009-12-18 14:21:08 +0000387 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000388 this->IntMaxType = TargetInfo::SignedLongLong;
389 this->UIntMaxType = TargetInfo::UnsignedLongLong;
390 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000391 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000392 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
393 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000394 }
395};
396
397// FIXME: Need a real SPU target.
398// PS3 SPU Target
399template<typename Target>
400class PS3SPUTargetInfo : public OSTargetInfo<Target> {
401protected:
402 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000403 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000404 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000405 Builder.defineMacro("__SPU__");
406 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000407 }
408public:
409 PS3SPUTargetInfo(const std::string& triple)
410 : OSTargetInfo<Target>(triple) {
411 this->UserLabelPrefix = "";
412 }
413};
414
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000415// AuroraUX target
416template<typename Target>
417class AuroraUXTargetInfo : public OSTargetInfo<Target> {
418protected:
419 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000420 MacroBuilder &Builder) const {
421 DefineStd(Builder, "sun", Opts);
422 DefineStd(Builder, "unix", Opts);
423 Builder.defineMacro("__ELF__");
424 Builder.defineMacro("__svr4__");
425 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000426 }
427public:
428 AuroraUXTargetInfo(const std::string& triple)
429 : OSTargetInfo<Target>(triple) {
430 this->UserLabelPrefix = "";
431 this->WCharType = this->SignedLong;
432 // FIXME: WIntType should be SignedLong
433 }
434};
435
Torok Edwin5f6c1942009-06-30 17:10:35 +0000436// Solaris target
437template<typename Target>
438class SolarisTargetInfo : public OSTargetInfo<Target> {
439protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000440 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000441 MacroBuilder &Builder) const {
442 DefineStd(Builder, "sun", Opts);
443 DefineStd(Builder, "unix", Opts);
444 Builder.defineMacro("__ELF__");
445 Builder.defineMacro("__svr4__");
446 Builder.defineMacro("__SVR4");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000447 }
448public:
Mike Stump1eb44332009-09-09 15:08:12 +0000449 SolarisTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000450 : OSTargetInfo<Target>(triple) {
451 this->UserLabelPrefix = "";
452 this->WCharType = this->SignedLong;
453 // FIXME: WIntType should be SignedLong
454 }
455};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000456
457// Windows target
458template<typename Target>
459class WindowsTargetInfo : public OSTargetInfo<Target> {
460protected:
461 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
462 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000463 Builder.defineMacro("_WIN32");
464 }
465 void getVisualStudioDefines(const LangOptions &Opts,
466 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000467 if (Opts.CPlusPlus) {
468 if (Opts.RTTI)
469 Builder.defineMacro("_CPPRTTI");
470
471 if (Opts.Exceptions)
472 Builder.defineMacro("_CPPUNWIND");
473 }
474
475 if (!Opts.CharIsSigned)
476 Builder.defineMacro("_CHAR_UNSIGNED");
477
478 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
479 // but it works for now.
480 if (Opts.POSIXThreads)
481 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000482
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000483 if (Opts.MSCVersion != 0)
484 Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
485
486 if (Opts.Microsoft) {
487 Builder.defineMacro("_MSC_EXTENSIONS");
488
489 if (Opts.CPlusPlus0x) {
490 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
491 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
492 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
493 }
494 }
495
496 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000497 }
498
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000499public:
500 WindowsTargetInfo(const std::string &triple)
501 : OSTargetInfo<Target>(triple) {}
502};
503
Mike Stump1eb44332009-09-09 15:08:12 +0000504} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000505
Chris Lattnerd29b6302008-10-05 21:50:58 +0000506//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000507// Specific target implementations.
508//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000509
Eli Friedmane4277982008-08-20 23:11:40 +0000510namespace {
511// PPC abstract base class
512class PPCTargetInfo : public TargetInfo {
513 static const Builtin::Info BuiltinInfo[];
514 static const char * const GCCRegNames[];
515 static const TargetInfo::GCCRegAlias GCCRegAliases[];
516
517public:
Eli Friedman15b91762009-06-05 07:05:05 +0000518 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
519
Eli Friedmane4277982008-08-20 23:11:40 +0000520 virtual void getTargetBuiltins(const Builtin::Info *&Records,
521 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000522 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000523 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000524 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000525
Chris Lattner33328642009-03-20 15:52:06 +0000526 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000527 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000528
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000529 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000530 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000531 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000532 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000533 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000534 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000535 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000536 default: return false;
537 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000538 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000539 case 'b': // Base register
540 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000541 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000542 break;
543 // FIXME: The following are added to allow parsing.
544 // I just took a guess at what the actions should be.
545 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000546 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000547 case 'v': // Altivec vector register
548 Info.setAllowsRegister();
549 break;
550 case 'w':
551 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000552 case 'd':// VSX vector register to hold vector double data
553 case 'f':// VSX vector register to hold vector float data
554 case 's':// VSX vector register to hold scalar float data
555 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000556 break;
557 default:
558 return false;
559 }
560 Info.setAllowsRegister();
561 Name++; // Skip over 'w'.
562 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000563 case 'h': // `MQ', `CTR', or `LINK' register
564 case 'q': // `MQ' register
565 case 'c': // `CTR' register
566 case 'l': // `LINK' register
567 case 'x': // `CR' register (condition register) number 0
568 case 'y': // `CR' register (condition register)
569 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000570 Info.setAllowsRegister();
571 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000572 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000573 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000574 // (use `L' instead for SImode constants)
575 case 'K': // Unsigned 16-bit constant
576 case 'L': // Signed 16-bit constant shifted left 16 bits
577 case 'M': // Constant larger than 31
578 case 'N': // Exact power of 2
579 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000580 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000581 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000582 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000583 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000584 break;
585 case 'm': // Memory operand. Note that on PowerPC targets, m can
586 // include addresses that update the base register. It
587 // is therefore only safe to use `m' in an asm statement
588 // if that asm statement accesses the operand exactly once.
589 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000590 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000591 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000592 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000593 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000594 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
595 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000596 // register to be updated.
597 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000598 if (Name[1] != 's')
599 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000600 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000601 // include any automodification of the base register. Unlike
602 // `m', this constraint can be used in asm statements that
603 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000604 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000605 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000606 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000607 break;
608 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000609 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000610 case 'Z': // Memory operand that is an indexed or indirect from a
611 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000612 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000613 Info.setAllowsMemory();
614 Info.setAllowsRegister();
615 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000616 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000617 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000618 // register (`p' is preferable for asm statements)
619 case 'S': // Constant suitable as a 64-bit mask operand
620 case 'T': // Constant suitable as a 32-bit mask operand
621 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000622 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000623 // instructions
624 case 'W': // Vector constant that does not require memory
625 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000626 break;
627 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000628 }
John Thompson8e6065a2010-06-24 22:44:13 +0000629 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000630 }
Eli Friedmane4277982008-08-20 23:11:40 +0000631 virtual const char *getClobbers() const {
632 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000633 }
Eli Friedmane4277982008-08-20 23:11:40 +0000634};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000635
Eli Friedmane4277982008-08-20 23:11:40 +0000636const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000637#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
638#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
639 ALL_LANGUAGES, false },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000640#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000641};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000642
643
Chris Lattnerc0f59212009-03-02 22:27:17 +0000644/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
645/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000646void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000647 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000648 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000649 Builder.defineMacro("__ppc__");
650 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000651 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000652 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000653 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000654 Builder.defineMacro("_ARCH_PPC64");
655 Builder.defineMacro("_LP64");
656 Builder.defineMacro("__LP64__");
Chris Lattnere03ae302010-02-16 18:14:57 +0000657 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000658 Builder.defineMacro("__ppc64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000659 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +0000660 Builder.defineMacro("__ppc__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000661 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000662
Chris Lattnerc0f59212009-03-02 22:27:17 +0000663 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +0000664 Builder.defineMacro("_BIG_ENDIAN");
665 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000666
Chris Lattnerc0f59212009-03-02 22:27:17 +0000667 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000668 Builder.defineMacro("__NATURAL_ALIGNMENT__");
669 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000670
Chris Lattnerc0f59212009-03-02 22:27:17 +0000671 // FIXME: Should be controlled by command line option.
Benjamin Kramera9992772010-01-09 17:55:51 +0000672 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000673
John Thompson3f6918a2009-11-19 17:18:50 +0000674 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000675 Builder.defineMacro("__VEC__", "10206");
676 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000677 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000678}
679
Chris Lattner393ff042008-04-21 18:56:49 +0000680
Eli Friedmane4277982008-08-20 23:11:40 +0000681const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +0000682 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
683 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
684 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
685 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
686 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
687 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
688 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
689 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +0000690 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000691 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +0000692 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000693 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
694 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
695 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
696 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +0000697 "vrsave", "vscr",
698 "spe_acc", "spefscr",
699 "sfp"
700};
Reid Spencer5f016e22007-07-11 17:01:13 +0000701
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000702void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000703 unsigned &NumNames) const {
704 Names = GCCRegNames;
705 NumNames = llvm::array_lengthof(GCCRegNames);
706}
Reid Spencer5f016e22007-07-11 17:01:13 +0000707
Eli Friedmane4277982008-08-20 23:11:40 +0000708const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
709 // While some of these aliases do map to different registers
710 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000711 { { "0" }, "r0" },
712 { { "1"}, "r1" },
713 { { "2" }, "r2" },
714 { { "3" }, "r3" },
715 { { "4" }, "r4" },
716 { { "5" }, "r5" },
717 { { "6" }, "r6" },
718 { { "7" }, "r7" },
719 { { "8" }, "r8" },
720 { { "9" }, "r9" },
721 { { "10" }, "r10" },
722 { { "11" }, "r11" },
723 { { "12" }, "r12" },
724 { { "13" }, "r13" },
725 { { "14" }, "r14" },
726 { { "15" }, "r15" },
727 { { "16" }, "r16" },
728 { { "17" }, "r17" },
729 { { "18" }, "r18" },
730 { { "19" }, "r19" },
731 { { "20" }, "r20" },
732 { { "21" }, "r21" },
733 { { "22" }, "r22" },
734 { { "23" }, "r23" },
735 { { "24" }, "r24" },
736 { { "25" }, "r25" },
737 { { "26" }, "r26" },
738 { { "27" }, "r27" },
739 { { "28" }, "r28" },
740 { { "29" }, "r29" },
741 { { "30" }, "r30" },
742 { { "31" }, "r31" },
743 { { "fr0" }, "f0" },
744 { { "fr1" }, "f1" },
745 { { "fr2" }, "f2" },
746 { { "fr3" }, "f3" },
747 { { "fr4" }, "f4" },
748 { { "fr5" }, "f5" },
749 { { "fr6" }, "f6" },
750 { { "fr7" }, "f7" },
751 { { "fr8" }, "f8" },
752 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +0000753 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000754 { { "fr11" }, "f11" },
755 { { "fr12" }, "f12" },
756 { { "fr13" }, "f13" },
757 { { "fr14" }, "f14" },
758 { { "fr15" }, "f15" },
759 { { "fr16" }, "f16" },
760 { { "fr17" }, "f17" },
761 { { "fr18" }, "f18" },
762 { { "fr19" }, "f19" },
763 { { "fr20" }, "f20" },
764 { { "fr21" }, "f21" },
765 { { "fr22" }, "f22" },
766 { { "fr23" }, "f23" },
767 { { "fr24" }, "f24" },
768 { { "fr25" }, "f25" },
769 { { "fr26" }, "f26" },
770 { { "fr27" }, "f27" },
771 { { "fr28" }, "f28" },
772 { { "fr29" }, "f29" },
773 { { "fr30" }, "f30" },
774 { { "fr31" }, "f31" },
775 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +0000776};
777
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000778void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000779 unsigned &NumAliases) const {
780 Aliases = GCCRegAliases;
781 NumAliases = llvm::array_lengthof(GCCRegAliases);
782}
783} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +0000784
785namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000786class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000787public:
Chris Lattnere03ae302010-02-16 18:14:57 +0000788 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +0000789 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +0000790 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +0000791
792 if (getTriple().getOS() == llvm::Triple::FreeBSD)
Roman Divackyc81f2a22011-01-06 08:27:10 +0000793 SizeType = UnsignedInt;
794 }
795
796 virtual const char *getVAListDeclaration() const {
797 // This is the ELF definition, and is overridden by the Darwin sub-target
798 return "typedef struct __va_list_tag {"
799 " unsigned char gpr;"
800 " unsigned char fpr;"
801 " unsigned short reserved;"
802 " void* overflow_arg_area;"
803 " void* reg_save_area;"
804 "} __builtin_va_list[1];";
Eli Friedmaned855cb2008-08-21 00:13:15 +0000805 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000806};
807} // end anonymous namespace.
808
809namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000810class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000811public:
Eli Friedmane4277982008-08-20 23:11:40 +0000812 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000813 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +0000814 IntMaxType = SignedLong;
815 UIntMaxType = UnsignedLong;
816 Int64Type = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000817 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +0000818 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerf291b102008-05-09 06:17:04 +0000819 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000820 virtual const char *getVAListDeclaration() const {
821 return "typedef char* __builtin_va_list;";
822 }
Eli Friedmane4277982008-08-20 23:11:40 +0000823};
824} // end anonymous namespace.
825
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000826
827namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +0000828class DarwinPPC32TargetInfo :
829 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000830public:
Roman Divackyc81f2a22011-01-06 08:27:10 +0000831 DarwinPPC32TargetInfo(const std::string& triple)
832 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000833 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +0000834 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
835 }
836 virtual const char *getVAListDeclaration() const {
837 return "typedef char* __builtin_va_list;";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000838 }
839};
840
841class DarwinPPC64TargetInfo :
842 public DarwinTargetInfo<PPC64TargetInfo> {
843public:
844 DarwinPPC64TargetInfo(const std::string& triple)
845 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
846 HasAlignMac68kSupport = true;
847 }
848};
849} // end anonymous namespace.
850
Reid Spencer5f016e22007-07-11 17:01:13 +0000851namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +0000852// MBlaze abstract base class
853class MBlazeTargetInfo : public TargetInfo {
854 static const char * const GCCRegNames[];
855 static const TargetInfo::GCCRegAlias GCCRegAliases[];
856
857public:
858 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +0000859 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +0000860 }
861
862 virtual void getTargetBuiltins(const Builtin::Info *&Records,
863 unsigned &NumRecords) const {
864 // FIXME: Implement.
865 Records = 0;
866 NumRecords = 0;
867 }
868
869 virtual void getTargetDefines(const LangOptions &Opts,
870 MacroBuilder &Builder) const;
871
872 virtual const char *getVAListDeclaration() const {
873 return "typedef char* __builtin_va_list;";
874 }
875 virtual const char *getTargetPrefix() const {
876 return "mblaze";
877 }
878 virtual void getGCCRegNames(const char * const *&Names,
879 unsigned &NumNames) const;
880 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
881 unsigned &NumAliases) const;
882 virtual bool validateAsmConstraint(const char *&Name,
883 TargetInfo::ConstraintInfo &Info) const {
884 switch (*Name) {
885 default: return false;
886 case 'O': // Zero
887 return true;
888 case 'b': // Base register
889 case 'f': // Floating point register
890 Info.setAllowsRegister();
891 return true;
892 }
893 }
894 virtual const char *getClobbers() const {
895 return "";
896 }
897};
898
899/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
900/// #defines that are not tied to a specific subtarget.
901void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
902 MacroBuilder &Builder) const {
903 // Target identification.
904 Builder.defineMacro("__microblaze__");
905 Builder.defineMacro("_ARCH_MICROBLAZE");
906 Builder.defineMacro("__MICROBLAZE__");
907
908 // Target properties.
909 Builder.defineMacro("_BIG_ENDIAN");
910 Builder.defineMacro("__BIG_ENDIAN__");
911
912 // Subtarget options.
913 Builder.defineMacro("__REGISTER_PREFIX__", "");
914}
915
916
917const char * const MBlazeTargetInfo::GCCRegNames[] = {
918 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
919 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
920 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
921 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
922 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
923 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
924 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
925 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
926 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
927 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
928};
929
930void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
931 unsigned &NumNames) const {
932 Names = GCCRegNames;
933 NumNames = llvm::array_lengthof(GCCRegNames);
934}
935
936const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
937 { {"f0"}, "r0" },
938 { {"f1"}, "r1" },
939 { {"f2"}, "r2" },
940 { {"f3"}, "r3" },
941 { {"f4"}, "r4" },
942 { {"f5"}, "r5" },
943 { {"f6"}, "r6" },
944 { {"f7"}, "r7" },
945 { {"f8"}, "r8" },
946 { {"f9"}, "r9" },
947 { {"f10"}, "r10" },
948 { {"f11"}, "r11" },
949 { {"f12"}, "r12" },
950 { {"f13"}, "r13" },
951 { {"f14"}, "r14" },
952 { {"f15"}, "r15" },
953 { {"f16"}, "r16" },
954 { {"f17"}, "r17" },
955 { {"f18"}, "r18" },
956 { {"f19"}, "r19" },
957 { {"f20"}, "r20" },
958 { {"f21"}, "r21" },
959 { {"f22"}, "r22" },
960 { {"f23"}, "r23" },
961 { {"f24"}, "r24" },
962 { {"f25"}, "r25" },
963 { {"f26"}, "r26" },
964 { {"f27"}, "r27" },
965 { {"f28"}, "r28" },
966 { {"f29"}, "r29" },
967 { {"f30"}, "r30" },
968 { {"f31"}, "r31" },
969};
970
971void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
972 unsigned &NumAliases) const {
973 Aliases = GCCRegAliases;
974 NumAliases = llvm::array_lengthof(GCCRegAliases);
975}
976} // end anonymous namespace.
977
978namespace {
Eli Friedman618234a2008-08-20 02:34:37 +0000979// Namespace for x86 abstract base class
980const Builtin::Info BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000981#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
982#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
983 ALL_LANGUAGES, false },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000984#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +0000985};
Eli Friedman61538a72008-05-20 14:21:01 +0000986
Nuno Lopes2550d702009-12-23 17:49:57 +0000987static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +0000988 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
989 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
990 "argp", "flags", "fspr", "dirflag", "frame",
991 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
992 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
993 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
994 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
995};
996
997const TargetInfo::GCCRegAlias GCCRegAliases[] = {
998 { { "al", "ah", "eax", "rax" }, "ax" },
999 { { "bl", "bh", "ebx", "rbx" }, "bx" },
1000 { { "cl", "ch", "ecx", "rcx" }, "cx" },
1001 { { "dl", "dh", "edx", "rdx" }, "dx" },
1002 { { "esi", "rsi" }, "si" },
1003 { { "edi", "rdi" }, "di" },
1004 { { "esp", "rsp" }, "sp" },
1005 { { "ebp", "rbp" }, "bp" },
1006};
1007
1008// X86 target abstract base class; x86-32 and x86-64 are very close, so
1009// most of the implementation can be shared.
1010class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001011 enum X86SSEEnum {
1012 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
1013 } SSELevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001014 enum AMD3DNowEnum {
1015 NoAMD3DNow, AMD3DNow, AMD3DNowAthlon
1016 } AMD3DNowLevel;
1017
Eric Christophereea12d12010-04-02 23:50:19 +00001018 bool HasAES;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001019 bool HasAVX;
1020
Eli Friedman618234a2008-08-20 02:34:37 +00001021public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001022 X86TargetInfo(const std::string& triple)
Eric Christophereea12d12010-04-02 23:50:19 +00001023 : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow),
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001024 HasAES(false), HasAVX(false) {
Eli Friedman618234a2008-08-20 02:34:37 +00001025 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001026 }
1027 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1028 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001029 Records = BuiltinInfo;
1030 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001031 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001032 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001033 unsigned &NumNames) const {
1034 Names = GCCRegNames;
1035 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001036 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001037 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001038 unsigned &NumAliases) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001039 Aliases = GCCRegAliases;
1040 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001041 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001042 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001043 TargetInfo::ConstraintInfo &info) const;
1044 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001045 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001046 return "~{dirflag},~{fpsr},~{flags}";
1047 }
Chris Lattner33328642009-03-20 15:52:06 +00001048 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001049 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001050 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1051 const std::string &Name,
1052 bool Enabled) const;
Mike Stump1eb44332009-09-09 15:08:12 +00001053 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001054 llvm::StringMap<bool> &Features) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001055 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Reid Spencer5f016e22007-07-11 17:01:13 +00001056};
Chris Lattner3daed522009-03-02 22:20:04 +00001057
Mike Stump1eb44332009-09-09 15:08:12 +00001058void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001059 llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001060 // FIXME: This should not be here.
1061 Features["3dnow"] = false;
1062 Features["3dnowa"] = false;
1063 Features["mmx"] = false;
1064 Features["sse"] = false;
1065 Features["sse2"] = false;
1066 Features["sse3"] = false;
1067 Features["ssse3"] = false;
1068 Features["sse41"] = false;
1069 Features["sse42"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001070 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001071 Features["avx"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001072
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001073 // LLVM does not currently recognize this.
1074 // Features["sse4a"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001075
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001076 // FIXME: This *really* should not be here.
1077
1078 // X86_64 always has SSE2.
1079 if (PointerWidth == 64)
1080 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1081
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001082 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1083 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1084 ;
1085 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1086 setFeatureEnabled(Features, "mmx", true);
1087 else if (CPU == "pentium3")
1088 setFeatureEnabled(Features, "sse", true);
1089 else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64")
1090 setFeatureEnabled(Features, "sse2", true);
1091 else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona")
1092 setFeatureEnabled(Features, "sse3", true);
1093 else if (CPU == "core2")
1094 setFeatureEnabled(Features, "ssse3", true);
1095 else if (CPU == "penryn") {
1096 setFeatureEnabled(Features, "sse4", true);
1097 Features["sse42"] = false;
1098 } else if (CPU == "atom")
1099 setFeatureEnabled(Features, "sse3", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001100 else if (CPU == "corei7") {
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001101 setFeatureEnabled(Features, "sse4", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001102 setFeatureEnabled(Features, "aes", true);
Roman Divackybcaa3b82011-04-05 20:32:44 +00001103 } else if (CPU == "sandybridge") {
1104 setFeatureEnabled(Features, "sse4", true);
1105 setFeatureEnabled(Features, "aes", true);
1106// setFeatureEnabled(Features, "avx", true);
1107 } else if (CPU == "k6" || CPU == "winchip-c6")
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001108 setFeatureEnabled(Features, "mmx", true);
Mike Stump1eb44332009-09-09 15:08:12 +00001109 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001110 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
1111 setFeatureEnabled(Features, "mmx", true);
1112 setFeatureEnabled(Features, "3dnow", true);
1113 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1114 setFeatureEnabled(Features, "sse", true);
1115 setFeatureEnabled(Features, "3dnowa", true);
1116 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1117 CPU == "athlon-fx") {
Mike Stump1eb44332009-09-09 15:08:12 +00001118 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001119 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00001120 } else if (CPU == "k8-sse3") {
1121 setFeatureEnabled(Features, "sse3", true);
1122 setFeatureEnabled(Features, "3dnowa", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001123 } else if (CPU == "c3-2")
1124 setFeatureEnabled(Features, "sse", true);
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001125}
1126
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001127bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump1eb44332009-09-09 15:08:12 +00001128 const std::string &Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001129 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00001130 // FIXME: This *really* should not be here. We need some way of translating
1131 // options into llvm subtarget features.
1132 if (!Features.count(Name) &&
1133 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001134 return false;
1135
1136 if (Enabled) {
1137 if (Name == "mmx")
1138 Features["mmx"] = true;
1139 else if (Name == "sse")
1140 Features["mmx"] = Features["sse"] = true;
1141 else if (Name == "sse2")
1142 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1143 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001144 Features["mmx"] = Features["sse"] = Features["sse2"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001145 Features["sse3"] = true;
1146 else if (Name == "ssse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001147 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001148 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001149 else if (Name == "sse4" || Name == "sse4.2")
Mike Stump1eb44332009-09-09 15:08:12 +00001150 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001151 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001152 else if (Name == "sse4.1")
1153 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1154 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001155 else if (Name == "3dnow")
1156 Features["3dnowa"] = true;
1157 else if (Name == "3dnowa")
1158 Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00001159 else if (Name == "aes")
1160 Features["aes"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001161 else if (Name == "avx")
1162 Features["avx"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001163 } else {
1164 if (Name == "mmx")
Michael J. Spencerb24bac92011-04-17 19:22:03 +00001165 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] =
1166 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001167 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1168 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00001169 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001170 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1171 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00001172 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001173 Features["sse41"] = Features["sse42"] = false;
1174 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001175 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001176 Features["sse42"] = false;
1177 else if (Name == "ssse3")
1178 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencerb24bac92011-04-17 19:22:03 +00001179 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001180 Features["sse41"] = Features["sse42"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00001181 else if (Name == "sse4.2")
1182 Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001183 else if (Name == "3dnow")
1184 Features["3dnow"] = Features["3dnowa"] = false;
1185 else if (Name == "3dnowa")
1186 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001187 else if (Name == "aes")
1188 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001189 else if (Name == "avx")
1190 Features["avx"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001191 }
1192
1193 return true;
1194}
1195
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001196/// HandleTargetOptions - Perform initialization based on the user
1197/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001198void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001199 // Remember the maximum enabled sselevel.
1200 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1201 // Ignore disabled features.
1202 if (Features[i][0] == '-')
1203 continue;
1204
Eric Christophereea12d12010-04-02 23:50:19 +00001205 if (Features[i].substr(1) == "aes") {
1206 HasAES = true;
1207 continue;
1208 }
1209
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001210 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1211 // For now let it be enabled together with other SSE levels.
1212 if (Features[i].substr(1) == "avx") {
1213 HasAVX = true;
1214 continue;
1215 }
1216
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001217 assert(Features[i][0] == '+' && "Invalid target feature!");
1218 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1219 .Case("sse42", SSE42)
1220 .Case("sse41", SSE41)
1221 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00001222 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001223 .Case("sse2", SSE2)
1224 .Case("sse", SSE1)
1225 .Case("mmx", MMX)
1226 .Default(NoMMXSSE);
1227 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001228
1229 AMD3DNowEnum ThreeDNowLevel =
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001230 llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1))
1231 .Case("3dnowa", AMD3DNowAthlon)
1232 .Case("3dnow", AMD3DNow)
1233 .Default(NoAMD3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001234
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001235 AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001236 }
Chris Lattner3daed522009-03-02 22:20:04 +00001237}
Chris Lattnerc0f59212009-03-02 22:27:17 +00001238
1239/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1240/// that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00001241void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001242 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001243 // Target identification.
1244 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001245 Builder.defineMacro("_LP64");
1246 Builder.defineMacro("__LP64__");
1247 Builder.defineMacro("__amd64__");
1248 Builder.defineMacro("__amd64");
1249 Builder.defineMacro("__x86_64");
1250 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00001251 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00001252 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00001253 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001254
Eric Christophereea12d12010-04-02 23:50:19 +00001255 if (HasAES)
1256 Builder.defineMacro("__AES__");
1257
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001258 if (HasAVX)
1259 Builder.defineMacro("__AVX__");
1260
Chris Lattnerc0f59212009-03-02 22:27:17 +00001261 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00001262 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001263
Chris Lattnerc0f59212009-03-02 22:27:17 +00001264 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +00001265 Builder.defineMacro("__nocona");
1266 Builder.defineMacro("__nocona__");
1267 Builder.defineMacro("__tune_nocona__");
1268 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001269
Chris Lattner54175442009-04-19 17:32:33 +00001270 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1271 // functions in glibc header files that use FP Stack inline asm which the
1272 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00001273 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001274
Chris Lattner84f0ea82009-03-02 22:40:39 +00001275 // Each case falls through to the previous one here.
1276 switch (SSELevel) {
1277 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00001278 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001279 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00001280 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001281 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001282 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001283 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001284 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001285 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00001286 Builder.defineMacro("__SSE2__");
1287 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001288 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00001289 Builder.defineMacro("__SSE__");
1290 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001291 case MMX:
Benjamin Kramera9992772010-01-09 17:55:51 +00001292 Builder.defineMacro("__MMX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001293 case NoMMXSSE:
1294 break;
1295 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001296
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001297 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001298 switch (SSELevel) {
Michael J. Spencera764e832010-10-21 08:22:51 +00001299 case SSE42:
1300 case SSE41:
1301 case SSSE3:
1302 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001303 case SSE2:
1304 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1305 break;
1306 case SSE1:
1307 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1308 break;
1309 default:
1310 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1311 }
1312 }
1313
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001314 // Each case falls through to the previous one here.
1315 switch (AMD3DNowLevel) {
1316 case AMD3DNowAthlon:
1317 Builder.defineMacro("__3dNOW_A__");
1318 case AMD3DNow:
1319 Builder.defineMacro("__3dNOW__");
1320 case NoAMD3DNow:
1321 break;
1322 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00001323}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001324
1325
Eli Friedman618234a2008-08-20 02:34:37 +00001326bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001327X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00001328 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001329 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00001330 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00001331 case 'Y': // first letter of a pair:
1332 switch (*(Name+1)) {
1333 default: return false;
1334 case '0': // First SSE register.
1335 case 't': // Any SSE register, when SSE2 is enabled.
1336 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1337 case 'm': // any MMX register, when inter-unit moves enabled.
1338 break; // falls through to setAllowsRegister.
1339 }
Eli Friedman618234a2008-08-20 02:34:37 +00001340 case 'a': // eax.
1341 case 'b': // ebx.
1342 case 'c': // ecx.
1343 case 'd': // edx.
1344 case 'S': // esi.
1345 case 'D': // edi.
1346 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00001347 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00001348 case 't': // top of floating point stack.
1349 case 'u': // second from top of floating point stack.
1350 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00001351 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00001352 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00001353 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00001354 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1355 case 'l': // "Index" registers: any general register that can be used as an
1356 // index in a base+index memory access.
1357 Info.setAllowsRegister();
1358 return true;
1359 case 'C': // SSE floating point constant.
1360 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001361 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001362 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001363 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00001364 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00001365 return true;
1366 }
Dale Johannesen545be512010-08-24 22:33:12 +00001367 return false;
Eli Friedman618234a2008-08-20 02:34:37 +00001368}
1369
Dale Johannesenf6e2c202010-10-29 23:12:32 +00001370
Eli Friedman618234a2008-08-20 02:34:37 +00001371std::string
1372X86TargetInfo::convertConstraint(const char Constraint) const {
1373 switch (Constraint) {
1374 case 'a': return std::string("{ax}");
1375 case 'b': return std::string("{bx}");
1376 case 'c': return std::string("{cx}");
1377 case 'd': return std::string("{dx}");
1378 case 'S': return std::string("{si}");
1379 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00001380 case 'p': // address
1381 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00001382 case 't': // top of floating point stack.
1383 return std::string("{st}");
1384 case 'u': // second from top of floating point stack.
1385 return std::string("{st(1)}"); // second from top of floating point stack.
1386 default:
1387 return std::string(1, Constraint);
1388 }
1389}
Eli Friedman618234a2008-08-20 02:34:37 +00001390} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00001391
1392namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001393// X86-32 generic target
1394class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001395public:
Eli Friedman618234a2008-08-20 02:34:37 +00001396 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1397 DoubleAlign = LongLongAlign = 32;
1398 LongDoubleWidth = 96;
1399 LongDoubleAlign = 32;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001400 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1401 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001402 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman1afabd92009-03-29 20:31:09 +00001403 SizeType = UnsignedInt;
1404 PtrDiffType = SignedInt;
1405 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001406 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00001407
1408 // Use fpret for all types.
1409 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1410 (1 << TargetInfo::Double) |
1411 (1 << TargetInfo::LongDouble));
Eli Friedman618234a2008-08-20 02:34:37 +00001412 }
1413 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001414 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +00001415 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00001416
Chris Lattner21fb98e2009-09-23 06:06:36 +00001417 int getEHDataRegisterNumber(unsigned RegNo) const {
1418 if (RegNo == 0) return 0;
1419 if (RegNo == 1) return 2;
1420 return -1;
1421 }
Eli Friedman618234a2008-08-20 02:34:37 +00001422};
1423} // end anonymous namespace
1424
1425namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00001426class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1427public:
1428 OpenBSDI386TargetInfo(const std::string& triple) :
1429 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1430 SizeType = UnsignedLong;
1431 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00001432 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00001433 }
1434};
1435} // end anonymous namespace
1436
1437namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00001438class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00001439public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00001440 DarwinI386TargetInfo(const std::string& triple) :
1441 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00001442 LongDoubleWidth = 128;
1443 LongDoubleAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +00001444 SizeType = UnsignedLong;
1445 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001446 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1447 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001448 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbar613fd672010-05-27 00:35:16 +00001449 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00001450 }
1451
Eli Friedman618234a2008-08-20 02:34:37 +00001452};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001453} // end anonymous namespace
1454
1455namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00001456// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001457class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00001458public:
1459 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001460 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00001461 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00001462 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00001463 DoubleAlign = LongLongAlign = 64;
1464 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Anton Korobeynikovb3814412009-12-19 02:05:07 +00001465 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1466 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedman29a30502008-08-21 01:40:19 +00001467 }
Michael J. Spencera764e832010-10-21 08:22:51 +00001468 virtual void getTargetDefines(const LangOptions &Opts,
1469 MacroBuilder &Builder) const {
1470 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
1471 }
1472};
1473} // end anonymous namespace
1474
1475namespace {
1476
1477// x86-32 Windows Visual Studio target
1478class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1479public:
1480 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1481 : WindowsX86_32TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00001482 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00001483 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1484 }
1485 virtual void getTargetDefines(const LangOptions &Opts,
1486 MacroBuilder &Builder) const {
1487 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
1488 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
1489 // The value of the following reflects processor type.
1490 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1491 // We lost the original triple, so we use the default.
1492 Builder.defineMacro("_M_IX86", "600");
1493 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001494};
1495} // end anonymous namespace
1496
1497namespace {
1498// x86-32 MinGW target
1499class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1500public:
1501 MinGWX86_32TargetInfo(const std::string& triple)
1502 : WindowsX86_32TargetInfo(triple) {
1503 }
1504 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001505 MacroBuilder &Builder) const {
1506 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00001507 DefineStd(Builder, "WIN32", Opts);
1508 DefineStd(Builder, "WINNT", Opts);
1509 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00001510 Builder.defineMacro("__MSVCRT__");
1511 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00001512
1513 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1514 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1515 if (Opts.Microsoft)
1516 // Provide "as-is" __declspec.
1517 Builder.defineMacro("__declspec", "__declspec");
1518 else
1519 // Provide alias of __attribute__ like mingw32-gcc.
1520 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001521 }
1522};
1523} // end anonymous namespace
1524
1525namespace {
1526// x86-32 Cygwin target
1527class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1528public:
1529 CygwinX86_32TargetInfo(const std::string& triple)
1530 : X86_32TargetInfo(triple) {
1531 TLSSupported = false;
1532 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001533 DoubleAlign = LongLongAlign = 64;
1534 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1535 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001536 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001537 }
1538 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001539 MacroBuilder &Builder) const {
1540 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1541 Builder.defineMacro("__CYGWIN__");
1542 Builder.defineMacro("__CYGWIN32__");
1543 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00001544 if (Opts.CPlusPlus)
1545 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00001546 }
Eli Friedman29a30502008-08-21 01:40:19 +00001547};
1548} // end anonymous namespace
1549
1550namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00001551// x86-32 Haiku target
1552class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1553public:
1554 HaikuX86_32TargetInfo(const std::string& triple)
1555 : X86_32TargetInfo(triple) {
1556 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00001557 IntPtrType = SignedLong;
1558 PtrDiffType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00001559 this->UserLabelPrefix = "";
Eli Friedmana7e68452010-08-22 01:00:03 +00001560 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00001561 virtual void getTargetDefines(const LangOptions &Opts,
1562 MacroBuilder &Builder) const {
1563 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1564 Builder.defineMacro("__INTEL__");
1565 Builder.defineMacro("__HAIKU__");
1566 }
1567};
1568} // end anonymous namespace
1569
1570namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001571// x86-64 generic target
1572class X86_64TargetInfo : public X86TargetInfo {
1573public:
Chris Lattner33328642009-03-20 15:52:06 +00001574 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00001575 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00001576 LongDoubleWidth = 128;
1577 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00001578 LargeArrayMinWidth = 128;
1579 LargeArrayAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00001580 IntMaxType = SignedLong;
1581 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001582 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00001583 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00001584
Eli Friedmaned855cb2008-08-21 00:13:15 +00001585 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1586 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner1932e122009-11-07 18:59:41 +00001587 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00001588
1589 // Use fpret only for long double.
1590 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Reid Spencer5f016e22007-07-11 17:01:13 +00001591 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001592 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00001593 return "typedef struct __va_list_tag {"
1594 " unsigned gp_offset;"
1595 " unsigned fp_offset;"
1596 " void* overflow_arg_area;"
1597 " void* reg_save_area;"
John McCall2b7baf02010-05-28 18:25:28 +00001598 "} __va_list_tag;"
Eli Friedmandc043162009-07-03 00:45:06 +00001599 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +00001600 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001601
Chris Lattner21fb98e2009-09-23 06:06:36 +00001602 int getEHDataRegisterNumber(unsigned RegNo) const {
1603 if (RegNo == 0) return 0;
1604 if (RegNo == 1) return 1;
1605 return -1;
1606 }
Eli Friedman618234a2008-08-20 02:34:37 +00001607};
1608} // end anonymous namespace
1609
1610namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001611// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001612class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001613public:
1614 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001615 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001616 TLSSupported = false;
1617 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00001618 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00001619 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00001620 IntMaxType = SignedLongLong;
1621 UIntMaxType = UnsignedLongLong;
1622 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00001623 SizeType = UnsignedLongLong;
1624 PtrDiffType = SignedLongLong;
1625 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00001626 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001627 }
1628 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001629 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001630 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001631 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00001632 }
NAKAMURA Takumi79521992011-01-17 22:56:23 +00001633 virtual const char *getVAListDeclaration() const {
1634 return "typedef char* __builtin_va_list;";
1635 }
Michael J. Spencera764e832010-10-21 08:22:51 +00001636};
1637} // end anonymous namespace
1638
1639namespace {
1640// x86-64 Windows Visual Studio target
1641class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1642public:
1643 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1644 : WindowsX86_64TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00001645 LongDoubleWidth = LongDoubleAlign = 64;
1646 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00001647 }
1648 virtual void getTargetDefines(const LangOptions &Opts,
1649 MacroBuilder &Builder) const {
1650 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
1651 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00001652 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001653 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001654 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001655};
1656} // end anonymous namespace
1657
1658namespace {
1659// x86-64 MinGW target
1660class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1661public:
1662 MinGWX86_64TargetInfo(const std::string& triple)
1663 : WindowsX86_64TargetInfo(triple) {
1664 }
1665 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001666 MacroBuilder &Builder) const {
1667 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00001668 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00001669 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00001670 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00001671 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00001672
1673 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1674 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1675 if (Opts.Microsoft)
1676 // Provide "as-is" __declspec.
1677 Builder.defineMacro("__declspec", "__declspec");
1678 else
1679 // Provide alias of __attribute__ like mingw32-gcc.
1680 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00001681 }
1682};
1683} // end anonymous namespace
1684
1685namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001686class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1687public:
Mike Stump1eb44332009-09-09 15:08:12 +00001688 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001689 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1690 Int64Type = SignedLongLong;
1691 }
1692};
1693} // end anonymous namespace
1694
1695namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00001696class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1697public:
Mike Stump1eb44332009-09-09 15:08:12 +00001698 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00001699 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1700 IntMaxType = SignedLongLong;
1701 UIntMaxType = UnsignedLongLong;
1702 Int64Type = SignedLongLong;
1703 }
1704};
1705} // end anonymous namespace
1706
1707namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00001708class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001709 // Possible FPU choices.
1710 enum FPUMode {
1711 NoFPU,
1712 VFP2FPU,
1713 VFP3FPU,
1714 NeonFPU
1715 };
1716
1717 static bool FPUModeIsVFP(FPUMode Mode) {
1718 return Mode >= VFP2FPU && Mode <= NeonFPU;
1719 }
1720
1721 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1722 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001723
Daniel Dunbareac7c532009-12-18 18:42:37 +00001724 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001725
1726 unsigned FPU : 3;
1727
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001728 unsigned IsThumb : 1;
1729
1730 // Initialized via features.
1731 unsigned SoftFloat : 1;
1732 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001733
Chris Lattner2752c012010-03-03 19:03:45 +00001734 static const Builtin::Info BuiltinInfo[];
1735
Chris Lattner393ff042008-04-21 18:56:49 +00001736public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001737 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbareac7c532009-12-18 18:42:37 +00001738 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001739 {
Daniel Dunbara2a41612009-09-14 00:02:24 +00001740 SizeType = UnsignedInt;
1741 PtrDiffType = SignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001742
Chris Lattner9bffb072010-04-23 16:29:58 +00001743 // {} in inline assembly are neon specifiers, not assembly variant
1744 // specifiers.
1745 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00001746
Daniel Dunbareac7c532009-12-18 18:42:37 +00001747 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00001748 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001749 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00001750 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1751 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001752 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1753 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001754 "v64:64:64-v128:64:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001755 } else {
1756 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1757 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001758 "v64:64:64-v128:64:128-a0:0:64-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001759 }
John McCallee79a4c2010-08-21 22:46:04 +00001760
1761 // ARM targets default to using the ARM C++ ABI.
1762 CXXABI = CXXABI_ARM;
Eli Friedman61538a72008-05-20 14:21:01 +00001763 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001764 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00001765 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00001766 ABI = Name;
1767
Daniel Dunbara2a41612009-09-14 00:02:24 +00001768 // The defaults (above) are for AAPCS, check if we need to change them.
1769 //
1770 // FIXME: We need support for -meabi... we could just mangle it into the
1771 // name.
1772 if (Name == "apcs-gnu") {
Daniel Dunbard410fa22010-01-27 20:23:08 +00001773 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbara2a41612009-09-14 00:02:24 +00001774 SizeType = UnsignedLong;
1775
Daniel Dunbar684de632010-04-22 16:14:54 +00001776 // Do not respect the alignment of bit-field types when laying out
1777 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1778 UseBitFieldTypeAlignment = false;
1779
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001780 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00001781 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1782 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001783 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1784 "i64:32:32-f32:32:32-f64:32:32-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001785 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001786 } else {
1787 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001788 "i64:32:64-f32:32:32-f64:32:64-"
1789 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00001790 }
1791
Daniel Dunbara2a41612009-09-14 00:02:24 +00001792 // FIXME: Override "preferred align" for double and long long.
1793 } else if (Name == "aapcs") {
1794 // FIXME: Enumerated types are variable width in straight AAPCS.
1795 } else if (Name == "aapcs-linux") {
1796 ;
1797 } else
1798 return false;
1799
1800 return true;
1801 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001802
Daniel Dunbara91320b2009-12-21 23:28:17 +00001803 void getDefaultFeatures(const std::string &CPU,
1804 llvm::StringMap<bool> &Features) const {
1805 // FIXME: This should not be here.
1806 Features["vfp2"] = false;
1807 Features["vfp3"] = false;
1808 Features["neon"] = false;
1809
1810 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1811 Features["vfp2"] = true;
1812 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1813 Features["neon"] = true;
1814 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00001815
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001816 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1817 const std::string &Name,
1818 bool Enabled) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001819 if (Name == "soft-float" || Name == "soft-float-abi") {
1820 Features[Name] = Enabled;
1821 } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") {
1822 // These effectively are a single option, reset them when any is enabled.
1823 if (Enabled)
1824 Features["vfp2"] = Features["vfp3"] = Features["neon"] = false;
1825 Features[Name] = Enabled;
1826 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001827 return false;
1828
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001829 return true;
1830 }
1831
1832 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbara91320b2009-12-21 23:28:17 +00001833 FPU = NoFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001834 SoftFloat = SoftFloatABI = false;
1835 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
1836 if (Features[i] == "+soft-float")
1837 SoftFloat = true;
1838 else if (Features[i] == "+soft-float-abi")
1839 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00001840 else if (Features[i] == "+vfp2")
1841 FPU = VFP2FPU;
1842 else if (Features[i] == "+vfp3")
1843 FPU = VFP3FPU;
1844 else if (Features[i] == "+neon")
1845 FPU = NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001846 }
1847
1848 // Remove front-end specific options which the backend handles differently.
1849 std::vector<std::string>::iterator it;
1850 it = std::find(Features.begin(), Features.end(), "+soft-float");
1851 if (it != Features.end())
1852 Features.erase(it);
1853 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
1854 if (it != Features.end())
1855 Features.erase(it);
1856 }
1857
Daniel Dunbareac7c532009-12-18 18:42:37 +00001858 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
1859 return llvm::StringSwitch<const char*>(Name)
1860 .Cases("arm8", "arm810", "4")
1861 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
1862 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
1863 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
1864 .Case("ep9312", "4T")
1865 .Cases("arm10tdmi", "arm1020t", "5T")
1866 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
1867 .Case("arm926ej-s", "5TEJ")
1868 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
1869 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00001870 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001871 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00001872 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001873 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
1874 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson06f45632011-01-06 16:57:20 +00001875 .Case("cortex-m3", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00001876 .Case("cortex-m0", "6M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00001877 .Default(0);
1878 }
1879 virtual bool setCPU(const std::string &Name) {
1880 if (!getCPUDefineSuffix(Name))
1881 return false;
1882
1883 CPU = Name;
1884 return true;
1885 }
Chris Lattner33328642009-03-20 15:52:06 +00001886 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001887 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001888 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00001889 Builder.defineMacro("__arm");
1890 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001891
Chris Lattnerc0f59212009-03-02 22:27:17 +00001892 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00001893 Builder.defineMacro("__ARMEL__");
1894 Builder.defineMacro("__LITTLE_ENDIAN__");
1895 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001896
1897 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00001898 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001899
Mike Stump437bb4b2009-04-08 02:07:04 +00001900 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001901
Daniel Dunbareac7c532009-12-18 18:42:37 +00001902 // FIXME: It's more complicated than this and we don't really support
1903 // interworking.
1904 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00001905 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001906
Daniel Dunbareac7c532009-12-18 18:42:37 +00001907 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramera9992772010-01-09 17:55:51 +00001908 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001909
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00001910 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00001911 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00001912
1913 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00001914 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001915
Daniel Dunbara91320b2009-12-21 23:28:17 +00001916 bool IsThumb2 = IsThumb && (CPUArch == "6T2" || CPUArch.startswith("7"));
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001917 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001918 Builder.defineMacro("__THUMBEL__");
1919 Builder.defineMacro("__thumb__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001920 if (IsThumb2)
Benjamin Kramera9992772010-01-09 17:55:51 +00001921 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00001922 }
1923
1924 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00001925 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001926
1927 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramera9992772010-01-09 17:55:51 +00001928 Builder.defineMacro("__VFP_FP__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00001929
1930 // This only gets set when Neon instructions are actually available, unlike
1931 // the VFP define, hence the soft float and arch check. This is subtly
1932 // different from gcc, we follow the intent which was that it should be set
1933 // when Neon instructions are actually available.
1934 if (FPU == NeonFPU && !SoftFloat && IsThumb2)
Benjamin Kramera9992772010-01-09 17:55:51 +00001935 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00001936 }
1937 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1938 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00001939 Records = BuiltinInfo;
1940 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00001941 }
1942 virtual const char *getVAListDeclaration() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001943 return "typedef char* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +00001944 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001945 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001946 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001947 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001948 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001949 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00001950 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001951 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001952 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00001953 default:
Nate Begemanad487f42008-04-22 05:03:19 +00001954 case 'l': // r0-r7
1955 case 'h': // r8-r15
1956 case 'w': // VFP Floating point register single precision
1957 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00001958 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00001959 return true;
1960 }
Chris Lattner393ff042008-04-21 18:56:49 +00001961 return false;
1962 }
1963 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00001964 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00001965 return "";
1966 }
1967};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001968
1969const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00001970 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001971 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00001972 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
1973
1974 // Float registers
1975 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1976 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1977 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001978 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00001979
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001980 // Double registers
1981 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
1982 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00001983 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
1984 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00001985
1986 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00001987 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1988 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001989};
1990
1991void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00001992 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001993 Names = GCCRegNames;
1994 NumNames = llvm::array_lengthof(GCCRegNames);
1995}
1996
1997const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001998 { { "a1" }, "r0" },
1999 { { "a2" }, "r1" },
2000 { { "a3" }, "r2" },
2001 { { "a4" }, "r3" },
2002 { { "v1" }, "r4" },
2003 { { "v2" }, "r5" },
2004 { { "v3" }, "r6" },
2005 { { "v4" }, "r7" },
2006 { { "v5" }, "r8" },
2007 { { "v6", "rfp" }, "r9" },
2008 { { "sl" }, "r10" },
2009 { { "fp" }, "r11" },
2010 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002011 { { "r13" }, "sp" },
2012 { { "r14" }, "lr" },
2013 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002014 // The S, D and Q registers overlap, but aren't really aliases; we
2015 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002016};
2017
2018void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2019 unsigned &NumAliases) const {
2020 Aliases = GCCRegAliases;
2021 NumAliases = llvm::array_lengthof(GCCRegAliases);
2022}
Chris Lattner2752c012010-03-03 19:03:45 +00002023
2024const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Fariborz Jahanian67aba812010-11-30 17:35:24 +00002025#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
2026#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
2027 ALL_LANGUAGES, false },
Chris Lattner2752c012010-03-03 19:03:45 +00002028#include "clang/Basic/BuiltinsARM.def"
2029};
Chris Lattner393ff042008-04-21 18:56:49 +00002030} // end anonymous namespace.
2031
Eli Friedmana9f54962008-08-20 07:44:10 +00002032
2033namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00002034class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002035 public DarwinTargetInfo<ARMTargetInfo> {
2036protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00002037 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00002038 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00002039 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00002040 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002041
Torok Edwin5f6c1942009-06-30 17:10:35 +00002042public:
Mike Stump1eb44332009-09-09 15:08:12 +00002043 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002044 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2045 HasAlignMac68kSupport = true;
2046 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002047};
2048} // end anonymous namespace.
2049
Reid Spencer5f016e22007-07-11 17:01:13 +00002050namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00002051class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00002052 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2053 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002054 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00002055public:
Eli Friedman01b86682008-08-20 07:28:14 +00002056 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2057 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00002058 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +00002059 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00002060 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002061 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2062 const std::string &Name,
2063 bool Enabled) const {
2064 if (Name == "soft-float")
2065 Features[Name] = Enabled;
2066 else
2067 return false;
2068
2069 return true;
2070 }
2071 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2072 SoftFloat = false;
2073 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2074 if (Features[i] == "+soft-float")
2075 SoftFloat = true;
2076 }
Chris Lattner33328642009-03-20 15:52:06 +00002077 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002078 MacroBuilder &Builder) const {
2079 DefineStd(Builder, "sparc", Opts);
2080 Builder.defineMacro("__sparcv8");
2081 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002082
2083 if (SoftFloat)
2084 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00002085 }
2086 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2087 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002088 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00002089 }
2090 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002091 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00002092 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002093 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002094 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002095 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002096 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002097 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00002098 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00002099 // FIXME: Implement!
2100 return false;
Gabor Greif26658672008-02-21 16:29:08 +00002101 }
2102 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002103 // FIXME: Implement!
2104 return "";
Gabor Greif26658672008-02-21 16:29:08 +00002105 }
2106};
2107
Chris Lattnere957f532009-01-27 01:58:38 +00002108const char * const SparcV8TargetInfo::GCCRegNames[] = {
2109 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2110 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2111 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2112 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2113};
2114
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002115void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00002116 unsigned &NumNames) const {
2117 Names = GCCRegNames;
2118 NumNames = llvm::array_lengthof(GCCRegNames);
2119}
2120
2121const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002122 { { "g0" }, "r0" },
2123 { { "g1" }, "r1" },
2124 { { "g2" }, "r2" },
2125 { { "g3" }, "r3" },
2126 { { "g4" }, "r4" },
2127 { { "g5" }, "r5" },
2128 { { "g6" }, "r6" },
2129 { { "g7" }, "r7" },
2130 { { "o0" }, "r8" },
2131 { { "o1" }, "r9" },
2132 { { "o2" }, "r10" },
2133 { { "o3" }, "r11" },
2134 { { "o4" }, "r12" },
2135 { { "o5" }, "r13" },
2136 { { "o6", "sp" }, "r14" },
2137 { { "o7" }, "r15" },
2138 { { "l0" }, "r16" },
2139 { { "l1" }, "r17" },
2140 { { "l2" }, "r18" },
2141 { { "l3" }, "r19" },
2142 { { "l4" }, "r20" },
2143 { { "l5" }, "r21" },
2144 { { "l6" }, "r22" },
2145 { { "l7" }, "r23" },
2146 { { "i0" }, "r24" },
2147 { { "i1" }, "r25" },
2148 { { "i2" }, "r26" },
2149 { { "i3" }, "r27" },
2150 { { "i4" }, "r28" },
2151 { { "i5" }, "r29" },
2152 { { "i6", "fp" }, "r30" },
2153 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00002154};
2155
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002156void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00002157 unsigned &NumAliases) const {
2158 Aliases = GCCRegAliases;
2159 NumAliases = llvm::array_lengthof(GCCRegAliases);
2160}
Gabor Greif26658672008-02-21 16:29:08 +00002161} // end anonymous namespace.
2162
Eli Friedman01b86682008-08-20 07:28:14 +00002163namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002164class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2165public:
2166 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2167 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2168 SizeType = UnsignedInt;
2169 PtrDiffType = SignedInt;
2170 }
2171};
Torok Edwin5f6c1942009-06-30 17:10:35 +00002172class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00002173public:
2174 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002175 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00002176 SizeType = UnsignedInt;
2177 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00002178 }
2179};
2180} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00002181
Chris Lattner2621fd12008-05-08 05:58:21 +00002182namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002183 class MSP430TargetInfo : public TargetInfo {
2184 static const char * const GCCRegNames[];
2185 public:
2186 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2187 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00002188 IntWidth = 16; IntAlign = 16;
2189 LongWidth = 32; LongLongWidth = 64;
2190 LongAlign = LongLongAlign = 16;
2191 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002192 SizeType = UnsignedInt;
2193 IntMaxType = SignedLong;
2194 UIntMaxType = UnsignedLong;
2195 IntPtrType = SignedShort;
2196 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00002197 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00002198 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002199 }
2200 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002201 MacroBuilder &Builder) const {
2202 Builder.defineMacro("MSP430");
2203 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002204 // FIXME: defines for different 'flavours' of MCU
2205 }
2206 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2207 unsigned &NumRecords) const {
2208 // FIXME: Implement.
2209 Records = 0;
2210 NumRecords = 0;
2211 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002212 virtual void getGCCRegNames(const char * const *&Names,
2213 unsigned &NumNames) const;
2214 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2215 unsigned &NumAliases) const {
2216 // No aliases.
2217 Aliases = 0;
2218 NumAliases = 0;
2219 }
2220 virtual bool validateAsmConstraint(const char *&Name,
2221 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00002222 // No target constraints for now.
2223 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002224 }
2225 virtual const char *getClobbers() const {
2226 // FIXME: Is this really right?
2227 return "";
2228 }
2229 virtual const char *getVAListDeclaration() const {
2230 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00002231 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00002232 }
2233 };
2234
2235 const char * const MSP430TargetInfo::GCCRegNames[] = {
2236 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2237 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2238 };
2239
2240 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2241 unsigned &NumNames) const {
2242 Names = GCCRegNames;
2243 NumNames = llvm::array_lengthof(GCCRegNames);
2244 }
2245}
2246
2247
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002248namespace {
2249 class SystemZTargetInfo : public TargetInfo {
2250 static const char * const GCCRegNames[];
2251 public:
2252 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2253 TLSSupported = false;
2254 IntWidth = IntAlign = 32;
2255 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2256 PointerWidth = PointerAlign = 64;
Chris Lattner1932e122009-11-07 18:59:41 +00002257 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2258 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002259 }
2260 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002261 MacroBuilder &Builder) const {
2262 Builder.defineMacro("__s390__");
2263 Builder.defineMacro("__s390x__");
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002264 }
2265 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2266 unsigned &NumRecords) const {
2267 // FIXME: Implement.
2268 Records = 0;
2269 NumRecords = 0;
2270 }
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002271
Anton Korobeynikov89e887f2009-07-16 20:09:57 +00002272 virtual void getGCCRegNames(const char * const *&Names,
2273 unsigned &NumNames) const;
2274 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2275 unsigned &NumAliases) const {
2276 // No aliases.
2277 Aliases = 0;
2278 NumAliases = 0;
2279 }
2280 virtual bool validateAsmConstraint(const char *&Name,
2281 TargetInfo::ConstraintInfo &info) const {
2282 // FIXME: implement
2283 return true;
2284 }
2285 virtual const char *getClobbers() const {
2286 // FIXME: Is this really right?
2287 return "";
2288 }
2289 virtual const char *getVAListDeclaration() const {
2290 // FIXME: implement
2291 return "typedef char* __builtin_va_list;";
2292 }
2293 };
2294
2295 const char * const SystemZTargetInfo::GCCRegNames[] = {
2296 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2297 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2298 };
2299
2300 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2301 unsigned &NumNames) const {
2302 Names = GCCRegNames;
2303 NumNames = llvm::array_lengthof(GCCRegNames);
2304 }
2305}
2306
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002307namespace {
2308 class BlackfinTargetInfo : public TargetInfo {
2309 static const char * const GCCRegNames[];
2310 public:
2311 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2312 TLSSupported = false;
2313 DoubleAlign = 32;
2314 LongLongAlign = 32;
2315 LongDoubleAlign = 32;
Chris Lattner1932e122009-11-07 18:59:41 +00002316 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002317 }
2318
2319 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002320 MacroBuilder &Builder) const {
2321 DefineStd(Builder, "bfin", Opts);
2322 DefineStd(Builder, "BFIN", Opts);
2323 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002324 // FIXME: This one is really dependent on -mcpu
Benjamin Kramera9992772010-01-09 17:55:51 +00002325 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002326 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2327 }
2328
2329 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2330 unsigned &NumRecords) const {
2331 // FIXME: Implement.
2332 Records = 0;
2333 NumRecords = 0;
2334 }
2335
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002336 virtual void getGCCRegNames(const char * const *&Names,
2337 unsigned &NumNames) const;
2338
2339 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2340 unsigned &NumAliases) const {
2341 // No aliases.
2342 Aliases = 0;
2343 NumAliases = 0;
2344 }
2345
2346 virtual bool validateAsmConstraint(const char *&Name,
2347 TargetInfo::ConstraintInfo &Info) const {
2348 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2349 Info.setAllowsRegister();
2350 return true;
2351 }
2352 return false;
2353 }
2354
2355 virtual const char *getClobbers() const {
2356 return "";
2357 }
2358
2359 virtual const char *getVAListDeclaration() const {
2360 return "typedef char* __builtin_va_list;";
2361 }
2362 };
2363
2364 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2365 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2366 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2367 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2368 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2369 "a0", "a1", "cc",
2370 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2371 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2372 };
2373
2374 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2375 unsigned &NumNames) const {
2376 Names = GCCRegNames;
2377 NumNames = llvm::array_lengthof(GCCRegNames);
2378 }
2379}
2380
Eli Friedmanb63decf2009-08-19 20:47:07 +00002381namespace {
2382
Mike Stump1eb44332009-09-09 15:08:12 +00002383 // LLVM and Clang cannot be used directly to output native binaries for
2384 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00002385 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00002386 //
2387 // TCE uses the llvm bitcode as input and uses it for generating customized
2388 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00002389 // publicly available in http://tce.cs.tut.fi
2390
2391 class TCETargetInfo : public TargetInfo{
2392 public:
2393 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2394 TLSSupported = false;
2395 IntWidth = 32;
2396 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00002397 PointerWidth = 32;
2398 IntAlign = 32;
2399 LongAlign = LongLongAlign = 32;
2400 PointerAlign = 32;
2401 SizeType = UnsignedInt;
2402 IntMaxType = SignedLong;
2403 UIntMaxType = UnsignedLong;
2404 IntPtrType = SignedInt;
2405 PtrDiffType = SignedInt;
2406 FloatWidth = 32;
2407 FloatAlign = 32;
2408 DoubleWidth = 32;
2409 DoubleAlign = 32;
2410 LongDoubleWidth = 32;
2411 LongDoubleAlign = 32;
2412 FloatFormat = &llvm::APFloat::IEEEsingle;
2413 DoubleFormat = &llvm::APFloat::IEEEsingle;
2414 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00002415 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2416 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00002417 "f32:32:32-f64:32:32-v64:32:32-"
2418 "v128:32:32-a0:0:32-n32";
Eli Friedmanb63decf2009-08-19 20:47:07 +00002419 }
2420
2421 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002422 MacroBuilder &Builder) const {
2423 DefineStd(Builder, "tce", Opts);
2424 Builder.defineMacro("__TCE__");
2425 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00002426 }
2427 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2428 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00002429 virtual const char *getClobbers() const {
2430 return "";
2431 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002432 virtual const char *getVAListDeclaration() const {
2433 return "typedef void* __builtin_va_list;";
2434 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00002435 virtual void getGCCRegNames(const char * const *&Names,
2436 unsigned &NumNames) const {}
2437 virtual bool validateAsmConstraint(const char *&Name,
2438 TargetInfo::ConstraintInfo &info) const {
2439 return true;
2440 }
2441 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2442 unsigned &NumAliases) const {}
2443 };
2444}
2445
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002446namespace {
2447class MipsTargetInfo : public TargetInfo {
Eric Christophered734732010-03-02 02:41:08 +00002448 std::string ABI, CPU;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002449 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2450 static const char * const GCCRegNames[];
2451public:
Eric Christophered734732010-03-02 02:41:08 +00002452 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002453 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2454 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2455 }
Eric Christophered734732010-03-02 02:41:08 +00002456 virtual const char *getABI() const { return ABI.c_str(); }
2457 virtual bool setABI(const std::string &Name) {
2458
2459 if ((Name == "o32") || (Name == "eabi")) {
2460 ABI = Name;
2461 return true;
2462 } else
2463 return false;
2464 }
2465 virtual bool setCPU(const std::string &Name) {
2466 CPU = Name;
2467 return true;
2468 }
2469 void getDefaultFeatures(const std::string &CPU,
2470 llvm::StringMap<bool> &Features) const {
2471 Features[ABI] = true;
2472 Features[CPU] = true;
2473 }
2474 virtual void getArchDefines(const LangOptions &Opts,
2475 MacroBuilder &Builder) const {
2476 if (ABI == "o32")
2477 Builder.defineMacro("__mips_o32");
2478 else if (ABI == "eabi")
2479 Builder.defineMacro("__mips_eabi");
2480 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002481 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002482 MacroBuilder &Builder) const {
2483 DefineStd(Builder, "mips", Opts);
2484 Builder.defineMacro("_mips");
2485 DefineStd(Builder, "MIPSEB", Opts);
2486 Builder.defineMacro("_MIPSEB");
2487 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002488 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002489 }
2490 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2491 unsigned &NumRecords) const {
2492 // FIXME: Implement!
2493 }
2494 virtual const char *getVAListDeclaration() const {
2495 return "typedef void* __builtin_va_list;";
2496 }
2497 virtual void getGCCRegNames(const char * const *&Names,
2498 unsigned &NumNames) const;
2499 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2500 unsigned &NumAliases) const;
2501 virtual bool validateAsmConstraint(const char *&Name,
2502 TargetInfo::ConstraintInfo &Info) const {
2503 switch (*Name) {
2504 default:
2505 case 'r': // CPU registers.
2506 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2507 case 'y': // Equivalent to "r", backwards compatibility only.
2508 case 'f': // floating-point registers.
2509 Info.setAllowsRegister();
2510 return true;
2511 }
2512 return false;
2513 }
2514
2515 virtual const char *getClobbers() const {
2516 // FIXME: Implement!
2517 return "";
2518 }
2519};
2520
2521const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencer20249a12010-10-21 03:16:25 +00002522 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002523 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2524 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2525 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2526 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2527 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2528 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2529 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2530 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2531 "$fcc5","$fcc6","$fcc7"
2532};
2533
2534void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2535 unsigned &NumNames) const {
2536 Names = GCCRegNames;
2537 NumNames = llvm::array_lengthof(GCCRegNames);
2538}
2539
2540const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2541 { { "at" }, "$1" },
2542 { { "v0" }, "$2" },
2543 { { "v1" }, "$3" },
2544 { { "a0" }, "$4" },
2545 { { "a1" }, "$5" },
2546 { { "a2" }, "$6" },
2547 { { "a3" }, "$7" },
2548 { { "t0" }, "$8" },
2549 { { "t1" }, "$9" },
2550 { { "t2" }, "$10" },
2551 { { "t3" }, "$11" },
2552 { { "t4" }, "$12" },
2553 { { "t5" }, "$13" },
2554 { { "t6" }, "$14" },
2555 { { "t7" }, "$15" },
2556 { { "s0" }, "$16" },
2557 { { "s1" }, "$17" },
2558 { { "s2" }, "$18" },
2559 { { "s3" }, "$19" },
2560 { { "s4" }, "$20" },
2561 { { "s5" }, "$21" },
2562 { { "s6" }, "$22" },
2563 { { "s7" }, "$23" },
2564 { { "t8" }, "$24" },
2565 { { "t9" }, "$25" },
2566 { { "k0" }, "$26" },
2567 { { "k1" }, "$27" },
2568 { { "gp" }, "$28" },
2569 { { "sp" }, "$29" },
2570 { { "fp" }, "$30" },
2571 { { "ra" }, "$31" }
2572};
2573
2574void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2575 unsigned &NumAliases) const {
2576 Aliases = GCCRegAliases;
2577 NumAliases = llvm::array_lengthof(GCCRegAliases);
2578}
2579} // end anonymous namespace.
2580
2581namespace {
2582class MipselTargetInfo : public MipsTargetInfo {
2583public:
2584 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2585 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
2586 "i64:32:64-f32:32:32-f64:64:64-v64:64:64-n32";
2587 }
2588
2589 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002590 MacroBuilder &Builder) const;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002591};
2592
2593void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002594 MacroBuilder &Builder) const {
2595 DefineStd(Builder, "mips", Opts);
2596 Builder.defineMacro("_mips");
2597 DefineStd(Builder, "MIPSEL", Opts);
2598 Builder.defineMacro("_MIPSEL");
2599 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christophered734732010-03-02 02:41:08 +00002600 getArchDefines(Opts, Builder);
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002601}
2602} // end anonymous namespace.
2603
Reid Spencer5f016e22007-07-11 17:01:13 +00002604//===----------------------------------------------------------------------===//
2605// Driver code
2606//===----------------------------------------------------------------------===//
2607
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002608static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002609 llvm::Triple Triple(T);
2610 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00002611
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002612 switch (Triple.getArch()) {
2613 default:
2614 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00002615
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002616 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00002617 case llvm::Triple::thumb:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002618 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00002619 case llvm::Triple::Linux:
2620 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002621 case llvm::Triple::Darwin:
Eli Friedmaned855cb2008-08-21 00:13:15 +00002622 return new DarwinARMTargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002623 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002624 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002625 default:
2626 return new ARMTargetInfo(T);
2627 }
Eli Friedman61538a72008-05-20 14:21:01 +00002628
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002629 case llvm::Triple::bfin:
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00002630 return new BlackfinTargetInfo(T);
2631
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002632 case llvm::Triple::msp430:
2633 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00002634
Edward O'Callaghan84423a82009-11-15 10:22:07 +00002635 case llvm::Triple::mips:
2636 if (os == llvm::Triple::Psp)
2637 return new PSPTargetInfo<MipsTargetInfo>(T);
2638 if (os == llvm::Triple::Linux)
2639 return new LinuxTargetInfo<MipsTargetInfo>(T);
2640 return new MipsTargetInfo(T);
2641
2642 case llvm::Triple::mipsel:
2643 if (os == llvm::Triple::Psp)
2644 return new PSPTargetInfo<MipselTargetInfo>(T);
2645 if (os == llvm::Triple::Linux)
2646 return new LinuxTargetInfo<MipselTargetInfo>(T);
2647 return new MipselTargetInfo(T);
2648
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002649 case llvm::Triple::ppc:
2650 if (os == llvm::Triple::Darwin)
Roman Divackyc81f2a22011-01-06 08:27:10 +00002651 return new DarwinPPC32TargetInfo(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002652 else if (os == llvm::Triple::FreeBSD)
2653 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002654 return new PPC32TargetInfo(T);
2655
2656 case llvm::Triple::ppc64:
2657 if (os == llvm::Triple::Darwin)
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00002658 return new DarwinPPC64TargetInfo(T);
John Thompson3f6918a2009-11-19 17:18:50 +00002659 else if (os == llvm::Triple::Lv2)
2660 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Chris Lattnere03ae302010-02-16 18:14:57 +00002661 else if (os == llvm::Triple::FreeBSD)
2662 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002663 return new PPC64TargetInfo(T);
2664
Chris Lattner9cbeb632010-03-06 21:21:27 +00002665 case llvm::Triple::mblaze:
2666 return new MBlazeTargetInfo(T);
2667
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002668 case llvm::Triple::sparc:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002669 if (os == llvm::Triple::AuroraUX)
2670 return new AuroraUXSparcV8TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002671 if (os == llvm::Triple::Solaris)
2672 return new SolarisSparcV8TargetInfo(T);
2673 return new SparcV8TargetInfo(T);
2674
John Thompson3f6918a2009-11-19 17:18:50 +00002675 // FIXME: Need a real SPU target.
2676 case llvm::Triple::cellspu:
2677 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2678
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002679 case llvm::Triple::systemz:
2680 return new SystemZTargetInfo(T);
2681
Eli Friedmanb63decf2009-08-19 20:47:07 +00002682 case llvm::Triple::tce:
2683 return new TCETargetInfo(T);
2684
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002685 case llvm::Triple::x86:
2686 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002687 case llvm::Triple::AuroraUX:
2688 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002689 case llvm::Triple::Darwin:
2690 return new DarwinI386TargetInfo(T);
2691 case llvm::Triple::Linux:
2692 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2693 case llvm::Triple::DragonFly:
2694 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2695 case llvm::Triple::NetBSD:
2696 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2697 case llvm::Triple::OpenBSD:
2698 return new OpenBSDI386TargetInfo(T);
2699 case llvm::Triple::FreeBSD:
2700 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00002701 case llvm::Triple::Minix:
2702 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002703 case llvm::Triple::Solaris:
2704 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2705 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002706 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002707 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002708 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002709 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00002710 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00002711 case llvm::Triple::Haiku:
2712 return new HaikuX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002713 default:
2714 return new X86_32TargetInfo(T);
2715 }
2716
2717 case llvm::Triple::x86_64:
2718 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00002719 case llvm::Triple::AuroraUX:
2720 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002721 case llvm::Triple::Darwin:
2722 return new DarwinX86_64TargetInfo(T);
2723 case llvm::Triple::Linux:
2724 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00002725 case llvm::Triple::DragonFly:
2726 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002727 case llvm::Triple::NetBSD:
2728 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2729 case llvm::Triple::OpenBSD:
2730 return new OpenBSDX86_64TargetInfo(T);
2731 case llvm::Triple::FreeBSD:
2732 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
2733 case llvm::Triple::Solaris:
2734 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00002735 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002736 return new MinGWX86_64TargetInfo(T);
2737 case llvm::Triple::Win32: // This is what Triple.h supports now.
Douglas Gregorfb7049a2011-02-01 15:06:18 +00002738 if (Triple.getEnvironment() == llvm::Triple::MachO)
2739 return new DarwinX86_64TargetInfo(T);
2740 else
2741 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00002742 default:
2743 return new X86_64TargetInfo(T);
2744 }
2745 }
Reid Spencer5f016e22007-07-11 17:01:13 +00002746}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002747
2748/// CreateTargetInfo - Return the target info object for the specified target
2749/// triple.
2750TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002751 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002752 llvm::Triple Triple(Opts.Triple);
2753
2754 // Construct the target
2755 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
2756 if (!Target) {
2757 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
2758 return 0;
2759 }
2760
Daniel Dunbareac7c532009-12-18 18:42:37 +00002761 // Set the target CPU if specified.
2762 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
2763 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
2764 return 0;
2765 }
2766
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002767 // Set the target ABI if specified.
2768 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
2769 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
2770 return 0;
2771 }
2772
Charles Davis98b7c5c2010-06-11 01:06:47 +00002773 // Set the target C++ ABI.
John McCallee79a4c2010-08-21 22:46:04 +00002774 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis98b7c5c2010-06-11 01:06:47 +00002775 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
2776 return 0;
2777 }
2778
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002779 // Compute the default target features, we need the target to handle this
2780 // because features may have dependencies on one another.
2781 llvm::StringMap<bool> Features;
2782 Target->getDefaultFeatures(Opts.CPU, Features);
2783
2784 // Apply the user specified deltas.
2785 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
2786 ie = Opts.Features.end(); it != ie; ++it) {
2787 const char *Name = it->c_str();
2788
2789 // Apply the feature via the target.
2790 if ((Name[0] != '-' && Name[0] != '+') ||
2791 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
2792 Diags.Report(diag::err_target_invalid_feature) << Name;
2793 return 0;
2794 }
2795 }
2796
2797 // Add the features to the compile options.
2798 //
2799 // FIXME: If we are completely confident that we have the right set, we only
2800 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002801 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002802 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
2803 ie = Features.end(); it != ie; ++it)
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002804 Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
2805 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00002806
2807 return Target.take();
2808}