blob: 07e61d80bab802d11ff4e5987a5a814aff11fdea [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"
David Blaikie9fe8c742011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Dale Johannesen1e592cb2010-10-29 23:24:33 +000030#include "llvm/Type.h"
Benjamin Kramer48725082010-01-09 18:20:57 +000031#include <algorithm>
Reid Spencer5f016e22007-07-11 17:01:13 +000032using namespace clang;
33
Reid Spencer5f016e22007-07-11 17:01:13 +000034//===----------------------------------------------------------------------===//
35// Common code shared among targets.
36//===----------------------------------------------------------------------===//
37
Chris Lattnerca45cff2009-03-20 16:06:38 +000038/// DefineStd - Define a macro name and standard variants. For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
Chris Lattner5f9e2722011-07-23 10:55:15 +000041static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattnerca45cff2009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000044
Chris Lattnerca45cff2009-03-20 16:06:38 +000045 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
47 if (Opts.GNUMode)
Benjamin Kramera9992772010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikova7c47172009-05-03 13:42:53 +000049
Chris Lattnerca45cff2009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramera9992772010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikova7c47172009-05-03 13:42:53 +000052
Chris Lattnerca45cff2009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramera9992772010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattnerca45cff2009-03-20 16:06:38 +000055}
56
Chris Lattnerd29b6302008-10-05 21:50:58 +000057//===----------------------------------------------------------------------===//
58// Defines specific to certain operating systems.
59//===----------------------------------------------------------------------===//
Chris Lattner797c3c42009-08-10 19:03:04 +000060
Torok Edwin5f6c1942009-06-30 17:10:35 +000061namespace {
Douglas Gregora3844922009-07-01 15:12:53 +000062template<typename TgtInfo>
63class OSTargetInfo : public TgtInfo {
Torok Edwin5f6c1942009-06-30 17:10:35 +000064protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +000065 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +000066 MacroBuilder &Builder) const=0;
Torok Edwin5f6c1942009-06-30 17:10:35 +000067public:
Douglas Gregora3844922009-07-01 15:12:53 +000068 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Torok Edwin5f6c1942009-06-30 17:10:35 +000069 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +000070 MacroBuilder &Builder) const {
71 TgtInfo::getTargetDefines(Opts, Builder);
72 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwinb0a5b242009-06-30 17:00:25 +000073 }
Torok Edwin5f6c1942009-06-30 17:10:35 +000074
75};
Chris Lattner4c28b1c2009-08-12 06:24:27 +000076} // end anonymous namespace
Torok Edwinb0a5b242009-06-30 17:00:25 +000077
Chris Lattner797c3c42009-08-10 19:03:04 +000078
Daniel Dunbar21ae3192010-01-26 01:44:04 +000079static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000080 const llvm::Triple &Triple,
Chris Lattner5f9e2722011-07-23 10:55:15 +000081 StringRef &PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000082 VersionTuple &PlatformMinVersion) {
Benjamin Kramera9992772010-01-09 17:55:51 +000083 Builder.defineMacro("__APPLE_CC__", "5621");
84 Builder.defineMacro("__APPLE__");
85 Builder.defineMacro("__MACH__");
86 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000087
John McCall098df7f2011-06-16 00:03:19 +000088 if (!Opts.ObjCAutoRefCount) {
John McCallf85e1932011-06-15 23:02:42 +000089 // __weak is always defined, for use in blocks and with objc pointers.
90 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000091
John McCallf85e1932011-06-15 23:02:42 +000092 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregore289d812011-09-13 17:21:33 +000093 if (Opts.getGC() != LangOptions::NonGC)
John McCallf85e1932011-06-15 23:02:42 +000094 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
95 else
96 Builder.defineMacro("__strong", "");
Eric Christopher7c9adf92011-07-07 22:55:26 +000097
John McCallf85e1932011-06-15 23:02:42 +000098 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
99 // allow this in C, since one might have block pointers in structs that
100 // are used in pure C code and in Objective-C ARC.
101 Builder.defineMacro("__unsafe_unretained", "");
Eric Christopher7c9adf92011-07-07 22:55:26 +0000102
John McCallf85e1932011-06-15 23:02:42 +0000103 // The Objective-C bridged cast keywords are defined to nothing in non-ARC
104 // mode; then they become normal, C-style casts.
105 Builder.defineMacro("__bridge", "");
106 Builder.defineMacro("__bridge_transfer", "");
107 Builder.defineMacro("__bridge_retained", "");
John McCall18164422011-06-17 21:23:37 +0000108 Builder.defineMacro("__bridge_retain", "");
John McCallf85e1932011-06-15 23:02:42 +0000109 }
Eric Christopher7c9adf92011-07-07 22:55:26 +0000110
Eli Friedman2de4fee2009-06-04 23:00:29 +0000111 if (Opts.Static)
Benjamin Kramera9992772010-01-09 17:55:51 +0000112 Builder.defineMacro("__STATIC__");
Eli Friedman2de4fee2009-06-04 23:00:29 +0000113 else
Benjamin Kramera9992772010-01-09 17:55:51 +0000114 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000115
116 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000117 Builder.defineMacro("_REENTRANT");
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000118
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000119 // Get the platform type and version number from the triple.
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000120 unsigned Maj, Min, Rev;
Mike Stump1eb44332009-09-09 15:08:12 +0000121
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000122 // If no version was given, default to to 10.4.0, for simplifying tests.
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000123 if (Triple.getOSName() == "darwin" || Triple.getOSName() == "osx") {
124 PlatformName = "macosx";
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000125 Min = Rev = 0;
126 Maj = 8;
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000127 } else {
128 // Otherwise, honor all three triple forms ("-darwinNNN[-iphoneos]",
129 // "-osxNNN", and "-iosNNN").
130
131 if (Triple.getOS() == llvm::Triple::Darwin) {
132 // For historical reasons that make little sense, the version passed here
133 // is the "darwin" version, which drops the 10 and offsets by 4.
134 Triple.getOSVersion(Maj, Min, Rev);
135
136 if (Triple.getEnvironmentName() == "iphoneos") {
137 PlatformName = "ios";
138 } else {
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000139 PlatformName = "macosx";
140 Rev = Min;
141 Min = Maj - 4;
142 Maj = 10;
143 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000144 } else {
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000145 Triple.getOSVersion(Maj, Min, Rev);
Daniel Dunbara4ff6482011-04-19 23:34:21 +0000146 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000147 }
148 }
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000149
Chad Rosierd9259f32011-07-19 20:00:06 +0000150 // If -ccc-host-triple arch-pc-win32-macho option specified, we're
Eric Christopher895d4222011-07-29 21:20:35 +0000151 // generating code for Win32 ABI. No need to emit
Chad Rosierd9259f32011-07-19 20:00:06 +0000152 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
153 if (PlatformName == "win32") {
154 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
155 return;
156 }
157
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000158 // Set the appropriate OS version define.
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000159 if (PlatformName == "ios") {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000160 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000161 char Str[6];
162 Str[0] = '0' + Maj;
163 Str[1] = '0' + (Min / 10);
164 Str[2] = '0' + (Min % 10);
165 Str[3] = '0' + (Rev / 10);
166 Str[4] = '0' + (Rev % 10);
167 Str[5] = '\0';
168 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
169 } else {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000170 // Note that the Driver allows versions which aren't representable in the
171 // define (because we only get a single digit for the minor and micro
172 // revision numbers). So, we limit them to the maximum representable
173 // version.
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000174 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000175 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000176 char Str[5];
177 Str[0] = '0' + (Maj / 10);
178 Str[1] = '0' + (Maj % 10);
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000179 Str[2] = '0' + std::min(Min, 9U);
180 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000181 Str[4] = '\0';
182 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000183 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000184
185 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman618234a2008-08-20 02:34:37 +0000186}
Reid Spencer5f016e22007-07-11 17:01:13 +0000187
Chris Lattner797c3c42009-08-10 19:03:04 +0000188namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000189template<typename Target>
190class DarwinTargetInfo : public OSTargetInfo<Target> {
191protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000192 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000193 MacroBuilder &Builder) const {
Eric Christopher7c9adf92011-07-07 22:55:26 +0000194 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000195 this->PlatformMinVersion);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000196 }
Mike Stump1eb44332009-09-09 15:08:12 +0000197
Torok Edwin5f6c1942009-06-30 17:10:35 +0000198public:
199 DarwinTargetInfo(const std::string& triple) :
200 OSTargetInfo<Target>(triple) {
Eric Christopheraa7333c2011-07-02 00:20:22 +0000201 llvm::Triple T = llvm::Triple(triple);
202 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
Daniel Dunbare177d3b2011-02-21 23:12:51 +0000203 this->MCountName = "\01mcount";
Torok Edwin5f6c1942009-06-30 17:10:35 +0000204 }
205
Chris Lattner5f9e2722011-07-23 10:55:15 +0000206 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner797c3c42009-08-10 19:03:04 +0000207 // Let MCSectionMachO validate this.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000208 StringRef Segment, Section;
Chris Lattner797c3c42009-08-10 19:03:04 +0000209 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000210 bool HasTAA;
Chris Lattner797c3c42009-08-10 19:03:04 +0000211 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000212 TAA, HasTAA, StubSize);
Chris Lattner797c3c42009-08-10 19:03:04 +0000213 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000214
Anders Carlsson18af3682010-06-08 22:47:50 +0000215 virtual const char *getStaticInitSectionSpecifier() const {
216 // FIXME: We should return 0 when building kexts.
217 return "__TEXT,__StaticInit,regular,pure_instructions";
218 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000219
Torok Edwin5f6c1942009-06-30 17:10:35 +0000220};
221
Chris Lattner797c3c42009-08-10 19:03:04 +0000222
Torok Edwin5f6c1942009-06-30 17:10:35 +0000223// DragonFlyBSD Target
224template<typename Target>
225class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
226protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000227 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000228 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000229 // DragonFly defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000230 Builder.defineMacro("__DragonFly__");
231 Builder.defineMacro("__DragonFly_cc_version", "100001");
232 Builder.defineMacro("__ELF__");
233 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
234 Builder.defineMacro("__tune_i386__");
235 DefineStd(Builder, "unix", Opts);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000236 }
237public:
Mike Stump1eb44332009-09-09 15:08:12 +0000238 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000239 : OSTargetInfo<Target>(triple) {}
240};
241
242// FreeBSD Target
243template<typename Target>
244class FreeBSDTargetInfo : public OSTargetInfo<Target> {
245protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000246 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000247 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000248 // FreeBSD defines; list based off of gcc output
249
Benjamin Kramer474202f2011-10-18 10:10:08 +0000250 unsigned Release = Triple.getOSMajorVersion();
251 if (Release == 0U)
252 Release = 8;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000253
Benjamin Kramer474202f2011-10-18 10:10:08 +0000254 Builder.defineMacro("__FreeBSD__", Twine(Release));
255 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramera9992772010-01-09 17:55:51 +0000256 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
257 DefineStd(Builder, "unix", Opts);
258 Builder.defineMacro("__ELF__");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000259 }
260public:
Mike Stump1eb44332009-09-09 15:08:12 +0000261 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands1e90faf2009-07-08 13:55:08 +0000262 : OSTargetInfo<Target>(triple) {
263 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000264
265 llvm::Triple Triple(triple);
266 switch (Triple.getArch()) {
267 default:
268 case llvm::Triple::x86:
269 case llvm::Triple::x86_64:
270 this->MCountName = ".mcount";
271 break;
272 case llvm::Triple::mips:
273 case llvm::Triple::mipsel:
274 case llvm::Triple::ppc:
275 case llvm::Triple::ppc64:
276 this->MCountName = "_mcount";
277 break;
278 case llvm::Triple::arm:
279 this->MCountName = "__mcount";
280 break;
281 }
282
Duncan Sands1e90faf2009-07-08 13:55:08 +0000283 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000284};
285
Chris Lattner38e317d2010-07-07 16:01:42 +0000286// Minix Target
287template<typename Target>
288class MinixTargetInfo : public OSTargetInfo<Target> {
289protected:
290 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
291 MacroBuilder &Builder) const {
292 // Minix defines
293
294 Builder.defineMacro("__minix", "3");
295 Builder.defineMacro("_EM_WSIZE", "4");
296 Builder.defineMacro("_EM_PSIZE", "4");
297 Builder.defineMacro("_EM_SSIZE", "2");
298 Builder.defineMacro("_EM_LSIZE", "4");
299 Builder.defineMacro("_EM_FSIZE", "4");
300 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman6d402dc2011-12-08 23:54:21 +0000301 Builder.defineMacro("__ELF__");
Chris Lattner38e317d2010-07-07 16:01:42 +0000302 DefineStd(Builder, "unix", Opts);
303 }
304public:
305 MinixTargetInfo(const std::string &triple)
306 : OSTargetInfo<Target>(triple) {
307 this->UserLabelPrefix = "";
308 }
309};
310
Torok Edwin5f6c1942009-06-30 17:10:35 +0000311// Linux target
312template<typename Target>
313class LinuxTargetInfo : public OSTargetInfo<Target> {
314protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000315 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000316 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000317 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000318 DefineStd(Builder, "unix", Opts);
319 DefineStd(Builder, "linux", Opts);
320 Builder.defineMacro("__gnu_linux__");
321 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000322 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000323 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000324 if (Opts.CPlusPlus)
325 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000326 }
327public:
Mike Stump1eb44332009-09-09 15:08:12 +0000328 LinuxTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000329 : OSTargetInfo<Target>(triple) {
330 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000331 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000332 }
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000333
334 virtual const char *getStaticInitSectionSpecifier() const {
335 return ".text.startup";
336 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000337};
338
Chris Lattnerb62bb282009-07-13 20:29:08 +0000339// NetBSD Target
340template<typename Target>
341class NetBSDTargetInfo : public OSTargetInfo<Target> {
342protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000343 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000344 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000345 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000346 Builder.defineMacro("__NetBSD__");
347 Builder.defineMacro("__unix__");
348 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000349 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000350 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000351 }
352public:
Mike Stump1eb44332009-09-09 15:08:12 +0000353 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerb62bb282009-07-13 20:29:08 +0000354 : OSTargetInfo<Target>(triple) {
355 this->UserLabelPrefix = "";
356 }
357};
358
Torok Edwin5f6c1942009-06-30 17:10:35 +0000359// OpenBSD Target
360template<typename Target>
361class OpenBSDTargetInfo : public OSTargetInfo<Target> {
362protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000363 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000364 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000365 // OpenBSD defines; list based off of gcc output
366
Benjamin Kramera9992772010-01-09 17:55:51 +0000367 Builder.defineMacro("__OpenBSD__");
368 DefineStd(Builder, "unix", Opts);
369 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000370 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000371 Builder.defineMacro("_POSIX_THREADS");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000372 }
373public:
Mike Stump1eb44332009-09-09 15:08:12 +0000374 OpenBSDTargetInfo(const std::string &triple)
Eli Friedman62d829a2011-12-15 02:15:56 +0000375 : OSTargetInfo<Target>(triple) {
376 this->UserLabelPrefix = "";
377
378 llvm::Triple Triple(triple);
379 switch (Triple.getArch()) {
380 default:
381 case llvm::Triple::x86:
382 case llvm::Triple::x86_64:
383 case llvm::Triple::arm:
384 case llvm::Triple::sparc:
385 this->MCountName = "__mcount";
386 break;
387 case llvm::Triple::mips64:
388 case llvm::Triple::mips64el:
389 case llvm::Triple::ppc:
390 case llvm::Triple::sparcv9:
391 this->MCountName = "_mcount";
392 break;
393 }
394 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000395};
396
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000397// PSP Target
398template<typename Target>
399class PSPTargetInfo : public OSTargetInfo<Target> {
400protected:
401 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000402 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000403 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000404 Builder.defineMacro("PSP");
405 Builder.defineMacro("_PSP");
406 Builder.defineMacro("__psp__");
407 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000408 }
409public:
410 PSPTargetInfo(const std::string& triple)
411 : OSTargetInfo<Target>(triple) {
412 this->UserLabelPrefix = "";
413 }
414};
415
John Thompson3f6918a2009-11-19 17:18:50 +0000416// PS3 PPU Target
417template<typename Target>
418class PS3PPUTargetInfo : public OSTargetInfo<Target> {
419protected:
420 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000421 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000422 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000423 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000424 Builder.defineMacro("__PPU__");
425 Builder.defineMacro("__CELLOS_LV2__");
426 Builder.defineMacro("__ELF__");
427 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000428 Builder.defineMacro("_ARCH_PPC64");
429 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000430 }
431public:
432 PS3PPUTargetInfo(const std::string& triple)
433 : OSTargetInfo<Target>(triple) {
434 this->UserLabelPrefix = "";
Nick Lewycky99520702011-12-16 22:32:39 +0000435 this->LongWidth = this->LongAlign = 32;
436 this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000437 this->IntMaxType = TargetInfo::SignedLongLong;
438 this->UIntMaxType = TargetInfo::UnsignedLongLong;
439 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000440 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000441 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Nick Lewycky99520702011-12-16 22:32:39 +0000442 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000443 }
444};
445
446// FIXME: Need a real SPU target.
447// PS3 SPU Target
448template<typename Target>
449class PS3SPUTargetInfo : public OSTargetInfo<Target> {
450protected:
451 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000452 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000453 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000454 Builder.defineMacro("__SPU__");
455 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000456 }
457public:
458 PS3SPUTargetInfo(const std::string& triple)
459 : OSTargetInfo<Target>(triple) {
460 this->UserLabelPrefix = "";
461 }
462};
463
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000464// AuroraUX target
465template<typename Target>
466class AuroraUXTargetInfo : public OSTargetInfo<Target> {
467protected:
468 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000469 MacroBuilder &Builder) const {
470 DefineStd(Builder, "sun", Opts);
471 DefineStd(Builder, "unix", Opts);
472 Builder.defineMacro("__ELF__");
473 Builder.defineMacro("__svr4__");
474 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000475 }
476public:
477 AuroraUXTargetInfo(const std::string& triple)
478 : OSTargetInfo<Target>(triple) {
479 this->UserLabelPrefix = "";
480 this->WCharType = this->SignedLong;
481 // FIXME: WIntType should be SignedLong
482 }
483};
484
Torok Edwin5f6c1942009-06-30 17:10:35 +0000485// Solaris target
486template<typename Target>
487class SolarisTargetInfo : public OSTargetInfo<Target> {
488protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000489 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000490 MacroBuilder &Builder) const {
491 DefineStd(Builder, "sun", Opts);
492 DefineStd(Builder, "unix", Opts);
493 Builder.defineMacro("__ELF__");
494 Builder.defineMacro("__svr4__");
495 Builder.defineMacro("__SVR4");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000496 }
497public:
Mike Stump1eb44332009-09-09 15:08:12 +0000498 SolarisTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000499 : OSTargetInfo<Target>(triple) {
500 this->UserLabelPrefix = "";
501 this->WCharType = this->SignedLong;
502 // FIXME: WIntType should be SignedLong
503 }
504};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000505
506// Windows target
507template<typename Target>
508class WindowsTargetInfo : public OSTargetInfo<Target> {
509protected:
510 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
511 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000512 Builder.defineMacro("_WIN32");
513 }
514 void getVisualStudioDefines(const LangOptions &Opts,
515 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000516 if (Opts.CPlusPlus) {
517 if (Opts.RTTI)
518 Builder.defineMacro("_CPPRTTI");
519
520 if (Opts.Exceptions)
521 Builder.defineMacro("_CPPUNWIND");
522 }
523
524 if (!Opts.CharIsSigned)
525 Builder.defineMacro("_CHAR_UNSIGNED");
526
527 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
528 // but it works for now.
529 if (Opts.POSIXThreads)
530 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000531
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000532 if (Opts.MSCVersion != 0)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000533 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000534
Francois Pichet62ec1f22011-09-17 17:15:52 +0000535 if (Opts.MicrosoftExt) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000536 Builder.defineMacro("_MSC_EXTENSIONS");
537
538 if (Opts.CPlusPlus0x) {
539 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
540 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
541 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
542 }
543 }
544
545 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000546 }
547
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000548public:
549 WindowsTargetInfo(const std::string &triple)
550 : OSTargetInfo<Target>(triple) {}
551};
552
Mike Stump1eb44332009-09-09 15:08:12 +0000553} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000554
Chris Lattnerd29b6302008-10-05 21:50:58 +0000555//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000556// Specific target implementations.
557//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000558
Eli Friedmane4277982008-08-20 23:11:40 +0000559namespace {
560// PPC abstract base class
561class PPCTargetInfo : public TargetInfo {
562 static const Builtin::Info BuiltinInfo[];
563 static const char * const GCCRegNames[];
564 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Eli Friedmane4277982008-08-20 23:11:40 +0000565public:
Eli Friedman15b91762009-06-05 07:05:05 +0000566 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
567
Eli Friedmane4277982008-08-20 23:11:40 +0000568 virtual void getTargetBuiltins(const Builtin::Info *&Records,
569 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000570 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000571 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000572 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000573
Chris Lattner33328642009-03-20 15:52:06 +0000574 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000575 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000576
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000577 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000578 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000579 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000580 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000581 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000582 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000583 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000584 default: return false;
585 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000586 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000587 case 'b': // Base register
588 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000589 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000590 break;
591 // FIXME: The following are added to allow parsing.
592 // I just took a guess at what the actions should be.
593 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000594 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000595 case 'v': // Altivec vector register
596 Info.setAllowsRegister();
597 break;
598 case 'w':
599 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000600 case 'd':// VSX vector register to hold vector double data
601 case 'f':// VSX vector register to hold vector float data
602 case 's':// VSX vector register to hold scalar float data
603 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000604 break;
605 default:
606 return false;
607 }
608 Info.setAllowsRegister();
609 Name++; // Skip over 'w'.
610 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000611 case 'h': // `MQ', `CTR', or `LINK' register
612 case 'q': // `MQ' register
613 case 'c': // `CTR' register
614 case 'l': // `LINK' register
615 case 'x': // `CR' register (condition register) number 0
616 case 'y': // `CR' register (condition register)
617 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000618 Info.setAllowsRegister();
619 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000620 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000621 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000622 // (use `L' instead for SImode constants)
623 case 'K': // Unsigned 16-bit constant
624 case 'L': // Signed 16-bit constant shifted left 16 bits
625 case 'M': // Constant larger than 31
626 case 'N': // Exact power of 2
627 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000628 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000629 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000630 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000631 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000632 break;
633 case 'm': // Memory operand. Note that on PowerPC targets, m can
634 // include addresses that update the base register. It
635 // is therefore only safe to use `m' in an asm statement
636 // if that asm statement accesses the operand exactly once.
637 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000638 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000639 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000640 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000641 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000642 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
643 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000644 // register to be updated.
645 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000646 if (Name[1] != 's')
647 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000648 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000649 // include any automodification of the base register. Unlike
650 // `m', this constraint can be used in asm statements that
651 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000652 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000653 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000654 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000655 break;
656 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000657 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000658 case 'Z': // Memory operand that is an indexed or indirect from a
659 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000660 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000661 Info.setAllowsMemory();
662 Info.setAllowsRegister();
663 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000664 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000665 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000666 // register (`p' is preferable for asm statements)
667 case 'S': // Constant suitable as a 64-bit mask operand
668 case 'T': // Constant suitable as a 32-bit mask operand
669 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000670 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000671 // instructions
672 case 'W': // Vector constant that does not require memory
673 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000674 break;
675 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000676 }
John Thompson8e6065a2010-06-24 22:44:13 +0000677 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000678 }
Eli Friedmane4277982008-08-20 23:11:40 +0000679 virtual const char *getClobbers() const {
680 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000681 }
Eli Friedmane4277982008-08-20 23:11:40 +0000682};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000683
Eli Friedmane4277982008-08-20 23:11:40 +0000684const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000685#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000686#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000687 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000688#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000689};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000690
691
Chris Lattnerc0f59212009-03-02 22:27:17 +0000692/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
693/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000694void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000695 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000696 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000697 Builder.defineMacro("__ppc__");
698 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000699 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000700 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000701 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000702 Builder.defineMacro("_ARCH_PPC64");
703 Builder.defineMacro("_LP64");
704 Builder.defineMacro("__LP64__");
Chris Lattnere03ae302010-02-16 18:14:57 +0000705 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000706 Builder.defineMacro("__ppc64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000707 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +0000708 Builder.defineMacro("__ppc__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000709 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000710
Chris Lattnerc0f59212009-03-02 22:27:17 +0000711 // Target properties.
Joerg Sonnenberger7cd1de52011-07-05 14:56:12 +0000712 if (getTriple().getOS() != llvm::Triple::NetBSD)
713 Builder.defineMacro("_BIG_ENDIAN");
Benjamin Kramera9992772010-01-09 17:55:51 +0000714 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000715
Chris Lattnerc0f59212009-03-02 22:27:17 +0000716 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000717 Builder.defineMacro("__NATURAL_ALIGNMENT__");
718 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000719
Chris Lattnerc0f59212009-03-02 22:27:17 +0000720 // FIXME: Should be controlled by command line option.
Benjamin Kramera9992772010-01-09 17:55:51 +0000721 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000722
John Thompson3f6918a2009-11-19 17:18:50 +0000723 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000724 Builder.defineMacro("__VEC__", "10206");
725 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000726 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000727}
728
Chris Lattner393ff042008-04-21 18:56:49 +0000729
Eli Friedmane4277982008-08-20 23:11:40 +0000730const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +0000731 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
732 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
733 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
734 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
735 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
736 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
737 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
738 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +0000739 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000740 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +0000741 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000742 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
743 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
744 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
745 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +0000746 "vrsave", "vscr",
747 "spe_acc", "spefscr",
748 "sfp"
749};
Reid Spencer5f016e22007-07-11 17:01:13 +0000750
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000751void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000752 unsigned &NumNames) const {
753 Names = GCCRegNames;
754 NumNames = llvm::array_lengthof(GCCRegNames);
755}
Reid Spencer5f016e22007-07-11 17:01:13 +0000756
Eli Friedmane4277982008-08-20 23:11:40 +0000757const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
758 // While some of these aliases do map to different registers
759 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000760 { { "0" }, "r0" },
761 { { "1"}, "r1" },
762 { { "2" }, "r2" },
763 { { "3" }, "r3" },
764 { { "4" }, "r4" },
765 { { "5" }, "r5" },
766 { { "6" }, "r6" },
767 { { "7" }, "r7" },
768 { { "8" }, "r8" },
769 { { "9" }, "r9" },
770 { { "10" }, "r10" },
771 { { "11" }, "r11" },
772 { { "12" }, "r12" },
773 { { "13" }, "r13" },
774 { { "14" }, "r14" },
775 { { "15" }, "r15" },
776 { { "16" }, "r16" },
777 { { "17" }, "r17" },
778 { { "18" }, "r18" },
779 { { "19" }, "r19" },
780 { { "20" }, "r20" },
781 { { "21" }, "r21" },
782 { { "22" }, "r22" },
783 { { "23" }, "r23" },
784 { { "24" }, "r24" },
785 { { "25" }, "r25" },
786 { { "26" }, "r26" },
787 { { "27" }, "r27" },
788 { { "28" }, "r28" },
789 { { "29" }, "r29" },
790 { { "30" }, "r30" },
791 { { "31" }, "r31" },
792 { { "fr0" }, "f0" },
793 { { "fr1" }, "f1" },
794 { { "fr2" }, "f2" },
795 { { "fr3" }, "f3" },
796 { { "fr4" }, "f4" },
797 { { "fr5" }, "f5" },
798 { { "fr6" }, "f6" },
799 { { "fr7" }, "f7" },
800 { { "fr8" }, "f8" },
801 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +0000802 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000803 { { "fr11" }, "f11" },
804 { { "fr12" }, "f12" },
805 { { "fr13" }, "f13" },
806 { { "fr14" }, "f14" },
807 { { "fr15" }, "f15" },
808 { { "fr16" }, "f16" },
809 { { "fr17" }, "f17" },
810 { { "fr18" }, "f18" },
811 { { "fr19" }, "f19" },
812 { { "fr20" }, "f20" },
813 { { "fr21" }, "f21" },
814 { { "fr22" }, "f22" },
815 { { "fr23" }, "f23" },
816 { { "fr24" }, "f24" },
817 { { "fr25" }, "f25" },
818 { { "fr26" }, "f26" },
819 { { "fr27" }, "f27" },
820 { { "fr28" }, "f28" },
821 { { "fr29" }, "f29" },
822 { { "fr30" }, "f30" },
823 { { "fr31" }, "f31" },
824 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +0000825};
826
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000827void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000828 unsigned &NumAliases) const {
829 Aliases = GCCRegAliases;
830 NumAliases = llvm::array_lengthof(GCCRegAliases);
831}
832} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +0000833
834namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000835class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000836public:
Chris Lattnere03ae302010-02-16 18:14:57 +0000837 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +0000838 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 +0000839 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +0000840
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +0000841 switch (getTriple().getOS()) {
842 case llvm::Triple::FreeBSD:
843 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +0000844 SizeType = UnsignedInt;
845 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +0000846 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +0000847 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +0000848 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000849 }
850
851 virtual const char *getVAListDeclaration() const {
852 // This is the ELF definition, and is overridden by the Darwin sub-target
853 return "typedef struct __va_list_tag {"
854 " unsigned char gpr;"
855 " unsigned char fpr;"
856 " unsigned short reserved;"
857 " void* overflow_arg_area;"
858 " void* reg_save_area;"
859 "} __builtin_va_list[1];";
Eli Friedmaned855cb2008-08-21 00:13:15 +0000860 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000861};
862} // end anonymous namespace.
863
864namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000865class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000866public:
Eli Friedmane4277982008-08-20 23:11:40 +0000867 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000868 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +0000869 IntMaxType = SignedLong;
870 UIntMaxType = UnsignedLong;
871 Int64Type = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000872 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 +0000873 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerf291b102008-05-09 06:17:04 +0000874 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000875 virtual const char *getVAListDeclaration() const {
876 return "typedef char* __builtin_va_list;";
877 }
Eli Friedmane4277982008-08-20 23:11:40 +0000878};
879} // end anonymous namespace.
880
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000881
882namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +0000883class DarwinPPC32TargetInfo :
884 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000885public:
Roman Divackyc81f2a22011-01-06 08:27:10 +0000886 DarwinPPC32TargetInfo(const std::string& triple)
887 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000888 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +0000889 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
890 }
891 virtual const char *getVAListDeclaration() const {
892 return "typedef char* __builtin_va_list;";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000893 }
894};
895
896class DarwinPPC64TargetInfo :
897 public DarwinTargetInfo<PPC64TargetInfo> {
898public:
899 DarwinPPC64TargetInfo(const std::string& triple)
900 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
901 HasAlignMac68kSupport = true;
902 }
903};
904} // end anonymous namespace.
905
Reid Spencer5f016e22007-07-11 17:01:13 +0000906namespace {
Justin Holewinski25bedca2011-10-03 17:28:37 +0000907 static const unsigned PTXAddrSpaceMap[] = {
908 0, // opencl_global
909 4, // opencl_local
910 1 // opencl_constant
911 };
Justin Holewinski285dc652011-04-20 19:34:15 +0000912 class PTXTargetInfo : public TargetInfo {
913 static const char * const GCCRegNames[];
914 static const Builtin::Info BuiltinInfo[];
Justin Holewinskid8e0fe62011-09-22 17:57:40 +0000915 std::vector<llvm::StringRef> AvailableFeatures;
Justin Holewinski285dc652011-04-20 19:34:15 +0000916 public:
917 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
918 TLSSupported = false;
919 LongWidth = LongAlign = 64;
Justin Holewinski25bedca2011-10-03 17:28:37 +0000920 AddrSpaceMap = &PTXAddrSpaceMap;
Justin Holewinskid8e0fe62011-09-22 17:57:40 +0000921 // Define available target features
922 // These must be defined in sorted order!
923 AvailableFeatures.push_back("compute10");
924 AvailableFeatures.push_back("compute11");
925 AvailableFeatures.push_back("compute12");
926 AvailableFeatures.push_back("compute13");
927 AvailableFeatures.push_back("compute20");
928 AvailableFeatures.push_back("double");
929 AvailableFeatures.push_back("no-fma");
930 AvailableFeatures.push_back("ptx20");
931 AvailableFeatures.push_back("ptx21");
932 AvailableFeatures.push_back("ptx22");
933 AvailableFeatures.push_back("ptx23");
934 AvailableFeatures.push_back("sm10");
935 AvailableFeatures.push_back("sm11");
936 AvailableFeatures.push_back("sm12");
937 AvailableFeatures.push_back("sm13");
938 AvailableFeatures.push_back("sm20");
939 AvailableFeatures.push_back("sm21");
940 AvailableFeatures.push_back("sm22");
941 AvailableFeatures.push_back("sm23");
Justin Holewinski285dc652011-04-20 19:34:15 +0000942 }
943 virtual void getTargetDefines(const LangOptions &Opts,
944 MacroBuilder &Builder) const {
945 Builder.defineMacro("__PTX__");
946 }
947 virtual void getTargetBuiltins(const Builtin::Info *&Records,
948 unsigned &NumRecords) const {
949 Records = BuiltinInfo;
950 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
951 }
952
953 virtual void getGCCRegNames(const char * const *&Names,
954 unsigned &NumNames) const;
955 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
956 unsigned &NumAliases) const {
957 // No aliases.
958 Aliases = 0;
959 NumAliases = 0;
960 }
961 virtual bool validateAsmConstraint(const char *&Name,
962 TargetInfo::ConstraintInfo &info) const {
963 // FIXME: implement
964 return true;
965 }
966 virtual const char *getClobbers() const {
967 // FIXME: Is this really right?
968 return "";
969 }
970 virtual const char *getVAListDeclaration() const {
971 // FIXME: implement
972 return "typedef char* __builtin_va_list;";
973 }
Justin Holewinski808ef662011-09-15 12:13:38 +0000974
975 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
976 const std::string &Name,
977 bool Enabled) const;
Justin Holewinski285dc652011-04-20 19:34:15 +0000978 };
979
980 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000981#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +0000982#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000983 ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +0000984#include "clang/Basic/BuiltinsPTX.def"
985 };
986
987 const char * const PTXTargetInfo::GCCRegNames[] = {
988 "r0"
989 };
990
991 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
992 unsigned &NumNames) const {
993 Names = GCCRegNames;
994 NumNames = llvm::array_lengthof(GCCRegNames);
995 }
996
Justin Holewinski808ef662011-09-15 12:13:38 +0000997 bool PTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
998 const std::string &Name,
999 bool Enabled) const {
Justin Holewinskid8e0fe62011-09-22 17:57:40 +00001000 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1001 Name)) {
1002 Features[Name] = Enabled;
1003 return true;
Justin Holewinski808ef662011-09-15 12:13:38 +00001004 } else {
Justin Holewinskid8e0fe62011-09-22 17:57:40 +00001005 return false;
Justin Holewinski808ef662011-09-15 12:13:38 +00001006 }
Justin Holewinski808ef662011-09-15 12:13:38 +00001007 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001008
1009 class PTX32TargetInfo : public PTXTargetInfo {
1010 public:
1011 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1012 PointerWidth = PointerAlign = 32;
1013 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
1014 DescriptionString
1015 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
1016 }
1017 };
1018
1019 class PTX64TargetInfo : public PTXTargetInfo {
1020 public:
1021 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1022 PointerWidth = PointerAlign = 64;
1023 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
1024 DescriptionString
1025 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
1026 }
1027 };
1028}
1029
1030namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +00001031// MBlaze abstract base class
1032class MBlazeTargetInfo : public TargetInfo {
1033 static const char * const GCCRegNames[];
1034 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1035
1036public:
1037 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +00001038 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +00001039 }
1040
1041 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1042 unsigned &NumRecords) const {
1043 // FIXME: Implement.
1044 Records = 0;
1045 NumRecords = 0;
1046 }
1047
1048 virtual void getTargetDefines(const LangOptions &Opts,
1049 MacroBuilder &Builder) const;
1050
1051 virtual const char *getVAListDeclaration() const {
1052 return "typedef char* __builtin_va_list;";
1053 }
1054 virtual const char *getTargetPrefix() const {
1055 return "mblaze";
1056 }
1057 virtual void getGCCRegNames(const char * const *&Names,
1058 unsigned &NumNames) const;
1059 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1060 unsigned &NumAliases) const;
1061 virtual bool validateAsmConstraint(const char *&Name,
1062 TargetInfo::ConstraintInfo &Info) const {
1063 switch (*Name) {
1064 default: return false;
1065 case 'O': // Zero
1066 return true;
1067 case 'b': // Base register
1068 case 'f': // Floating point register
1069 Info.setAllowsRegister();
1070 return true;
1071 }
1072 }
1073 virtual const char *getClobbers() const {
1074 return "";
1075 }
1076};
1077
1078/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1079/// #defines that are not tied to a specific subtarget.
1080void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1081 MacroBuilder &Builder) const {
1082 // Target identification.
1083 Builder.defineMacro("__microblaze__");
1084 Builder.defineMacro("_ARCH_MICROBLAZE");
1085 Builder.defineMacro("__MICROBLAZE__");
1086
1087 // Target properties.
1088 Builder.defineMacro("_BIG_ENDIAN");
1089 Builder.defineMacro("__BIG_ENDIAN__");
1090
1091 // Subtarget options.
1092 Builder.defineMacro("__REGISTER_PREFIX__", "");
1093}
1094
1095
1096const char * const MBlazeTargetInfo::GCCRegNames[] = {
1097 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1098 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1099 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1100 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1101 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1102 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1103 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1104 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1105 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1106 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1107};
1108
1109void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1110 unsigned &NumNames) const {
1111 Names = GCCRegNames;
1112 NumNames = llvm::array_lengthof(GCCRegNames);
1113}
1114
1115const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1116 { {"f0"}, "r0" },
1117 { {"f1"}, "r1" },
1118 { {"f2"}, "r2" },
1119 { {"f3"}, "r3" },
1120 { {"f4"}, "r4" },
1121 { {"f5"}, "r5" },
1122 { {"f6"}, "r6" },
1123 { {"f7"}, "r7" },
1124 { {"f8"}, "r8" },
1125 { {"f9"}, "r9" },
1126 { {"f10"}, "r10" },
1127 { {"f11"}, "r11" },
1128 { {"f12"}, "r12" },
1129 { {"f13"}, "r13" },
1130 { {"f14"}, "r14" },
1131 { {"f15"}, "r15" },
1132 { {"f16"}, "r16" },
1133 { {"f17"}, "r17" },
1134 { {"f18"}, "r18" },
1135 { {"f19"}, "r19" },
1136 { {"f20"}, "r20" },
1137 { {"f21"}, "r21" },
1138 { {"f22"}, "r22" },
1139 { {"f23"}, "r23" },
1140 { {"f24"}, "r24" },
1141 { {"f25"}, "r25" },
1142 { {"f26"}, "r26" },
1143 { {"f27"}, "r27" },
1144 { {"f28"}, "r28" },
1145 { {"f29"}, "r29" },
1146 { {"f30"}, "r30" },
1147 { {"f31"}, "r31" },
1148};
1149
1150void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1151 unsigned &NumAliases) const {
1152 Aliases = GCCRegAliases;
1153 NumAliases = llvm::array_lengthof(GCCRegAliases);
1154}
1155} // end anonymous namespace.
1156
1157namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001158// Namespace for x86 abstract base class
1159const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001160#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001161#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001162 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +00001163#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +00001164};
Eli Friedman61538a72008-05-20 14:21:01 +00001165
Nuno Lopes2550d702009-12-23 17:49:57 +00001166static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +00001167 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1168 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001169 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman618234a2008-08-20 02:34:37 +00001170 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1171 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1172 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001173 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001174 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1175 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman618234a2008-08-20 02:34:37 +00001176};
1177
Eric Christophercfd323d2011-06-21 00:05:20 +00001178const TargetInfo::AddlRegName AddlRegNames[] = {
1179 { { "al", "ah", "eax", "rax" }, 0 },
1180 { { "bl", "bh", "ebx", "rbx" }, 3 },
1181 { { "cl", "ch", "ecx", "rcx" }, 2 },
1182 { { "dl", "dh", "edx", "rdx" }, 1 },
1183 { { "esi", "rsi" }, 4 },
1184 { { "edi", "rdi" }, 5 },
1185 { { "esp", "rsp" }, 7 },
1186 { { "ebp", "rbp" }, 6 },
Eli Friedman618234a2008-08-20 02:34:37 +00001187};
1188
1189// X86 target abstract base class; x86-32 and x86-64 are very close, so
1190// most of the implementation can be shared.
1191class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001192 enum X86SSEEnum {
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001193 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
Chris Lattner84f0ea82009-03-02 22:40:39 +00001194 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001195 enum MMX3DNowEnum {
1196 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1197 } MMX3DNowLevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001198
Eric Christophereea12d12010-04-02 23:50:19 +00001199 bool HasAES;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001200 bool HasAVX;
Craig Topper2b03bb02011-12-17 19:55:21 +00001201 bool HasAVX2;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001202
Chandler Carruth499d9722011-09-28 08:55:34 +00001203 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1204 ///
1205 /// Each enumeration represents a particular CPU supported by Clang. These
1206 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1207 enum CPUKind {
1208 CK_Generic,
1209
1210 /// \name i386
1211 /// i386-generation processors.
1212 //@{
1213 CK_i386,
1214 //@}
1215
1216 /// \name i486
1217 /// i486-generation processors.
1218 //@{
1219 CK_i486,
1220 CK_WinChipC6,
1221 CK_WinChip2,
1222 CK_C3,
1223 //@}
1224
1225 /// \name i586
1226 /// i586-generation processors, P5 microarchitecture based.
1227 //@{
1228 CK_i586,
1229 CK_Pentium,
1230 CK_PentiumMMX,
1231 //@}
1232
1233 /// \name i686
1234 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1235 //@{
1236 CK_i686,
1237 CK_PentiumPro,
1238 CK_Pentium2,
1239 CK_Pentium3,
1240 CK_Pentium3M,
1241 CK_PentiumM,
1242 CK_C3_2,
1243
1244 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1245 /// Clang however has some logic to suport this.
1246 // FIXME: Warn, deprecate, and potentially remove this.
1247 CK_Yonah,
1248 //@}
1249
1250 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001251 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001252 //@{
1253 CK_Pentium4,
1254 CK_Pentium4M,
1255 CK_Prescott,
1256 CK_Nocona,
1257 //@}
1258
1259 /// \name Core
1260 /// Core microarchitecture based processors.
1261 //@{
1262 CK_Core2,
1263
1264 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1265 /// codename which GCC no longer accepts as an option to -march, but Clang
1266 /// has some logic for recognizing it.
1267 // FIXME: Warn, deprecate, and potentially remove this.
1268 CK_Penryn,
1269 //@}
1270
1271 /// \name Atom
1272 /// Atom processors
1273 //@{
1274 CK_Atom,
1275 //@}
1276
1277 /// \name Nehalem
1278 /// Nehalem microarchitecture based processors.
1279 //@{
1280 CK_Corei7,
1281 CK_Corei7AVX,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001282 CK_CoreAVXi,
Craig Topper2b03bb02011-12-17 19:55:21 +00001283 CK_CoreAVX2,
Chandler Carruth499d9722011-09-28 08:55:34 +00001284 //@}
1285
1286 /// \name K6
1287 /// K6 architecture processors.
1288 //@{
1289 CK_K6,
1290 CK_K6_2,
1291 CK_K6_3,
1292 //@}
1293
1294 /// \name K7
1295 /// K7 architecture processors.
1296 //@{
1297 CK_Athlon,
1298 CK_AthlonThunderbird,
1299 CK_Athlon4,
1300 CK_AthlonXP,
1301 CK_AthlonMP,
1302 //@}
1303
1304 /// \name K8
1305 /// K8 architecture processors.
1306 //@{
1307 CK_Athlon64,
1308 CK_Athlon64SSE3,
1309 CK_AthlonFX,
1310 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001311 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001312 CK_Opteron,
1313 CK_OpteronSSE3,
Roman Divacky01c770d2011-10-30 07:48:46 +00001314 CK_AMDFAM10,
Chandler Carruth499d9722011-09-28 08:55:34 +00001315
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001316 /// \name K10
1317 /// K10 architecture processors.
1318 //@{
1319 CK_BDVER1,
1320 CK_BDVER2,
1321
Chandler Carruth499d9722011-09-28 08:55:34 +00001322 /// This specification is deprecated and will be removed in the future.
1323 /// Users should prefer \see CK_K8.
1324 // FIXME: Warn on this when the CPU is set to it.
1325 CK_x86_64,
1326 //@}
1327
1328 /// \name Geode
1329 /// Geode processors.
1330 //@{
1331 CK_Geode
1332 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001333 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001334
Eli Friedman618234a2008-08-20 02:34:37 +00001335public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001336 X86TargetInfo(const std::string& triple)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001337 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Craig Topper2b03bb02011-12-17 19:55:21 +00001338 HasAES(false), HasAVX(false), HasAVX2(false), CPU(CK_Generic) {
Eli Friedman618234a2008-08-20 02:34:37 +00001339 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001340 }
1341 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1342 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001343 Records = BuiltinInfo;
1344 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001345 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001346 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001347 unsigned &NumNames) const {
1348 Names = GCCRegNames;
1349 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001350 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001351 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001352 unsigned &NumAliases) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001353 Aliases = 0;
1354 NumAliases = 0;
1355 }
1356 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1357 unsigned &NumNames) const {
1358 Names = AddlRegNames;
1359 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001360 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001361 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001362 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings002333f2011-06-07 23:45:05 +00001363 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001364 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001365 return "~{dirflag},~{fpsr},~{flags}";
1366 }
Chris Lattner33328642009-03-20 15:52:06 +00001367 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001368 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001369 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1370 const std::string &Name,
1371 bool Enabled) const;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001372 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001373 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001374 virtual const char* getABI() const {
Eli Friedmanee1ad992011-12-02 00:11:43 +00001375 if (PointerWidth == 64 && HasAVX)
1376 return "avx";
1377 else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow)
1378 return "no-mmx";
1379 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001380 }
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001381 virtual bool setCPU(const std::string &Name) {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001382 CPU = llvm::StringSwitch<CPUKind>(Name)
1383 .Case("i386", CK_i386)
1384 .Case("i486", CK_i486)
1385 .Case("winchip-c6", CK_WinChipC6)
1386 .Case("winchip2", CK_WinChip2)
1387 .Case("c3", CK_C3)
1388 .Case("i586", CK_i586)
1389 .Case("pentium", CK_Pentium)
1390 .Case("pentium-mmx", CK_PentiumMMX)
1391 .Case("i686", CK_i686)
1392 .Case("pentiumpro", CK_PentiumPro)
1393 .Case("pentium2", CK_Pentium2)
1394 .Case("pentium3", CK_Pentium3)
1395 .Case("pentium3m", CK_Pentium3M)
1396 .Case("pentium-m", CK_PentiumM)
1397 .Case("c3-2", CK_C3_2)
1398 .Case("yonah", CK_Yonah)
1399 .Case("pentium4", CK_Pentium4)
1400 .Case("pentium4m", CK_Pentium4M)
1401 .Case("prescott", CK_Prescott)
1402 .Case("nocona", CK_Nocona)
1403 .Case("core2", CK_Core2)
1404 .Case("penryn", CK_Penryn)
1405 .Case("atom", CK_Atom)
1406 .Case("corei7", CK_Corei7)
1407 .Case("corei7-avx", CK_Corei7AVX)
1408 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper2b03bb02011-12-17 19:55:21 +00001409 .Case("core-avx2", CK_CoreAVX2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001410 .Case("k6", CK_K6)
1411 .Case("k6-2", CK_K6_2)
1412 .Case("k6-3", CK_K6_3)
1413 .Case("athlon", CK_Athlon)
1414 .Case("athlon-tbird", CK_AthlonThunderbird)
1415 .Case("athlon-4", CK_Athlon4)
1416 .Case("athlon-xp", CK_AthlonXP)
1417 .Case("athlon-mp", CK_AthlonMP)
1418 .Case("athlon64", CK_Athlon64)
1419 .Case("athlon64-sse3", CK_Athlon64SSE3)
1420 .Case("athlon-fx", CK_AthlonFX)
1421 .Case("k8", CK_K8)
1422 .Case("k8-sse3", CK_K8SSE3)
1423 .Case("opteron", CK_Opteron)
1424 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky01c770d2011-10-30 07:48:46 +00001425 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001426 .Case("bdver1", CK_BDVER1)
1427 .Case("bdver2", CK_BDVER2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001428 .Case("x86-64", CK_x86_64)
1429 .Case("geode", CK_Geode)
1430 .Default(CK_Generic);
1431
Chandler Carruth26a39142011-09-28 09:45:08 +00001432 // Perform any per-CPU checks necessary to determine if this CPU is
1433 // acceptable.
1434 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1435 // invalid without explaining *why*.
1436 switch (CPU) {
1437 case CK_Generic:
1438 // No processor selected!
1439 return false;
1440
1441 case CK_i386:
1442 case CK_i486:
1443 case CK_WinChipC6:
1444 case CK_WinChip2:
1445 case CK_C3:
1446 case CK_i586:
1447 case CK_Pentium:
1448 case CK_PentiumMMX:
1449 case CK_i686:
1450 case CK_PentiumPro:
1451 case CK_Pentium2:
1452 case CK_Pentium3:
1453 case CK_Pentium3M:
1454 case CK_PentiumM:
1455 case CK_Yonah:
1456 case CK_C3_2:
1457 case CK_Pentium4:
1458 case CK_Pentium4M:
1459 case CK_Prescott:
1460 case CK_K6:
1461 case CK_K6_2:
1462 case CK_K6_3:
1463 case CK_Athlon:
1464 case CK_AthlonThunderbird:
1465 case CK_Athlon4:
1466 case CK_AthlonXP:
1467 case CK_AthlonMP:
1468 case CK_Geode:
1469 // Only accept certain architectures when compiling in 32-bit mode.
1470 if (PointerWidth != 32)
1471 return false;
1472
1473 // Fallthrough
1474 case CK_Nocona:
1475 case CK_Core2:
1476 case CK_Penryn:
1477 case CK_Atom:
1478 case CK_Corei7:
1479 case CK_Corei7AVX:
1480 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001481 case CK_CoreAVX2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001482 case CK_Athlon64:
1483 case CK_Athlon64SSE3:
1484 case CK_AthlonFX:
1485 case CK_K8:
1486 case CK_K8SSE3:
1487 case CK_Opteron:
1488 case CK_OpteronSSE3:
Roman Divacky01c770d2011-10-30 07:48:46 +00001489 case CK_AMDFAM10:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001490 case CK_BDVER1:
1491 case CK_BDVER2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001492 case CK_x86_64:
1493 return true;
1494 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00001495 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001496 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001497};
Chris Lattner3daed522009-03-02 22:20:04 +00001498
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001499void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001500 // FIXME: This should not be here.
1501 Features["3dnow"] = false;
1502 Features["3dnowa"] = false;
1503 Features["mmx"] = false;
1504 Features["sse"] = false;
1505 Features["sse2"] = false;
1506 Features["sse3"] = false;
1507 Features["ssse3"] = false;
1508 Features["sse41"] = false;
1509 Features["sse42"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00001510 Features["sse4a"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001511 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001512 Features["avx"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00001513 Features["avx2"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001514
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001515 // FIXME: This *really* should not be here.
1516
1517 // X86_64 always has SSE2.
1518 if (PointerWidth == 64)
1519 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1520
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001521 switch (CPU) {
1522 case CK_Generic:
1523 case CK_i386:
1524 case CK_i486:
1525 case CK_i586:
1526 case CK_Pentium:
1527 case CK_i686:
1528 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001529 break;
1530 case CK_PentiumMMX:
1531 case CK_Pentium2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001532 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001533 break;
1534 case CK_Pentium3:
1535 case CK_Pentium3M:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001536 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001537 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001538 break;
1539 case CK_PentiumM:
1540 case CK_Pentium4:
1541 case CK_Pentium4M:
1542 case CK_x86_64:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001543 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001544 setFeatureEnabled(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001545 break;
1546 case CK_Yonah:
1547 case CK_Prescott:
1548 case CK_Nocona:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001549 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001550 setFeatureEnabled(Features, "sse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001551 break;
1552 case CK_Core2:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001553 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001554 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001555 break;
1556 case CK_Penryn:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001557 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001558 setFeatureEnabled(Features, "sse4", true);
1559 Features["sse42"] = false;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001560 break;
1561 case CK_Atom:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001562 setFeatureEnabled(Features, "mmx", true);
Chandler Carruth49defe62011-09-28 10:36:46 +00001563 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001564 break;
1565 case CK_Corei7:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001566 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001567 setFeatureEnabled(Features, "sse4", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001568 setFeatureEnabled(Features, "aes", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001569 break;
1570 case CK_Corei7AVX:
1571 case CK_CoreAVXi:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001572 setFeatureEnabled(Features, "mmx", true);
Roman Divackybcaa3b82011-04-05 20:32:44 +00001573 setFeatureEnabled(Features, "sse4", true);
1574 setFeatureEnabled(Features, "aes", true);
Bruno Cardoso Lopese02d3912011-07-11 23:33:46 +00001575 //setFeatureEnabled(Features, "avx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001576 break;
Craig Topper2b03bb02011-12-17 19:55:21 +00001577 case CK_CoreAVX2:
1578 setFeatureEnabled(Features, "mmx", true);
1579 setFeatureEnabled(Features, "sse4", true);
1580 setFeatureEnabled(Features, "aes", true);
1581 //setFeatureEnabled(Features, "avx2", true);
1582 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001583 case CK_K6:
1584 case CK_WinChipC6:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001585 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001586 break;
1587 case CK_K6_2:
1588 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001589 case CK_WinChip2:
1590 case CK_C3:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001591 setFeatureEnabled(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001592 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00001593 case CK_Athlon:
1594 case CK_AthlonThunderbird:
1595 case CK_Geode:
1596 setFeatureEnabled(Features, "3dnowa", true);
1597 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001598 case CK_Athlon4:
1599 case CK_AthlonXP:
1600 case CK_AthlonMP:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001601 setFeatureEnabled(Features, "sse", true);
1602 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001603 break;
1604 case CK_K8:
1605 case CK_Opteron:
1606 case CK_Athlon64:
1607 case CK_AthlonFX:
Mike Stump1eb44332009-09-09 15:08:12 +00001608 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001609 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001610 break;
1611 case CK_K8SSE3:
1612 case CK_OpteronSSE3:
1613 case CK_Athlon64SSE3:
Roman Divacky80b32b82011-10-30 13:47:56 +00001614 setFeatureEnabled(Features, "sse3", true);
1615 setFeatureEnabled(Features, "3dnowa", true);
1616 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00001617 case CK_AMDFAM10:
Roman Divackyc8b09a12010-12-29 13:28:29 +00001618 setFeatureEnabled(Features, "sse3", true);
Roman Divacky80b32b82011-10-30 13:47:56 +00001619 setFeatureEnabled(Features, "sse4a", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00001620 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001621 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001622 case CK_BDVER1:
1623 case CK_BDVER2:
1624 setFeatureEnabled(Features, "sse4", true);
1625 setFeatureEnabled(Features, "sse4a", true);
1626 setFeatureEnabled(Features, "aes", true);
1627 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001628 case CK_C3_2:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001629 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001630 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001631 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001632 }
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001633}
1634
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001635bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump1eb44332009-09-09 15:08:12 +00001636 const std::string &Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001637 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00001638 // FIXME: This *really* should not be here. We need some way of translating
1639 // options into llvm subtarget features.
1640 if (!Features.count(Name) &&
1641 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001642 return false;
1643
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001644 // FIXME: this should probably use a switch with fall through.
1645
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001646 if (Enabled) {
1647 if (Name == "mmx")
1648 Features["mmx"] = true;
1649 else if (Name == "sse")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001650 Features["mmx"] = Features["sse"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001651 else if (Name == "sse2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001652 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001653 else if (Name == "sse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001654 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1655 true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001656 else if (Name == "ssse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001657 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001658 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001659 else if (Name == "sse4" || Name == "sse4.2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001660 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001661 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001662 else if (Name == "sse4.1")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001663 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopherd39ebe22010-03-04 02:26:37 +00001664 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001665 else if (Name == "3dnow")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001666 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001667 else if (Name == "3dnowa")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001668 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00001669 else if (Name == "aes")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001670 Features["aes"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001671 else if (Name == "avx")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001672 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1673 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1674 Features["avx"] = true;
Craig Topper2b03bb02011-12-17 19:55:21 +00001675 else if (Name == "avx2")
1676 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1677 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1678 Features["avx"] = Features["avx2"] = true;
Roman Divacky80b32b82011-10-30 13:47:56 +00001679 else if (Name == "sse4a")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001680 Features["mmx"] = Features["sse4a"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001681 } else {
1682 if (Name == "mmx")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001683 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001684 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00001685 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001686 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001687 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00001688 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001689 Features["sse41"] = Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001690 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001691 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001692 Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001693 else if (Name == "ssse3")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001694 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencerb24bac92011-04-17 19:22:03 +00001695 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001696 Features["sse41"] = Features["sse42"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00001697 else if (Name == "sse4.2")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001698 Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001699 else if (Name == "3dnow")
1700 Features["3dnow"] = Features["3dnowa"] = false;
1701 else if (Name == "3dnowa")
1702 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001703 else if (Name == "aes")
1704 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001705 else if (Name == "avx")
Craig Topper2b03bb02011-12-17 19:55:21 +00001706 Features["avx"] = Features["avx2"] = false;
1707 else if (Name == "avx2")
1708 Features["avx2"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00001709 else if (Name == "sse4a")
1710 Features["sse4a"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001711 }
1712
1713 return true;
1714}
1715
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001716/// HandleTargetOptions - Perform initialization based on the user
1717/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001718void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001719 // Remember the maximum enabled sselevel.
1720 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1721 // Ignore disabled features.
1722 if (Features[i][0] == '-')
1723 continue;
1724
Eric Christophereea12d12010-04-02 23:50:19 +00001725 if (Features[i].substr(1) == "aes") {
1726 HasAES = true;
1727 continue;
1728 }
1729
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001730 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1731 // For now let it be enabled together with other SSE levels.
Craig Topper2b03bb02011-12-17 19:55:21 +00001732 if (Features[i].substr(1) == "avx2") {
1733 HasAVX = true;
1734 HasAVX2 = true;
1735 continue;
1736 }
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001737 if (Features[i].substr(1) == "avx") {
1738 HasAVX = true;
1739 continue;
1740 }
1741
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001742 assert(Features[i][0] == '+' && "Invalid target feature!");
1743 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1744 .Case("sse42", SSE42)
1745 .Case("sse41", SSE41)
1746 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00001747 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001748 .Case("sse2", SSE2)
1749 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001750 .Default(NoSSE);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001751 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001752
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001753 MMX3DNowEnum ThreeDNowLevel =
1754 llvm::StringSwitch<MMX3DNowEnum>(Features[i].substr(1))
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001755 .Case("3dnowa", AMD3DNowAthlon)
1756 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001757 .Case("mmx", MMX)
1758 .Default(NoMMX3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001759
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001760 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001761 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001762
1763 // Don't tell the backend if we're turning off mmx; it will end up disabling
1764 // SSE, which we don't want.
1765 std::vector<std::string>::iterator it;
1766 it = std::find(Features.begin(), Features.end(), "-mmx");
1767 if (it != Features.end())
1768 Features.erase(it);
Chris Lattner3daed522009-03-02 22:20:04 +00001769}
Chris Lattnerc0f59212009-03-02 22:27:17 +00001770
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001771/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
1772/// definitions for this particular subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00001773void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001774 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001775 // Target identification.
1776 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001777 Builder.defineMacro("_LP64");
1778 Builder.defineMacro("__LP64__");
1779 Builder.defineMacro("__amd64__");
1780 Builder.defineMacro("__amd64");
1781 Builder.defineMacro("__x86_64");
1782 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00001783 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00001784 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00001785 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001786
Chris Lattnerc0f59212009-03-02 22:27:17 +00001787 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001788 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
1789 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001790 switch (CPU) {
1791 case CK_Generic:
1792 break;
1793 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001794 // The rest are coming from the i386 define above.
1795 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001796 break;
1797 case CK_i486:
1798 case CK_WinChipC6:
1799 case CK_WinChip2:
1800 case CK_C3:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001801 Builder.defineMacro("__i486");
1802 Builder.defineMacro("__i486__");
1803 Builder.defineMacro("__tune_i486__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001804 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00001805 case CK_PentiumMMX:
1806 Builder.defineMacro("__pentium_mmx__");
1807 Builder.defineMacro("__tune_pentium_mmx__");
1808 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001809 case CK_i586:
1810 case CK_Pentium:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001811 Builder.defineMacro("__i586");
1812 Builder.defineMacro("__i586__");
1813 Builder.defineMacro("__tune_i586__");
1814 Builder.defineMacro("__pentium");
1815 Builder.defineMacro("__pentium__");
1816 Builder.defineMacro("__tune_pentium__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001817 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001818 case CK_Pentium3:
1819 case CK_Pentium3M:
1820 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001821 Builder.defineMacro("__tune_pentium3__");
1822 // Fallthrough
1823 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001824 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001825 Builder.defineMacro("__tune_pentium2__");
1826 // Fallthrough
1827 case CK_PentiumPro:
1828 Builder.defineMacro("__tune_i686__");
1829 Builder.defineMacro("__tune_pentiumpro__");
1830 // Fallthrough
1831 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001832 Builder.defineMacro("__i686");
1833 Builder.defineMacro("__i686__");
1834 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
1835 Builder.defineMacro("__pentiumpro");
1836 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001837 break;
1838 case CK_Pentium4:
1839 case CK_Pentium4M:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001840 Builder.defineMacro("__pentium4");
1841 Builder.defineMacro("__pentium4__");
1842 Builder.defineMacro("__tune_pentium4__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001843 break;
1844 case CK_Yonah:
1845 case CK_Prescott:
1846 case CK_Nocona:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001847 Builder.defineMacro("__nocona");
1848 Builder.defineMacro("__nocona__");
1849 Builder.defineMacro("__tune_nocona__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001850 break;
1851 case CK_Core2:
1852 case CK_Penryn:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001853 Builder.defineMacro("__core2");
1854 Builder.defineMacro("__core2__");
1855 Builder.defineMacro("__tune_core2__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001856 break;
1857 case CK_Atom:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001858 Builder.defineMacro("__atom");
1859 Builder.defineMacro("__atom__");
1860 Builder.defineMacro("__tune_atom__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001861 break;
1862 case CK_Corei7:
1863 case CK_Corei7AVX:
1864 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001865 case CK_CoreAVX2:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001866 Builder.defineMacro("__corei7");
1867 Builder.defineMacro("__corei7__");
1868 Builder.defineMacro("__tune_corei7__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001869 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001870 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001871 Builder.defineMacro("__k6_2__");
1872 Builder.defineMacro("__tune_k6_2__");
1873 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001874 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001875 if (CPU != CK_K6_2) { // In case of fallthrough
1876 // FIXME: GCC may be enabling these in cases where some other k6
1877 // architecture is specified but -m3dnow is explicitly provided. The
1878 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001879 Builder.defineMacro("__k6_3__");
1880 Builder.defineMacro("__tune_k6_3__");
1881 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00001882 // Fallthrough
1883 case CK_K6:
1884 Builder.defineMacro("__k6");
1885 Builder.defineMacro("__k6__");
1886 Builder.defineMacro("__tune_k6__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001887 break;
1888 case CK_Athlon:
1889 case CK_AthlonThunderbird:
1890 case CK_Athlon4:
1891 case CK_AthlonXP:
1892 case CK_AthlonMP:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001893 Builder.defineMacro("__athlon");
1894 Builder.defineMacro("__athlon__");
1895 Builder.defineMacro("__tune_athlon__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00001896 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001897 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00001898 Builder.defineMacro("__tune_athlon_sse__");
1899 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001900 break;
1901 case CK_K8:
1902 case CK_K8SSE3:
1903 case CK_x86_64:
1904 case CK_Opteron:
1905 case CK_OpteronSSE3:
1906 case CK_Athlon64:
1907 case CK_Athlon64SSE3:
1908 case CK_AthlonFX:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001909 Builder.defineMacro("__k8");
1910 Builder.defineMacro("__k8__");
1911 Builder.defineMacro("__tune_k8__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001912 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00001913 case CK_AMDFAM10:
1914 Builder.defineMacro("__amdfam10");
1915 Builder.defineMacro("__amdfam10__");
1916 Builder.defineMacro("__tune_amdfam10__");
1917 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001918 case CK_BDVER1:
1919 Builder.defineMacro("__bdver1");
1920 Builder.defineMacro("__bdver1__");
1921 Builder.defineMacro("__tune__bdver1__");
1922 break;
1923 case CK_BDVER2:
1924 Builder.defineMacro("__bdver2");
1925 Builder.defineMacro("__bdver2__");
1926 Builder.defineMacro("__tune__bdver2__");
1927 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001928 case CK_Geode:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001929 Builder.defineMacro("__geode");
1930 Builder.defineMacro("__geode__");
1931 Builder.defineMacro("__tune_geode__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001932 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001933 }
Chris Lattner84f0ea82009-03-02 22:40:39 +00001934
Chandler Carruth88c75b02011-09-28 09:54:07 +00001935 // Target properties.
1936 Builder.defineMacro("__LITTLE_ENDIAN__");
1937 Builder.defineMacro("__REGISTER_PREFIX__", "");
1938
Chris Lattner54175442009-04-19 17:32:33 +00001939 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1940 // functions in glibc header files that use FP Stack inline asm which the
1941 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00001942 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001943
Chandler Carruth88c75b02011-09-28 09:54:07 +00001944 if (HasAES)
1945 Builder.defineMacro("__AES__");
1946
1947 if (HasAVX)
1948 Builder.defineMacro("__AVX__");
Craig Topper2b03bb02011-12-17 19:55:21 +00001949 if (HasAVX2)
1950 Builder.defineMacro("__AVX2__");
Chandler Carruth88c75b02011-09-28 09:54:07 +00001951
Chris Lattner84f0ea82009-03-02 22:40:39 +00001952 // Each case falls through to the previous one here.
1953 switch (SSELevel) {
1954 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00001955 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001956 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00001957 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001958 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001959 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001960 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00001961 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001962 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00001963 Builder.defineMacro("__SSE2__");
1964 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00001965 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00001966 Builder.defineMacro("__SSE__");
1967 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001968 case NoSSE:
Chris Lattner84f0ea82009-03-02 22:40:39 +00001969 break;
1970 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00001971
Francois Pichet62ec1f22011-09-17 17:15:52 +00001972 if (Opts.MicrosoftExt && PointerWidth == 32) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001973 switch (SSELevel) {
Michael J. Spencera764e832010-10-21 08:22:51 +00001974 case SSE42:
1975 case SSE41:
1976 case SSSE3:
1977 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001978 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00001979 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001980 break;
1981 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00001982 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001983 break;
1984 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00001985 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00001986 }
1987 }
1988
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001989 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001990 switch (MMX3DNowLevel) {
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001991 case AMD3DNowAthlon:
1992 Builder.defineMacro("__3dNOW_A__");
1993 case AMD3DNow:
1994 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001995 case MMX:
1996 Builder.defineMacro("__MMX__");
1997 case NoMMX3DNow:
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001998 break;
1999 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00002000}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002001
2002
Eli Friedman618234a2008-08-20 02:34:37 +00002003bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002004X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002005 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002006 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00002007 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00002008 case 'Y': // first letter of a pair:
2009 switch (*(Name+1)) {
2010 default: return false;
2011 case '0': // First SSE register.
2012 case 't': // Any SSE register, when SSE2 is enabled.
2013 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2014 case 'm': // any MMX register, when inter-unit moves enabled.
2015 break; // falls through to setAllowsRegister.
2016 }
Eli Friedman618234a2008-08-20 02:34:37 +00002017 case 'a': // eax.
2018 case 'b': // ebx.
2019 case 'c': // ecx.
2020 case 'd': // edx.
2021 case 'S': // esi.
2022 case 'D': // edi.
2023 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00002024 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00002025 case 't': // top of floating point stack.
2026 case 'u': // second from top of floating point stack.
2027 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00002028 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00002029 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00002030 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00002031 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2032 case 'l': // "Index" registers: any general register that can be used as an
2033 // index in a base+index memory access.
2034 Info.setAllowsRegister();
2035 return true;
2036 case 'C': // SSE floating point constant.
2037 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002038 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002039 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002040 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002041 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00002042 return true;
2043 }
Dale Johannesen545be512010-08-24 22:33:12 +00002044 return false;
Eli Friedman618234a2008-08-20 02:34:37 +00002045}
2046
Dale Johannesenf6e2c202010-10-29 23:12:32 +00002047
Eli Friedman618234a2008-08-20 02:34:37 +00002048std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00002049X86TargetInfo::convertConstraint(const char *&Constraint) const {
2050 switch (*Constraint) {
Eli Friedman618234a2008-08-20 02:34:37 +00002051 case 'a': return std::string("{ax}");
2052 case 'b': return std::string("{bx}");
2053 case 'c': return std::string("{cx}");
2054 case 'd': return std::string("{dx}");
2055 case 'S': return std::string("{si}");
2056 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00002057 case 'p': // address
2058 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00002059 case 't': // top of floating point stack.
2060 return std::string("{st}");
2061 case 'u': // second from top of floating point stack.
2062 return std::string("{st(1)}"); // second from top of floating point stack.
2063 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00002064 return std::string(1, *Constraint);
Eli Friedman618234a2008-08-20 02:34:37 +00002065 }
2066}
Eli Friedman618234a2008-08-20 02:34:37 +00002067} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00002068
2069namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002070// X86-32 generic target
2071class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00002072public:
Eli Friedman618234a2008-08-20 02:34:37 +00002073 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2074 DoubleAlign = LongLongAlign = 32;
2075 LongDoubleWidth = 96;
2076 LongDoubleAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002077 SuitableAlign = 32;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002078 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2079 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames567c6002011-10-11 00:52:51 +00002080 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman1afabd92009-03-29 20:31:09 +00002081 SizeType = UnsignedInt;
2082 PtrDiffType = SignedInt;
2083 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002084 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002085
2086 // Use fpret for all types.
2087 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2088 (1 << TargetInfo::Double) |
2089 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00002090
2091 // x86-32 has atomics up to 8 bytes
2092 // FIXME: Check that we actually have cmpxchg8b before setting
2093 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2094 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman618234a2008-08-20 02:34:37 +00002095 }
2096 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002097 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +00002098 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002099
Chris Lattner21fb98e2009-09-23 06:06:36 +00002100 int getEHDataRegisterNumber(unsigned RegNo) const {
2101 if (RegNo == 0) return 0;
2102 if (RegNo == 1) return 2;
2103 return -1;
2104 }
Eli Friedman618234a2008-08-20 02:34:37 +00002105};
2106} // end anonymous namespace
2107
2108namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00002109class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2110public:
2111 OpenBSDI386TargetInfo(const std::string& triple) :
2112 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2113 SizeType = UnsignedLong;
2114 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00002115 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00002116 }
2117};
2118} // end anonymous namespace
2119
2120namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00002121class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00002122public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002123 DarwinI386TargetInfo(const std::string& triple) :
2124 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00002125 LongDoubleWidth = 128;
2126 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002127 SuitableAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +00002128 SizeType = UnsignedLong;
2129 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002130 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2131 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002132 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbar613fd672010-05-27 00:35:16 +00002133 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00002134 }
2135
Eli Friedman618234a2008-08-20 02:34:37 +00002136};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00002137} // end anonymous namespace
2138
2139namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00002140// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002141class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00002142public:
2143 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002144 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00002145 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00002146 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00002147 DoubleAlign = LongLongAlign = 64;
2148 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 +00002149 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002150 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedman29a30502008-08-21 01:40:19 +00002151 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002152 virtual void getTargetDefines(const LangOptions &Opts,
2153 MacroBuilder &Builder) const {
2154 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2155 }
2156};
2157} // end anonymous namespace
2158
2159namespace {
2160
2161// x86-32 Windows Visual Studio target
2162class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2163public:
2164 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2165 : WindowsX86_32TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002166 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00002167 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2168 }
2169 virtual void getTargetDefines(const LangOptions &Opts,
2170 MacroBuilder &Builder) const {
2171 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2172 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2173 // The value of the following reflects processor type.
2174 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2175 // We lost the original triple, so we use the default.
2176 Builder.defineMacro("_M_IX86", "600");
2177 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002178};
2179} // end anonymous namespace
2180
2181namespace {
2182// x86-32 MinGW target
2183class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2184public:
2185 MinGWX86_32TargetInfo(const std::string& triple)
2186 : WindowsX86_32TargetInfo(triple) {
2187 }
2188 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002189 MacroBuilder &Builder) const {
2190 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002191 DefineStd(Builder, "WIN32", Opts);
2192 DefineStd(Builder, "WINNT", Opts);
2193 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00002194 Builder.defineMacro("__MSVCRT__");
2195 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002196
2197 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2198 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002199 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002200 // Provide "as-is" __declspec.
2201 Builder.defineMacro("__declspec", "__declspec");
2202 else
2203 // Provide alias of __attribute__ like mingw32-gcc.
2204 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002205 }
2206};
2207} // end anonymous namespace
2208
2209namespace {
2210// x86-32 Cygwin target
2211class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2212public:
2213 CygwinX86_32TargetInfo(const std::string& triple)
2214 : X86_32TargetInfo(triple) {
2215 TLSSupported = false;
2216 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002217 DoubleAlign = LongLongAlign = 64;
2218 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2219 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002220 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002221 }
2222 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002223 MacroBuilder &Builder) const {
2224 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2225 Builder.defineMacro("__CYGWIN__");
2226 Builder.defineMacro("__CYGWIN32__");
2227 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00002228 if (Opts.CPlusPlus)
2229 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00002230 }
Eli Friedman29a30502008-08-21 01:40:19 +00002231};
2232} // end anonymous namespace
2233
2234namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00002235// x86-32 Haiku target
2236class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2237public:
2238 HaikuX86_32TargetInfo(const std::string& triple)
2239 : X86_32TargetInfo(triple) {
2240 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00002241 IntPtrType = SignedLong;
2242 PtrDiffType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00002243 this->UserLabelPrefix = "";
Eli Friedmana7e68452010-08-22 01:00:03 +00002244 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00002245 virtual void getTargetDefines(const LangOptions &Opts,
2246 MacroBuilder &Builder) const {
2247 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2248 Builder.defineMacro("__INTEL__");
2249 Builder.defineMacro("__HAIKU__");
2250 }
2251};
2252} // end anonymous namespace
2253
Douglas Gregordca52262011-07-01 22:41:14 +00002254// RTEMS Target
2255template<typename Target>
2256class RTEMSTargetInfo : public OSTargetInfo<Target> {
2257protected:
2258 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2259 MacroBuilder &Builder) const {
2260 // RTEMS defines; list based off of gcc output
2261
Douglas Gregordca52262011-07-01 22:41:14 +00002262 Builder.defineMacro("__rtems__");
2263 Builder.defineMacro("__ELF__");
2264 }
2265public:
2266 RTEMSTargetInfo(const std::string &triple)
2267 : OSTargetInfo<Target>(triple) {
2268 this->UserLabelPrefix = "";
2269
2270 llvm::Triple Triple(triple);
2271 switch (Triple.getArch()) {
2272 default:
2273 case llvm::Triple::x86:
2274 // this->MCountName = ".mcount";
2275 break;
2276 case llvm::Triple::mips:
2277 case llvm::Triple::mipsel:
2278 case llvm::Triple::ppc:
2279 case llvm::Triple::ppc64:
2280 // this->MCountName = "_mcount";
2281 break;
2282 case llvm::Triple::arm:
2283 // this->MCountName = "__mcount";
2284 break;
2285 }
2286
2287 }
2288};
2289
2290namespace {
2291// x86-32 RTEMS target
2292class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
2293public:
2294 RTEMSX86_32TargetInfo(const std::string& triple)
2295 : X86_32TargetInfo(triple) {
2296 SizeType = UnsignedLong;
2297 IntPtrType = SignedLong;
2298 PtrDiffType = SignedLong;
2299 this->UserLabelPrefix = "";
2300 }
2301 virtual void getTargetDefines(const LangOptions &Opts,
2302 MacroBuilder &Builder) const {
2303 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2304 Builder.defineMacro("__INTEL__");
2305 Builder.defineMacro("__rtems__");
2306 }
2307};
2308} // end anonymous namespace
2309
Chris Lattner86ed3a32010-04-11 19:29:39 +00002310namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002311// x86-64 generic target
2312class X86_64TargetInfo : public X86TargetInfo {
2313public:
Chris Lattner33328642009-03-20 15:52:06 +00002314 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00002315 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00002316 LongDoubleWidth = 128;
2317 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00002318 LargeArrayMinWidth = 128;
2319 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002320 SuitableAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00002321 IntMaxType = SignedLong;
2322 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002323 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002324 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00002325
Eli Friedmaned855cb2008-08-21 00:13:15 +00002326 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2327 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002328 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002329
2330 // Use fpret only for long double.
2331 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00002332
Anders Carlssoneea64802011-10-31 16:27:11 +00002333 // Use fp2ret for _Complex long double.
2334 ComplexLongDoubleUsesFP2Ret = true;
2335
Eli Friedman2be46072011-10-14 20:59:01 +00002336 // x86-64 has atomics up to 16 bytes.
2337 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
2338 // on CPUs with cmpxchg16b
2339 MaxAtomicPromoteWidth = 128;
2340 MaxAtomicInlineWidth = 64;
Reid Spencer5f016e22007-07-11 17:01:13 +00002341 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00002342 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002343 return "typedef struct __va_list_tag {"
2344 " unsigned gp_offset;"
2345 " unsigned fp_offset;"
2346 " void* overflow_arg_area;"
2347 " void* reg_save_area;"
John McCall2b7baf02010-05-28 18:25:28 +00002348 "} __va_list_tag;"
Eli Friedmandc043162009-07-03 00:45:06 +00002349 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +00002350 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002351
Chris Lattner21fb98e2009-09-23 06:06:36 +00002352 int getEHDataRegisterNumber(unsigned RegNo) const {
2353 if (RegNo == 0) return 0;
2354 if (RegNo == 1) return 1;
2355 return -1;
2356 }
Eli Friedman618234a2008-08-20 02:34:37 +00002357};
2358} // end anonymous namespace
2359
2360namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002361// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002362class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002363public:
2364 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002365 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002366 TLSSupported = false;
2367 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00002368 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00002369 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00002370 IntMaxType = SignedLongLong;
2371 UIntMaxType = UnsignedLongLong;
2372 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00002373 SizeType = UnsignedLongLong;
2374 PtrDiffType = SignedLongLong;
2375 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00002376 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002377 }
2378 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002379 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002380 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002381 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00002382 }
NAKAMURA Takumi79521992011-01-17 22:56:23 +00002383 virtual const char *getVAListDeclaration() const {
2384 return "typedef char* __builtin_va_list;";
2385 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002386};
2387} // end anonymous namespace
2388
2389namespace {
2390// x86-64 Windows Visual Studio target
2391class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
2392public:
2393 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
2394 : WindowsX86_64TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002395 LongDoubleWidth = LongDoubleAlign = 64;
2396 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00002397 }
2398 virtual void getTargetDefines(const LangOptions &Opts,
2399 MacroBuilder &Builder) const {
2400 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2401 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00002402 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002403 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002404 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002405};
2406} // end anonymous namespace
2407
2408namespace {
2409// x86-64 MinGW target
2410class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
2411public:
2412 MinGWX86_64TargetInfo(const std::string& triple)
2413 : WindowsX86_64TargetInfo(triple) {
2414 }
2415 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002416 MacroBuilder &Builder) const {
2417 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002418 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00002419 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00002420 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00002421 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002422
2423 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2424 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002425 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002426 // Provide "as-is" __declspec.
2427 Builder.defineMacro("__declspec", "__declspec");
2428 else
2429 // Provide alias of __attribute__ like mingw32-gcc.
2430 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002431 }
2432};
2433} // end anonymous namespace
2434
2435namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002436class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
2437public:
Mike Stump1eb44332009-09-09 15:08:12 +00002438 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002439 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
2440 Int64Type = SignedLongLong;
2441 }
2442};
2443} // end anonymous namespace
2444
2445namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00002446class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
2447public:
Mike Stump1eb44332009-09-09 15:08:12 +00002448 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00002449 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
2450 IntMaxType = SignedLongLong;
2451 UIntMaxType = UnsignedLongLong;
2452 Int64Type = SignedLongLong;
2453 }
2454};
2455} // end anonymous namespace
2456
2457namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00002458class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002459 // Possible FPU choices.
2460 enum FPUMode {
2461 NoFPU,
2462 VFP2FPU,
2463 VFP3FPU,
2464 NeonFPU
2465 };
2466
2467 static bool FPUModeIsVFP(FPUMode Mode) {
2468 return Mode >= VFP2FPU && Mode <= NeonFPU;
2469 }
2470
2471 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2472 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002473
Daniel Dunbareac7c532009-12-18 18:42:37 +00002474 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00002475
2476 unsigned FPU : 3;
2477
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002478 unsigned IsThumb : 1;
2479
2480 // Initialized via features.
2481 unsigned SoftFloat : 1;
2482 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002483
Chris Lattner2752c012010-03-03 19:03:45 +00002484 static const Builtin::Info BuiltinInfo[];
2485
Chris Lattner393ff042008-04-21 18:56:49 +00002486public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002487 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbareac7c532009-12-18 18:42:37 +00002488 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002489 {
Daniel Dunbara2a41612009-09-14 00:02:24 +00002490 SizeType = UnsignedInt;
2491 PtrDiffType = SignedInt;
James Molloya6d81f92011-11-23 13:35:08 +00002492 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
2493 WCharType = UnsignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002494
Chris Lattner9bffb072010-04-23 16:29:58 +00002495 // {} in inline assembly are neon specifiers, not assembly variant
2496 // specifiers.
2497 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00002498
Daniel Dunbareac7c532009-12-18 18:42:37 +00002499 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00002500 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002501 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00002502 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2503 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002504 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2505 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002506 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002507 } else {
2508 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2509 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002510 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002511 }
John McCallee79a4c2010-08-21 22:46:04 +00002512
2513 // ARM targets default to using the ARM C++ ABI.
2514 CXXABI = CXXABI_ARM;
Eli Friedman2be46072011-10-14 20:59:01 +00002515
2516 // ARM has atomics up to 8 bytes
2517 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
2518 MaxAtomicPromoteWidth = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00002519 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002520 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00002521 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002522 ABI = Name;
2523
Daniel Dunbara2a41612009-09-14 00:02:24 +00002524 // The defaults (above) are for AAPCS, check if we need to change them.
2525 //
2526 // FIXME: We need support for -meabi... we could just mangle it into the
2527 // name.
2528 if (Name == "apcs-gnu") {
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002529 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002530 SizeType = UnsignedLong;
2531
James Molloya6d81f92011-11-23 13:35:08 +00002532 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
2533 WCharType = SignedInt;
2534
Daniel Dunbar684de632010-04-22 16:14:54 +00002535 // Do not respect the alignment of bit-field types when laying out
2536 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
2537 UseBitFieldTypeAlignment = false;
2538
Chad Rosier61a62212011-08-04 01:21:14 +00002539 /// Do force alignment of members that follow zero length bitfields. If
2540 /// the alignment of the zero-length bitfield is greater than the member
2541 /// that follows it, `bar', `bar' will be aligned as the type of the
2542 /// zero length bitfield.
2543 UseZeroLengthBitfieldAlignment = true;
2544
2545 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosier6e43f3f2011-08-04 17:52:43 +00002546 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
2547 /// gcc.
Chad Rosier61a62212011-08-04 01:21:14 +00002548 ZeroLengthBitfieldBoundary = 32;
2549
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002550 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00002551 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2552 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002553 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
Bob Wilson949fd1a2011-06-29 16:09:20 +00002554 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002555 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002556 } else {
2557 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 +00002558 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002559 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002560 }
2561
Chad Rosier9f1210c2011-07-26 07:03:04 +00002562 // FIXME: Override "preferred align" for double and long long.
Daniel Dunbara2a41612009-09-14 00:02:24 +00002563 } else if (Name == "aapcs") {
2564 // FIXME: Enumerated types are variable width in straight AAPCS.
2565 } else if (Name == "aapcs-linux") {
Chad Rosier9f1210c2011-07-26 07:03:04 +00002566 ;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002567 } else
2568 return false;
2569
2570 return true;
2571 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002572
Chandler Carruthc3a2e652011-09-28 05:56:05 +00002573 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002574 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
2575 Features["vfp2"] = true;
2576 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
2577 Features["neon"] = true;
2578 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002579
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002580 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2581 const std::string &Name,
2582 bool Enabled) const {
Evan Chengf972b262011-07-08 06:40:11 +00002583 if (Name == "soft-float" || Name == "soft-float-abi" ||
2584 Name == "vfp2" || Name == "vfp3" || Name == "neon") {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002585 Features[Name] = Enabled;
2586 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002587 return false;
2588
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002589 return true;
2590 }
2591
2592 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002593 FPU = NoFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002594 SoftFloat = SoftFloatABI = false;
2595 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2596 if (Features[i] == "+soft-float")
2597 SoftFloat = true;
2598 else if (Features[i] == "+soft-float-abi")
2599 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00002600 else if (Features[i] == "+vfp2")
2601 FPU = VFP2FPU;
2602 else if (Features[i] == "+vfp3")
2603 FPU = VFP3FPU;
2604 else if (Features[i] == "+neon")
2605 FPU = NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002606 }
2607
2608 // Remove front-end specific options which the backend handles differently.
2609 std::vector<std::string>::iterator it;
2610 it = std::find(Features.begin(), Features.end(), "+soft-float");
2611 if (it != Features.end())
2612 Features.erase(it);
2613 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2614 if (it != Features.end())
2615 Features.erase(it);
2616 }
2617
Chris Lattner5f9e2722011-07-23 10:55:15 +00002618 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbareac7c532009-12-18 18:42:37 +00002619 return llvm::StringSwitch<const char*>(Name)
2620 .Cases("arm8", "arm810", "4")
2621 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2622 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2623 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2624 .Case("ep9312", "4T")
2625 .Cases("arm10tdmi", "arm1020t", "5T")
2626 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2627 .Case("arm926ej-s", "5TEJ")
2628 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2629 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002630 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002631 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002632 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002633 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2634 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson06f45632011-01-06 16:57:20 +00002635 .Case("cortex-m3", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00002636 .Case("cortex-m0", "6M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002637 .Default(0);
2638 }
2639 virtual bool setCPU(const std::string &Name) {
2640 if (!getCPUDefineSuffix(Name))
2641 return false;
2642
2643 CPU = Name;
2644 return true;
2645 }
Chris Lattner33328642009-03-20 15:52:06 +00002646 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002647 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00002648 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00002649 Builder.defineMacro("__arm");
2650 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002651
Chris Lattnerc0f59212009-03-02 22:27:17 +00002652 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00002653 Builder.defineMacro("__ARMEL__");
2654 Builder.defineMacro("__LITTLE_ENDIAN__");
2655 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002656
Chris Lattner5f9e2722011-07-23 10:55:15 +00002657 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00002658 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002659
Mike Stump437bb4b2009-04-08 02:07:04 +00002660 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002661
Daniel Dunbareac7c532009-12-18 18:42:37 +00002662 // FIXME: It's more complicated than this and we don't really support
2663 // interworking.
2664 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00002665 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002666
Daniel Dunbareac7c532009-12-18 18:42:37 +00002667 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramera9992772010-01-09 17:55:51 +00002668 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002669
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002670 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00002671 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002672
2673 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00002674 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002675
Bob Wilson84f95cf2011-05-13 18:56:03 +00002676 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002677 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00002678 Builder.defineMacro("__THUMBEL__");
2679 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00002680 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002681 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002682 }
2683
2684 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00002685 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002686
2687 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramera9992772010-01-09 17:55:51 +00002688 Builder.defineMacro("__VFP_FP__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002689
2690 // This only gets set when Neon instructions are actually available, unlike
2691 // the VFP define, hence the soft float and arch check. This is subtly
2692 // different from gcc, we follow the intent which was that it should be set
2693 // when Neon instructions are actually available.
Bob Wilson84f95cf2011-05-13 18:56:03 +00002694 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002695 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00002696 }
2697 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2698 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00002699 Records = BuiltinInfo;
2700 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00002701 }
2702 virtual const char *getVAListDeclaration() const {
John McCall0e9972c2011-05-09 02:19:37 +00002703 return "typedef void* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +00002704 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002705 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002706 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002707 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002708 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002709 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002710 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002711 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002712 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00002713 default:
Nate Begemanad487f42008-04-22 05:03:19 +00002714 case 'l': // r0-r7
2715 case 'h': // r8-r15
2716 case 'w': // VFP Floating point register single precision
2717 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00002718 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00002719 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00002720 case 'Q': // A memory address that is a single base register.
2721 Info.setAllowsMemory();
2722 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00002723 case 'U': // a memory reference...
2724 switch (Name[1]) {
2725 case 'q': // ...ARMV4 ldrsb
2726 case 'v': // ...VFP load/store (reg+constant offset)
2727 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00002728 case 't': // address valid for load/store opaque types wider
2729 // than 128-bits
2730 case 'n': // valid address for Neon doubleword vector load/store
2731 case 'm': // valid address for Neon element and structure load/store
2732 case 's': // valid address for non-offset loads/stores of quad-word
2733 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00002734 Info.setAllowsMemory();
2735 Name++;
2736 return true;
2737 }
Nate Begemanad487f42008-04-22 05:03:19 +00002738 }
Chris Lattner393ff042008-04-21 18:56:49 +00002739 return false;
2740 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00002741 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00002742 std::string R;
2743 switch (*Constraint) {
2744 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00002745 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00002746 Constraint++;
2747 break;
Eric Christopher283f4472011-06-17 00:40:18 +00002748 case 'p': // 'p' should be translated to 'r' by default.
2749 R = std::string("r");
2750 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00002751 default:
2752 return std::string(1, *Constraint);
2753 }
2754 return R;
2755 }
Chris Lattner393ff042008-04-21 18:56:49 +00002756 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002757 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00002758 return "";
2759 }
2760};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002761
2762const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002763 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002764 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002765 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2766
2767 // Float registers
2768 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2769 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2770 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002771 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002772
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002773 // Double registers
2774 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2775 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00002776 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2777 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002778
2779 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00002780 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2781 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002782};
2783
2784void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002785 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002786 Names = GCCRegNames;
2787 NumNames = llvm::array_lengthof(GCCRegNames);
2788}
2789
2790const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002791 { { "a1" }, "r0" },
2792 { { "a2" }, "r1" },
2793 { { "a3" }, "r2" },
2794 { { "a4" }, "r3" },
2795 { { "v1" }, "r4" },
2796 { { "v2" }, "r5" },
2797 { { "v3" }, "r6" },
2798 { { "v4" }, "r7" },
2799 { { "v5" }, "r8" },
2800 { { "v6", "rfp" }, "r9" },
2801 { { "sl" }, "r10" },
2802 { { "fp" }, "r11" },
2803 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002804 { { "r13" }, "sp" },
2805 { { "r14" }, "lr" },
2806 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002807 // The S, D and Q registers overlap, but aren't really aliases; we
2808 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002809};
2810
2811void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2812 unsigned &NumAliases) const {
2813 Aliases = GCCRegAliases;
2814 NumAliases = llvm::array_lengthof(GCCRegAliases);
2815}
Chris Lattner2752c012010-03-03 19:03:45 +00002816
2817const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00002818#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00002819#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00002820 ALL_LANGUAGES },
Chris Lattner2752c012010-03-03 19:03:45 +00002821#include "clang/Basic/BuiltinsARM.def"
2822};
Chris Lattner393ff042008-04-21 18:56:49 +00002823} // end anonymous namespace.
2824
Eli Friedmana9f54962008-08-20 07:44:10 +00002825namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00002826class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002827 public DarwinTargetInfo<ARMTargetInfo> {
2828protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00002829 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00002830 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00002831 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00002832 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002833
Torok Edwin5f6c1942009-06-30 17:10:35 +00002834public:
Mike Stump1eb44332009-09-09 15:08:12 +00002835 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002836 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2837 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00002838 // iOS always has 64-bit atomic instructions.
2839 // FIXME: This should be based off of the target features in ARMTargetInfo.
2840 MaxAtomicInlineWidth = 64;
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002841 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002842};
2843} // end anonymous namespace.
2844
Tony Linthicum96319392011-12-12 21:14:55 +00002845
2846namespace {
2847// Hexagon abstract base class
2848class HexagonTargetInfo : public TargetInfo {
2849 static const Builtin::Info BuiltinInfo[];
2850 static const char * const GCCRegNames[];
2851 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2852 std::string CPU;
2853public:
2854 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) {
2855 DescriptionString = ("e-p:32:32:32-"
2856 "i64:64:64-i32:32:32-"
2857 "i16:16:16-i1:32:32-a:0:0");
2858
2859 // {} in inline assembly are packet specifiers, not assembly variant
2860 // specifiers.
2861 NoAsmVariants = true;
2862 }
2863
2864 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2865 unsigned &NumRecords) const {
2866 Records = BuiltinInfo;
2867 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
2868 }
2869
2870 virtual bool validateAsmConstraint(const char *&Name,
2871 TargetInfo::ConstraintInfo &Info) const {
2872 return true;
2873 }
2874
2875 virtual void getTargetDefines(const LangOptions &Opts,
2876 MacroBuilder &Builder) const;
2877
2878 virtual const char *getVAListDeclaration() const {
2879 return "typedef char* __builtin_va_list;";
2880 }
2881 virtual void getGCCRegNames(const char * const *&Names,
2882 unsigned &NumNames) const;
2883 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2884 unsigned &NumAliases) const;
2885 virtual const char *getClobbers() const {
2886 return "";
2887 }
2888 virtual bool setCPU(const std::string &Name) {
2889 CPU = Name;
2890 return true;
2891 }
2892};
2893
2894void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
2895 MacroBuilder &Builder) const {
2896 Builder.defineMacro("qdsp6");
2897 Builder.defineMacro("__qdsp6", "1");
2898 Builder.defineMacro("__qdsp6__", "1");
2899
2900 Builder.defineMacro("hexagon");
2901 Builder.defineMacro("__hexagon", "1");
2902 Builder.defineMacro("__hexagon__", "1");
2903
2904 if(CPU == "hexagonv1") {
2905 Builder.defineMacro("__HEXAGON_V1__");
2906 Builder.defineMacro("__HEXAGON_ARCH__", "1");
2907 if(Opts.HexagonQdsp6Compat) {
2908 Builder.defineMacro("__QDSP6_V1__");
2909 Builder.defineMacro("__QDSP6_ARCH__", "1");
2910 }
2911 }
2912 else if(CPU == "hexagonv2") {
2913 Builder.defineMacro("__HEXAGON_V2__");
2914 Builder.defineMacro("__HEXAGON_ARCH__", "2");
2915 if(Opts.HexagonQdsp6Compat) {
2916 Builder.defineMacro("__QDSP6_V2__");
2917 Builder.defineMacro("__QDSP6_ARCH__", "2");
2918 }
2919 }
2920 else if(CPU == "hexagonv3") {
2921 Builder.defineMacro("__HEXAGON_V3__");
2922 Builder.defineMacro("__HEXAGON_ARCH__", "3");
2923 if(Opts.HexagonQdsp6Compat) {
2924 Builder.defineMacro("__QDSP6_V3__");
2925 Builder.defineMacro("__QDSP6_ARCH__", "3");
2926 }
2927 }
2928 else if(CPU == "hexagonv4") {
2929 Builder.defineMacro("__HEXAGON_V4__");
2930 Builder.defineMacro("__HEXAGON_ARCH__", "4");
2931 if(Opts.HexagonQdsp6Compat) {
2932 Builder.defineMacro("__QDSP6_V4__");
2933 Builder.defineMacro("__QDSP6_ARCH__", "4");
2934 }
2935 }
2936}
2937
2938const char * const HexagonTargetInfo::GCCRegNames[] = {
2939 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2940 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2941 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2942 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
2943 "p0", "p1", "p2", "p3",
2944 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
2945};
2946
2947void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
2948 unsigned &NumNames) const {
2949 Names = GCCRegNames;
2950 NumNames = llvm::array_lengthof(GCCRegNames);
2951}
2952
2953
2954const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
2955 { { "sp" }, "r29" },
2956 { { "fp" }, "r30" },
2957 { { "lr" }, "r31" },
2958 };
2959
2960void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2961 unsigned &NumAliases) const {
2962 Aliases = GCCRegAliases;
2963 NumAliases = llvm::array_lengthof(GCCRegAliases);
2964}
2965
2966
2967const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
2968#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
2969#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
2970 ALL_LANGUAGES },
2971#include "clang/Basic/BuiltinsHexagon.def"
2972};
2973}
2974
2975
Reid Spencer5f016e22007-07-11 17:01:13 +00002976namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00002977class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00002978 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2979 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002980 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00002981public:
Eli Friedman01b86682008-08-20 07:28:14 +00002982 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2983 // FIXME: Support Sparc quad-precision long double?
Eli Friedmaned855cb2008-08-21 00:13:15 +00002984 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 +00002985 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00002986 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00002987 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2988 const std::string &Name,
2989 bool Enabled) const {
2990 if (Name == "soft-float")
2991 Features[Name] = Enabled;
2992 else
2993 return false;
2994
2995 return true;
2996 }
2997 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2998 SoftFloat = false;
2999 for (unsigned i = 0, e = Features.size(); i != e; ++i)
3000 if (Features[i] == "+soft-float")
3001 SoftFloat = true;
3002 }
Chris Lattner33328642009-03-20 15:52:06 +00003003 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003004 MacroBuilder &Builder) const {
3005 DefineStd(Builder, "sparc", Opts);
3006 Builder.defineMacro("__sparcv8");
3007 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003008
3009 if (SoftFloat)
3010 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00003011 }
3012 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3013 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00003014 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00003015 }
3016 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00003017 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00003018 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003019 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00003020 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003021 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00003022 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003023 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00003024 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00003025 // FIXME: Implement!
3026 return false;
Gabor Greif26658672008-02-21 16:29:08 +00003027 }
3028 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00003029 // FIXME: Implement!
3030 return "";
Gabor Greif26658672008-02-21 16:29:08 +00003031 }
3032};
3033
Chris Lattnere957f532009-01-27 01:58:38 +00003034const char * const SparcV8TargetInfo::GCCRegNames[] = {
3035 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3036 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3037 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3038 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
3039};
3040
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003041void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00003042 unsigned &NumNames) const {
3043 Names = GCCRegNames;
3044 NumNames = llvm::array_lengthof(GCCRegNames);
3045}
3046
3047const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003048 { { "g0" }, "r0" },
3049 { { "g1" }, "r1" },
3050 { { "g2" }, "r2" },
3051 { { "g3" }, "r3" },
3052 { { "g4" }, "r4" },
3053 { { "g5" }, "r5" },
3054 { { "g6" }, "r6" },
3055 { { "g7" }, "r7" },
3056 { { "o0" }, "r8" },
3057 { { "o1" }, "r9" },
3058 { { "o2" }, "r10" },
3059 { { "o3" }, "r11" },
3060 { { "o4" }, "r12" },
3061 { { "o5" }, "r13" },
3062 { { "o6", "sp" }, "r14" },
3063 { { "o7" }, "r15" },
3064 { { "l0" }, "r16" },
3065 { { "l1" }, "r17" },
3066 { { "l2" }, "r18" },
3067 { { "l3" }, "r19" },
3068 { { "l4" }, "r20" },
3069 { { "l5" }, "r21" },
3070 { { "l6" }, "r22" },
3071 { { "l7" }, "r23" },
3072 { { "i0" }, "r24" },
3073 { { "i1" }, "r25" },
3074 { { "i2" }, "r26" },
3075 { { "i3" }, "r27" },
3076 { { "i4" }, "r28" },
3077 { { "i5" }, "r29" },
3078 { { "i6", "fp" }, "r30" },
3079 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00003080};
3081
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003082void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00003083 unsigned &NumAliases) const {
3084 Aliases = GCCRegAliases;
3085 NumAliases = llvm::array_lengthof(GCCRegAliases);
3086}
Gabor Greif26658672008-02-21 16:29:08 +00003087} // end anonymous namespace.
3088
Eli Friedman01b86682008-08-20 07:28:14 +00003089namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003090class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
3091public:
3092 AuroraUXSparcV8TargetInfo(const std::string& triple) :
3093 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
3094 SizeType = UnsignedInt;
3095 PtrDiffType = SignedInt;
3096 }
3097};
Torok Edwin5f6c1942009-06-30 17:10:35 +00003098class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00003099public:
3100 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00003101 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00003102 SizeType = UnsignedInt;
3103 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00003104 }
3105};
3106} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00003107
Chris Lattner2621fd12008-05-08 05:58:21 +00003108namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003109 class MSP430TargetInfo : public TargetInfo {
3110 static const char * const GCCRegNames[];
3111 public:
3112 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
3113 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00003114 IntWidth = 16; IntAlign = 16;
3115 LongWidth = 32; LongLongWidth = 64;
3116 LongAlign = LongLongAlign = 16;
3117 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003118 SuitableAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003119 SizeType = UnsignedInt;
3120 IntMaxType = SignedLong;
3121 UIntMaxType = UnsignedLong;
3122 IntPtrType = SignedShort;
3123 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00003124 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00003125 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003126 }
3127 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003128 MacroBuilder &Builder) const {
3129 Builder.defineMacro("MSP430");
3130 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003131 // FIXME: defines for different 'flavours' of MCU
3132 }
3133 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3134 unsigned &NumRecords) const {
3135 // FIXME: Implement.
3136 Records = 0;
3137 NumRecords = 0;
3138 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003139 virtual void getGCCRegNames(const char * const *&Names,
3140 unsigned &NumNames) const;
3141 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3142 unsigned &NumAliases) const {
3143 // No aliases.
3144 Aliases = 0;
3145 NumAliases = 0;
3146 }
3147 virtual bool validateAsmConstraint(const char *&Name,
3148 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00003149 // No target constraints for now.
3150 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003151 }
3152 virtual const char *getClobbers() const {
3153 // FIXME: Is this really right?
3154 return "";
3155 }
3156 virtual const char *getVAListDeclaration() const {
3157 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00003158 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003159 }
3160 };
3161
3162 const char * const MSP430TargetInfo::GCCRegNames[] = {
3163 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3164 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3165 };
3166
3167 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
3168 unsigned &NumNames) const {
3169 Names = GCCRegNames;
3170 NumNames = llvm::array_lengthof(GCCRegNames);
3171 }
3172}
3173
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00003174namespace {
Eli Friedmanb63decf2009-08-19 20:47:07 +00003175
Mike Stump1eb44332009-09-09 15:08:12 +00003176 // LLVM and Clang cannot be used directly to output native binaries for
3177 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00003178 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00003179 //
3180 // TCE uses the llvm bitcode as input and uses it for generating customized
3181 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00003182 // publicly available in http://tce.cs.tut.fi
3183
Eli Friedman209f5bb2011-10-07 19:51:42 +00003184 static const unsigned TCEOpenCLAddrSpaceMap[] = {
3185 3, // opencl_global
3186 4, // opencl_local
3187 5 // opencl_constant
3188 };
3189
Eli Friedmanb63decf2009-08-19 20:47:07 +00003190 class TCETargetInfo : public TargetInfo{
3191 public:
3192 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
3193 TLSSupported = false;
3194 IntWidth = 32;
3195 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003196 PointerWidth = 32;
3197 IntAlign = 32;
3198 LongAlign = LongLongAlign = 32;
3199 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003200 SuitableAlign = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003201 SizeType = UnsignedInt;
3202 IntMaxType = SignedLong;
3203 UIntMaxType = UnsignedLong;
3204 IntPtrType = SignedInt;
3205 PtrDiffType = SignedInt;
3206 FloatWidth = 32;
3207 FloatAlign = 32;
3208 DoubleWidth = 32;
3209 DoubleAlign = 32;
3210 LongDoubleWidth = 32;
3211 LongDoubleAlign = 32;
3212 FloatFormat = &llvm::APFloat::IEEEsingle;
3213 DoubleFormat = &llvm::APFloat::IEEEsingle;
3214 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00003215 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
3216 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00003217 "f32:32:32-f64:32:32-v64:32:32-"
3218 "v128:32:32-a0:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00003219 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003220 }
3221
3222 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003223 MacroBuilder &Builder) const {
3224 DefineStd(Builder, "tce", Opts);
3225 Builder.defineMacro("__TCE__");
3226 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00003227 }
3228 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3229 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00003230 virtual const char *getClobbers() const {
3231 return "";
3232 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00003233 virtual const char *getVAListDeclaration() const {
3234 return "typedef void* __builtin_va_list;";
3235 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00003236 virtual void getGCCRegNames(const char * const *&Names,
3237 unsigned &NumNames) const {}
3238 virtual bool validateAsmConstraint(const char *&Name,
3239 TargetInfo::ConstraintInfo &info) const {
3240 return true;
3241 }
3242 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3243 unsigned &NumAliases) const {}
3244 };
3245}
3246
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003247namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003248class MipsTargetInfoBase : public TargetInfo {
3249 std::string CPU;
3250protected:
3251 std::string ABI;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003252public:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003253 MipsTargetInfoBase(const std::string& triple, const std::string& ABIStr)
Akira Hatanaka148735e2011-11-05 01:48:34 +00003254 : TargetInfo(triple), ABI(ABIStr) {}
Eric Christophered734732010-03-02 02:41:08 +00003255 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003256 virtual bool setABI(const std::string &Name) = 0;
Eric Christophered734732010-03-02 02:41:08 +00003257 virtual bool setCPU(const std::string &Name) {
3258 CPU = Name;
3259 return true;
3260 }
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003261 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christophered734732010-03-02 02:41:08 +00003262 Features[ABI] = true;
3263 Features[CPU] = true;
3264 }
3265 virtual void getArchDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003266 MacroBuilder &Builder) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003267 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003268 MacroBuilder &Builder) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003269 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3270 unsigned &NumRecords) const {
3271 // FIXME: Implement!
3272 }
3273 virtual const char *getVAListDeclaration() const {
3274 return "typedef void* __builtin_va_list;";
3275 }
3276 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003277 unsigned &NumNames) const {
3278 static const char * const GCCRegNames[] = {
3279 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
3280 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
3281 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
3282 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
3283 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
3284 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
3285 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
3286 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
3287 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
3288 "$fcc5","$fcc6","$fcc7"
3289 };
3290 Names = GCCRegNames;
3291 NumNames = llvm::array_lengthof(GCCRegNames);
3292 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003293 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003294 unsigned &NumAliases) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003295 virtual bool validateAsmConstraint(const char *&Name,
3296 TargetInfo::ConstraintInfo &Info) const {
3297 switch (*Name) {
3298 default:
Douglas Gregor21a25162011-11-02 20:52:01 +00003299 return false;
3300
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003301 case 'r': // CPU registers.
3302 case 'd': // Equivalent to "r" unless generating MIPS16 code.
3303 case 'y': // Equivalent to "r", backwards compatibility only.
3304 case 'f': // floating-point registers.
3305 Info.setAllowsRegister();
3306 return true;
3307 }
3308 return false;
3309 }
3310
3311 virtual const char *getClobbers() const {
3312 // FIXME: Implement!
3313 return "";
3314 }
3315};
3316
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003317class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003318public:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003319 Mips32TargetInfoBase(const std::string& triple) :
Akira Hatanaka148735e2011-11-05 01:48:34 +00003320 MipsTargetInfoBase(triple, "o32") {
3321 SizeType = UnsignedInt;
3322 PtrDiffType = SignedInt;
3323 }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003324 virtual bool setABI(const std::string &Name) {
3325 if ((Name == "o32") || (Name == "eabi")) {
3326 ABI = Name;
3327 return true;
3328 } else
3329 return false;
3330 }
3331 virtual void getArchDefines(const LangOptions &Opts,
3332 MacroBuilder &Builder) const {
Douglas Gregorc9a23712011-11-09 15:17:16 +00003333 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
3334 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
3335 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
3336
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003337 if (ABI == "o32") {
3338 Builder.defineMacro("__mips_o32");
3339 Builder.defineMacro("_ABIO32", "1");
3340 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
3341 }
3342 else if (ABI == "eabi")
3343 Builder.defineMacro("__mips_eabi");
3344 else
David Blaikieb219cfc2011-09-23 05:06:16 +00003345 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003346 }
3347 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3348 unsigned &NumAliases) const {
3349 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3350 { { "at" }, "$1" },
3351 { { "v0" }, "$2" },
3352 { { "v1" }, "$3" },
3353 { { "a0" }, "$4" },
3354 { { "a1" }, "$5" },
3355 { { "a2" }, "$6" },
3356 { { "a3" }, "$7" },
3357 { { "t0" }, "$8" },
3358 { { "t1" }, "$9" },
3359 { { "t2" }, "$10" },
3360 { { "t3" }, "$11" },
3361 { { "t4" }, "$12" },
3362 { { "t5" }, "$13" },
3363 { { "t6" }, "$14" },
3364 { { "t7" }, "$15" },
3365 { { "s0" }, "$16" },
3366 { { "s1" }, "$17" },
3367 { { "s2" }, "$18" },
3368 { { "s3" }, "$19" },
3369 { { "s4" }, "$20" },
3370 { { "s5" }, "$21" },
3371 { { "s6" }, "$22" },
3372 { { "s7" }, "$23" },
3373 { { "t8" }, "$24" },
3374 { { "t9" }, "$25" },
3375 { { "k0" }, "$26" },
3376 { { "k1" }, "$27" },
3377 { { "gp" }, "$28" },
3378 { { "sp" }, "$29" },
3379 { { "fp" }, "$30" },
3380 { { "ra" }, "$31" }
3381 };
3382 Aliases = GCCRegAliases;
3383 NumAliases = llvm::array_lengthof(GCCRegAliases);
3384 }
3385};
3386
3387class Mips32EBTargetInfo : public Mips32TargetInfoBase {
3388public:
3389 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3390 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3391 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3392 }
3393 virtual void getTargetDefines(const LangOptions &Opts,
3394 MacroBuilder &Builder) const {
3395 DefineStd(Builder, "mips", Opts);
3396 Builder.defineMacro("_mips");
3397 DefineStd(Builder, "MIPSEB", Opts);
3398 Builder.defineMacro("_MIPSEB");
3399 Builder.defineMacro("__REGISTER_PREFIX__", "");
3400 getArchDefines(Opts, Builder);
3401 }
3402};
3403
3404class Mips32ELTargetInfo : public Mips32TargetInfoBase {
3405public:
3406 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003407 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanaka619e8872011-06-02 00:09:17 +00003408 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003409 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003410 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003411 MacroBuilder &Builder) const {
3412 DefineStd(Builder, "mips", Opts);
3413 Builder.defineMacro("_mips");
3414 DefineStd(Builder, "MIPSEL", Opts);
3415 Builder.defineMacro("_MIPSEL");
3416 Builder.defineMacro("__REGISTER_PREFIX__", "");
3417 getArchDefines(Opts, Builder);
3418 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003419};
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003420
3421class Mips64TargetInfoBase : public MipsTargetInfoBase {
3422 virtual void SetDescriptionString(const std::string &Name) = 0;
3423public:
3424 Mips64TargetInfoBase(const std::string& triple) :
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003425 MipsTargetInfoBase(triple, "n64") {
3426 LongWidth = LongAlign = 64;
3427 PointerWidth = PointerAlign = 64;
3428 LongDoubleWidth = LongDoubleAlign = 128;
3429 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003430 SuitableAlign = 128;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003431 }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003432 virtual bool setABI(const std::string &Name) {
3433 SetDescriptionString(Name);
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003434
3435 if (Name != "n32" && Name != "n64")
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003436 return false;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003437
3438 ABI = Name;
3439
3440 if (Name == "n32") {
3441 LongWidth = LongAlign = 32;
3442 PointerWidth = PointerAlign = 32;
3443 }
3444
3445 return true;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003446 }
3447 virtual void getArchDefines(const LangOptions &Opts,
3448 MacroBuilder &Builder) const {
3449 if (ABI == "n32") {
3450 Builder.defineMacro("__mips_n32");
3451 Builder.defineMacro("_ABIN32", "2");
3452 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
3453 }
3454 else if (ABI == "n64") {
3455 Builder.defineMacro("__mips_n64");
3456 Builder.defineMacro("_ABI64", "3");
3457 Builder.defineMacro("_MIPS_SIM", "_ABI64");
3458 }
3459 else
David Blaikieb219cfc2011-09-23 05:06:16 +00003460 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003461 }
3462 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3463 unsigned &NumAliases) const {
3464 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3465 { { "at" }, "$1" },
3466 { { "v0" }, "$2" },
3467 { { "v1" }, "$3" },
3468 { { "a0" }, "$4" },
3469 { { "a1" }, "$5" },
3470 { { "a2" }, "$6" },
3471 { { "a3" }, "$7" },
3472 { { "a4" }, "$8" },
3473 { { "a5" }, "$9" },
3474 { { "a6" }, "$10" },
3475 { { "a7" }, "$11" },
3476 { { "t0" }, "$12" },
3477 { { "t1" }, "$13" },
3478 { { "t2" }, "$14" },
3479 { { "t3" }, "$15" },
3480 { { "s0" }, "$16" },
3481 { { "s1" }, "$17" },
3482 { { "s2" }, "$18" },
3483 { { "s3" }, "$19" },
3484 { { "s4" }, "$20" },
3485 { { "s5" }, "$21" },
3486 { { "s6" }, "$22" },
3487 { { "s7" }, "$23" },
3488 { { "t8" }, "$24" },
3489 { { "t9" }, "$25" },
3490 { { "k0" }, "$26" },
3491 { { "k1" }, "$27" },
3492 { { "gp" }, "$28" },
3493 { { "sp" }, "$29" },
3494 { { "fp" }, "$30" },
3495 { { "ra" }, "$31" }
3496 };
3497 Aliases = GCCRegAliases;
3498 NumAliases = llvm::array_lengthof(GCCRegAliases);
3499 }
3500};
3501
3502class Mips64EBTargetInfo : public Mips64TargetInfoBase {
3503 virtual void SetDescriptionString(const std::string &Name) {
3504 // Change DescriptionString only if ABI is n32.
3505 if (Name == "n32")
3506 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003507 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3508 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003509 }
3510public:
3511 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
3512 // Default ABI is n64.
3513 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003514 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3515 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003516 }
3517 virtual void getTargetDefines(const LangOptions &Opts,
3518 MacroBuilder &Builder) const {
3519 DefineStd(Builder, "mips", Opts);
3520 Builder.defineMacro("_mips");
3521 DefineStd(Builder, "MIPSEB", Opts);
3522 Builder.defineMacro("_MIPSEB");
3523 Builder.defineMacro("__REGISTER_PREFIX__", "");
3524 getArchDefines(Opts, Builder);
3525 }
3526};
3527
3528class Mips64ELTargetInfo : public Mips64TargetInfoBase {
3529 virtual void SetDescriptionString(const std::string &Name) {
3530 // Change DescriptionString only if ABI is n32.
3531 if (Name == "n32")
3532 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003533 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
3534 "-v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003535 }
3536public:
3537 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
3538 // Default ABI is n64.
3539 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003540 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3541 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003542 }
3543 virtual void getTargetDefines(const LangOptions &Opts,
3544 MacroBuilder &Builder) const {
3545 DefineStd(Builder, "mips", Opts);
3546 Builder.defineMacro("_mips");
3547 DefineStd(Builder, "MIPSEL", Opts);
3548 Builder.defineMacro("_MIPSEL");
3549 Builder.defineMacro("__REGISTER_PREFIX__", "");
3550 getArchDefines(Opts, Builder);
3551 }
3552};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003553} // end anonymous namespace.
3554
Ivan Krasinef05abd2011-08-24 20:22:22 +00003555namespace {
3556class PNaClTargetInfo : public TargetInfo {
3557public:
3558 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
3559 this->UserLabelPrefix = "";
3560 this->LongAlign = 32;
3561 this->LongWidth = 32;
3562 this->PointerAlign = 32;
3563 this->PointerWidth = 32;
3564 this->IntMaxType = TargetInfo::SignedLongLong;
3565 this->UIntMaxType = TargetInfo::UnsignedLongLong;
3566 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00003567 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00003568 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00003569 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00003570 this->SizeType = TargetInfo::UnsignedInt;
3571 this->PtrDiffType = TargetInfo::SignedInt;
3572 this->IntPtrType = TargetInfo::SignedInt;
David Meyerdd4a8892011-10-11 03:12:01 +00003573 this->RegParmMax = 2;
Ivan Krasinef05abd2011-08-24 20:22:22 +00003574 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
3575 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
3576 }
3577
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003578 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00003579 }
3580 virtual void getArchDefines(const LangOptions &Opts,
3581 MacroBuilder &Builder) const {
3582 Builder.defineMacro("__le32__");
3583 Builder.defineMacro("__pnacl__");
3584 }
3585 virtual void getTargetDefines(const LangOptions &Opts,
3586 MacroBuilder &Builder) const {
Ivan Krasin089ee112011-08-25 23:49:20 +00003587 DefineStd(Builder, "unix", Opts);
3588 Builder.defineMacro("__ELF__");
3589 if (Opts.POSIXThreads)
3590 Builder.defineMacro("_REENTRANT");
3591 if (Opts.CPlusPlus)
3592 Builder.defineMacro("_GNU_SOURCE");
3593
Ivan Krasinef05abd2011-08-24 20:22:22 +00003594 Builder.defineMacro("__native_client__");
3595 getArchDefines(Opts, Builder);
3596 }
3597 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3598 unsigned &NumRecords) const {
3599 }
3600 virtual const char *getVAListDeclaration() const {
Ivan Krasin68018db2011-09-20 14:56:54 +00003601 return "typedef int __builtin_va_list[4];";
Ivan Krasinef05abd2011-08-24 20:22:22 +00003602 }
3603 virtual void getGCCRegNames(const char * const *&Names,
3604 unsigned &NumNames) const;
3605 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3606 unsigned &NumAliases) const;
3607 virtual bool validateAsmConstraint(const char *&Name,
3608 TargetInfo::ConstraintInfo &Info) const {
3609 return false;
3610 }
3611
3612 virtual const char *getClobbers() const {
3613 return "";
3614 }
3615};
3616
3617void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
3618 unsigned &NumNames) const {
3619 Names = NULL;
3620 NumNames = 0;
3621}
3622
3623void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3624 unsigned &NumAliases) const {
3625 Aliases = NULL;
3626 NumAliases = 0;
3627}
3628} // end anonymous namespace.
3629
3630
Reid Spencer5f016e22007-07-11 17:01:13 +00003631//===----------------------------------------------------------------------===//
3632// Driver code
3633//===----------------------------------------------------------------------===//
3634
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003635static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003636 llvm::Triple Triple(T);
3637 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00003638
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003639 switch (Triple.getArch()) {
3640 default:
3641 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00003642
Tony Linthicum96319392011-12-12 21:14:55 +00003643 case llvm::Triple::hexagon:
3644 return new HexagonTargetInfo(T);
3645
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003646 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00003647 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003648 if (Triple.isOSDarwin())
3649 return new DarwinARMTargetInfo(T);
3650
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003651 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00003652 case llvm::Triple::Linux:
3653 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003654 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00003655 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003656 case llvm::Triple::NetBSD:
3657 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Douglas Gregordca52262011-07-01 22:41:14 +00003658 case llvm::Triple::RTEMS:
3659 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003660 default:
3661 return new ARMTargetInfo(T);
3662 }
Eli Friedman61538a72008-05-20 14:21:01 +00003663
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003664 case llvm::Triple::msp430:
3665 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00003666
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003667 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003668 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003669 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003670 return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003671 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003672 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003673 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003674 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003675 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003676 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003677 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003678 return new Mips32EBTargetInfo(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003679 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003680
3681 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003682 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003683 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003684 return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003685 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003686 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003687 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003688 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003689 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003690 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003691 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003692 return new Mips32ELTargetInfo(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003693 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003694
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003695 case llvm::Triple::mips64:
3696 switch (os) {
3697 case llvm::Triple::Linux:
3698 return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
3699 case llvm::Triple::RTEMS:
3700 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
3701 case llvm::Triple::FreeBSD:
3702 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
3703 case llvm::Triple::NetBSD:
3704 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
3705 default:
3706 return new Mips64EBTargetInfo(T);
3707 }
3708
3709 case llvm::Triple::mips64el:
3710 switch (os) {
3711 case llvm::Triple::Linux:
3712 return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
3713 case llvm::Triple::RTEMS:
3714 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
3715 case llvm::Triple::FreeBSD:
3716 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
3717 case llvm::Triple::NetBSD:
3718 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
3719 default:
3720 return new Mips64ELTargetInfo(T);
3721 }
3722
Ivan Krasinef05abd2011-08-24 20:22:22 +00003723 case llvm::Triple::le32:
3724 switch (os) {
3725 case llvm::Triple::NativeClient:
3726 return new PNaClTargetInfo(T);
3727 default:
3728 return NULL;
3729 }
3730
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003731 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003732 if (Triple.isOSDarwin())
Roman Divackyc81f2a22011-01-06 08:27:10 +00003733 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003734 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003735 case llvm::Triple::Linux:
3736 return new LinuxTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003737 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00003738 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003739 case llvm::Triple::NetBSD:
3740 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
3741 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00003742 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003743 default:
3744 return new PPC32TargetInfo(T);
3745 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003746
3747 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003748 if (Triple.isOSDarwin())
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00003749 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003750 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003751 case llvm::Triple::Linux:
3752 return new LinuxTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003753 case llvm::Triple::Lv2:
John Thompson3f6918a2009-11-19 17:18:50 +00003754 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003755 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00003756 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003757 case llvm::Triple::NetBSD:
3758 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
3759 default:
3760 return new PPC64TargetInfo(T);
3761 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003762
Justin Holewinski285dc652011-04-20 19:34:15 +00003763 case llvm::Triple::ptx32:
3764 return new PTX32TargetInfo(T);
3765 case llvm::Triple::ptx64:
3766 return new PTX64TargetInfo(T);
3767
Chris Lattner9cbeb632010-03-06 21:21:27 +00003768 case llvm::Triple::mblaze:
3769 return new MBlazeTargetInfo(T);
3770
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003771 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003772 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003773 case llvm::Triple::Linux:
3774 return new LinuxTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003775 case llvm::Triple::AuroraUX:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003776 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003777 case llvm::Triple::Solaris:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003778 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003779 case llvm::Triple::NetBSD:
3780 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
3781 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00003782 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003783 default:
3784 return new SparcV8TargetInfo(T);
3785 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003786
John Thompson3f6918a2009-11-19 17:18:50 +00003787 // FIXME: Need a real SPU target.
3788 case llvm::Triple::cellspu:
3789 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
3790
Eli Friedmanb63decf2009-08-19 20:47:07 +00003791 case llvm::Triple::tce:
3792 return new TCETargetInfo(T);
3793
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003794 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003795 if (Triple.isOSDarwin())
3796 return new DarwinI386TargetInfo(T);
3797
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003798 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003799 case llvm::Triple::AuroraUX:
3800 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003801 case llvm::Triple::Linux:
3802 return new LinuxTargetInfo<X86_32TargetInfo>(T);
3803 case llvm::Triple::DragonFly:
3804 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
3805 case llvm::Triple::NetBSD:
3806 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
3807 case llvm::Triple::OpenBSD:
3808 return new OpenBSDI386TargetInfo(T);
3809 case llvm::Triple::FreeBSD:
3810 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00003811 case llvm::Triple::Minix:
3812 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003813 case llvm::Triple::Solaris:
3814 return new SolarisTargetInfo<X86_32TargetInfo>(T);
3815 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003816 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003817 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003818 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003819 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00003820 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00003821 case llvm::Triple::Haiku:
3822 return new HaikuX86_32TargetInfo(T);
Douglas Gregordca52262011-07-01 22:41:14 +00003823 case llvm::Triple::RTEMS:
3824 return new RTEMSX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003825 default:
3826 return new X86_32TargetInfo(T);
3827 }
3828
3829 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003830 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
3831 return new DarwinX86_64TargetInfo(T);
3832
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003833 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003834 case llvm::Triple::AuroraUX:
3835 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003836 case llvm::Triple::Linux:
3837 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00003838 case llvm::Triple::DragonFly:
3839 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003840 case llvm::Triple::NetBSD:
3841 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
3842 case llvm::Triple::OpenBSD:
3843 return new OpenBSDX86_64TargetInfo(T);
3844 case llvm::Triple::FreeBSD:
3845 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
3846 case llvm::Triple::Solaris:
3847 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00003848 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003849 return new MinGWX86_64TargetInfo(T);
3850 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003851 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003852 default:
3853 return new X86_64TargetInfo(T);
3854 }
3855 }
Reid Spencer5f016e22007-07-11 17:01:13 +00003856}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003857
3858/// CreateTargetInfo - Return the target info object for the specified target
3859/// triple.
David Blaikied6471f72011-09-25 23:23:43 +00003860TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00003861 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003862 llvm::Triple Triple(Opts.Triple);
3863
3864 // Construct the target
3865 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
3866 if (!Target) {
3867 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
3868 return 0;
3869 }
3870
Daniel Dunbareac7c532009-12-18 18:42:37 +00003871 // Set the target CPU if specified.
3872 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
3873 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
3874 return 0;
3875 }
3876
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003877 // Set the target ABI if specified.
3878 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
3879 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
3880 return 0;
3881 }
3882
Charles Davis98b7c5c2010-06-11 01:06:47 +00003883 // Set the target C++ ABI.
John McCallee79a4c2010-08-21 22:46:04 +00003884 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis98b7c5c2010-06-11 01:06:47 +00003885 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
3886 return 0;
3887 }
3888
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003889 // Compute the default target features, we need the target to handle this
3890 // because features may have dependencies on one another.
3891 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003892 Target->getDefaultFeatures(Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003893
3894 // Apply the user specified deltas.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00003895 // First the enables.
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003896 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
3897 ie = Opts.Features.end(); it != ie; ++it) {
3898 const char *Name = it->c_str();
3899
Rafael Espindola53ac3d82011-11-27 20:00:43 +00003900 if (Name[0] != '+')
3901 continue;
3902
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003903 // Apply the feature via the target.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00003904 if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
3905 Diags.Report(diag::err_target_invalid_feature) << Name;
3906 return 0;
3907 }
3908 }
3909
3910 // Then the disables.
3911 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
3912 ie = Opts.Features.end(); it != ie; ++it) {
3913 const char *Name = it->c_str();
3914
3915 if (Name[0] == '+')
3916 continue;
3917
3918 // Apply the feature via the target.
3919 if (Name[0] != '-' ||
3920 !Target->setFeatureEnabled(Features, Name + 1, false)) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003921 Diags.Report(diag::err_target_invalid_feature) << Name;
3922 return 0;
3923 }
3924 }
3925
3926 // Add the features to the compile options.
3927 //
3928 // FIXME: If we are completely confident that we have the right set, we only
3929 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00003930 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003931 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
3932 ie = Features.end(); it != ie; ++it)
Chris Lattner1e5f83b2011-07-14 18:24:21 +00003933 Opts.Features.push_back(std::string(it->second ? "+" : "-") +
Chris Lattner48b78bd2011-07-14 18:45:41 +00003934 it->first().str());
Daniel Dunbarb93292a2009-12-19 03:30:57 +00003935 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003936
3937 return Target.take();
3938}