blob: a2674b8e11b5922365b672f32c111d220f3ba074 [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
Benjamin Kramer448f68d2012-01-10 11:50:09 +000057static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58 bool Tuning = true) {
59 Builder.defineMacro("__" + CPUName);
60 Builder.defineMacro("__" + CPUName + "__");
61 if (Tuning)
62 Builder.defineMacro("__tune_" + CPUName + "__");
63}
64
Chris Lattnerd29b6302008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner797c3c42009-08-10 19:03:04 +000068
Torok Edwin5f6c1942009-06-30 17:10:35 +000069namespace {
Douglas Gregora3844922009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Torok Edwin5f6c1942009-06-30 17:10:35 +000072protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Torok Edwin5f6c1942009-06-30 17:10:35 +000075public:
Douglas Gregora3844922009-07-01 15:12:53 +000076 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Torok Edwin5f6c1942009-06-30 17:10:35 +000077 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +000078 MacroBuilder &Builder) const {
79 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwinb0a5b242009-06-30 17:00:25 +000081 }
Torok Edwin5f6c1942009-06-30 17:10:35 +000082
83};
Chris Lattner4c28b1c2009-08-12 06:24:27 +000084} // end anonymous namespace
Torok Edwinb0a5b242009-06-30 17:00:25 +000085
Chris Lattner797c3c42009-08-10 19:03:04 +000086
Daniel Dunbar21ae3192010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner5f9e2722011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Benjamin Kramera9992772010-01-09 17:55:51 +000091 Builder.defineMacro("__APPLE_CC__", "5621");
92 Builder.defineMacro("__APPLE__");
93 Builder.defineMacro("__MACH__");
94 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000095
John McCall098df7f2011-06-16 00:03:19 +000096 if (!Opts.ObjCAutoRefCount) {
John McCallf85e1932011-06-15 23:02:42 +000097 // __weak is always defined, for use in blocks and with objc pointers.
98 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000099
John McCallf85e1932011-06-15 23:02:42 +0000100 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregore289d812011-09-13 17:21:33 +0000101 if (Opts.getGC() != LangOptions::NonGC)
John McCallf85e1932011-06-15 23:02:42 +0000102 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
103 else
104 Builder.defineMacro("__strong", "");
Eric Christopher7c9adf92011-07-07 22:55:26 +0000105
John McCallf85e1932011-06-15 23:02:42 +0000106 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
107 // allow this in C, since one might have block pointers in structs that
108 // are used in pure C code and in Objective-C ARC.
109 Builder.defineMacro("__unsafe_unretained", "");
John McCallf85e1932011-06-15 23:02:42 +0000110 }
Eric Christopher7c9adf92011-07-07 22:55:26 +0000111
Eli Friedman2de4fee2009-06-04 23:00:29 +0000112 if (Opts.Static)
Benjamin Kramera9992772010-01-09 17:55:51 +0000113 Builder.defineMacro("__STATIC__");
Eli Friedman2de4fee2009-06-04 23:00:29 +0000114 else
Benjamin Kramera9992772010-01-09 17:55:51 +0000115 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000116
117 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000118 Builder.defineMacro("_REENTRANT");
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000119
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000120 // Get the platform type and version number from the triple.
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000121 unsigned Maj, Min, Rev;
Mike Stump1eb44332009-09-09 15:08:12 +0000122
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000123 // If no version was given, default to to 10.4.0, for simplifying tests.
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000124 if (Triple.getOSName() == "darwin" || Triple.getOSName() == "osx") {
125 PlatformName = "macosx";
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000126 Min = Rev = 0;
127 Maj = 8;
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000128 } else {
129 // Otherwise, honor all three triple forms ("-darwinNNN[-iphoneos]",
130 // "-osxNNN", and "-iosNNN").
131
132 if (Triple.getOS() == llvm::Triple::Darwin) {
133 // For historical reasons that make little sense, the version passed here
134 // is the "darwin" version, which drops the 10 and offsets by 4.
135 Triple.getOSVersion(Maj, Min, Rev);
136
137 if (Triple.getEnvironmentName() == "iphoneos") {
138 PlatformName = "ios";
139 } else {
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000140 PlatformName = "macosx";
141 Rev = Min;
142 Min = Maj - 4;
143 Maj = 10;
144 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000145 } else {
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000146 Triple.getOSVersion(Maj, Min, Rev);
Daniel Dunbara4ff6482011-04-19 23:34:21 +0000147 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000148 }
149 }
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000150
Chad Rosierd9259f32011-07-19 20:00:06 +0000151 // If -ccc-host-triple arch-pc-win32-macho option specified, we're
Eric Christopher895d4222011-07-29 21:20:35 +0000152 // generating code for Win32 ABI. No need to emit
Chad Rosierd9259f32011-07-19 20:00:06 +0000153 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
154 if (PlatformName == "win32") {
155 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
156 return;
157 }
158
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000159 // Set the appropriate OS version define.
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000160 if (PlatformName == "ios") {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000161 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000162 char Str[6];
163 Str[0] = '0' + Maj;
164 Str[1] = '0' + (Min / 10);
165 Str[2] = '0' + (Min % 10);
166 Str[3] = '0' + (Rev / 10);
167 Str[4] = '0' + (Rev % 10);
168 Str[5] = '\0';
169 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
170 } else {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000171 // Note that the Driver allows versions which aren't representable in the
172 // define (because we only get a single digit for the minor and micro
173 // revision numbers). So, we limit them to the maximum representable
174 // version.
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000175 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000176 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000177 char Str[5];
178 Str[0] = '0' + (Maj / 10);
179 Str[1] = '0' + (Maj % 10);
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000180 Str[2] = '0' + std::min(Min, 9U);
181 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000182 Str[4] = '\0';
183 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000184 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000185
186 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman618234a2008-08-20 02:34:37 +0000187}
Reid Spencer5f016e22007-07-11 17:01:13 +0000188
Chris Lattner797c3c42009-08-10 19:03:04 +0000189namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000190template<typename Target>
191class DarwinTargetInfo : public OSTargetInfo<Target> {
192protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000193 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000194 MacroBuilder &Builder) const {
Eric Christopher7c9adf92011-07-07 22:55:26 +0000195 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000196 this->PlatformMinVersion);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000197 }
Mike Stump1eb44332009-09-09 15:08:12 +0000198
Torok Edwin5f6c1942009-06-30 17:10:35 +0000199public:
200 DarwinTargetInfo(const std::string& triple) :
201 OSTargetInfo<Target>(triple) {
Eric Christopheraa7333c2011-07-02 00:20:22 +0000202 llvm::Triple T = llvm::Triple(triple);
203 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
Daniel Dunbare177d3b2011-02-21 23:12:51 +0000204 this->MCountName = "\01mcount";
Torok Edwin5f6c1942009-06-30 17:10:35 +0000205 }
206
Chris Lattner5f9e2722011-07-23 10:55:15 +0000207 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner797c3c42009-08-10 19:03:04 +0000208 // Let MCSectionMachO validate this.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000209 StringRef Segment, Section;
Chris Lattner797c3c42009-08-10 19:03:04 +0000210 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000211 bool HasTAA;
Chris Lattner797c3c42009-08-10 19:03:04 +0000212 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000213 TAA, HasTAA, StubSize);
Chris Lattner797c3c42009-08-10 19:03:04 +0000214 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000215
Anders Carlsson18af3682010-06-08 22:47:50 +0000216 virtual const char *getStaticInitSectionSpecifier() const {
217 // FIXME: We should return 0 when building kexts.
218 return "__TEXT,__StaticInit,regular,pure_instructions";
219 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000220
Torok Edwin5f6c1942009-06-30 17:10:35 +0000221};
222
Chris Lattner797c3c42009-08-10 19:03:04 +0000223
Torok Edwin5f6c1942009-06-30 17:10:35 +0000224// DragonFlyBSD Target
225template<typename Target>
226class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
227protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000228 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000229 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000230 // DragonFly defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000231 Builder.defineMacro("__DragonFly__");
232 Builder.defineMacro("__DragonFly_cc_version", "100001");
233 Builder.defineMacro("__ELF__");
234 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
235 Builder.defineMacro("__tune_i386__");
236 DefineStd(Builder, "unix", Opts);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000237 }
238public:
Mike Stump1eb44332009-09-09 15:08:12 +0000239 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000240 : OSTargetInfo<Target>(triple) {}
241};
242
243// FreeBSD Target
244template<typename Target>
245class FreeBSDTargetInfo : public OSTargetInfo<Target> {
246protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000247 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000248 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000249 // FreeBSD defines; list based off of gcc output
250
Benjamin Kramer474202f2011-10-18 10:10:08 +0000251 unsigned Release = Triple.getOSMajorVersion();
252 if (Release == 0U)
253 Release = 8;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000254
Benjamin Kramer474202f2011-10-18 10:10:08 +0000255 Builder.defineMacro("__FreeBSD__", Twine(Release));
256 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramera9992772010-01-09 17:55:51 +0000257 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
258 DefineStd(Builder, "unix", Opts);
259 Builder.defineMacro("__ELF__");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000260 }
261public:
Mike Stump1eb44332009-09-09 15:08:12 +0000262 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands1e90faf2009-07-08 13:55:08 +0000263 : OSTargetInfo<Target>(triple) {
264 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000265
266 llvm::Triple Triple(triple);
267 switch (Triple.getArch()) {
268 default:
269 case llvm::Triple::x86:
270 case llvm::Triple::x86_64:
271 this->MCountName = ".mcount";
272 break;
273 case llvm::Triple::mips:
274 case llvm::Triple::mipsel:
275 case llvm::Triple::ppc:
276 case llvm::Triple::ppc64:
277 this->MCountName = "_mcount";
278 break;
279 case llvm::Triple::arm:
280 this->MCountName = "__mcount";
281 break;
282 }
283
Duncan Sands1e90faf2009-07-08 13:55:08 +0000284 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000285};
286
Chris Lattner38e317d2010-07-07 16:01:42 +0000287// Minix Target
288template<typename Target>
289class MinixTargetInfo : public OSTargetInfo<Target> {
290protected:
291 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
292 MacroBuilder &Builder) const {
293 // Minix defines
294
295 Builder.defineMacro("__minix", "3");
296 Builder.defineMacro("_EM_WSIZE", "4");
297 Builder.defineMacro("_EM_PSIZE", "4");
298 Builder.defineMacro("_EM_SSIZE", "2");
299 Builder.defineMacro("_EM_LSIZE", "4");
300 Builder.defineMacro("_EM_FSIZE", "4");
301 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman6d402dc2011-12-08 23:54:21 +0000302 Builder.defineMacro("__ELF__");
Chris Lattner38e317d2010-07-07 16:01:42 +0000303 DefineStd(Builder, "unix", Opts);
304 }
305public:
306 MinixTargetInfo(const std::string &triple)
307 : OSTargetInfo<Target>(triple) {
308 this->UserLabelPrefix = "";
309 }
310};
311
Torok Edwin5f6c1942009-06-30 17:10:35 +0000312// Linux target
313template<typename Target>
314class LinuxTargetInfo : public OSTargetInfo<Target> {
315protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000316 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000317 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000318 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000319 DefineStd(Builder, "unix", Opts);
320 DefineStd(Builder, "linux", Opts);
321 Builder.defineMacro("__gnu_linux__");
322 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000323 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000324 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000325 if (Opts.CPlusPlus)
326 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000327 }
328public:
Mike Stump1eb44332009-09-09 15:08:12 +0000329 LinuxTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000330 : OSTargetInfo<Target>(triple) {
331 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000332 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000333 }
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000334
335 virtual const char *getStaticInitSectionSpecifier() const {
336 return ".text.startup";
337 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000338};
339
Chris Lattnerb62bb282009-07-13 20:29:08 +0000340// NetBSD Target
341template<typename Target>
342class NetBSDTargetInfo : public OSTargetInfo<Target> {
343protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000344 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000345 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000346 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000347 Builder.defineMacro("__NetBSD__");
348 Builder.defineMacro("__unix__");
349 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000350 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000351 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000352 }
353public:
Mike Stump1eb44332009-09-09 15:08:12 +0000354 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerb62bb282009-07-13 20:29:08 +0000355 : OSTargetInfo<Target>(triple) {
356 this->UserLabelPrefix = "";
357 }
358};
359
Torok Edwin5f6c1942009-06-30 17:10:35 +0000360// OpenBSD Target
361template<typename Target>
362class OpenBSDTargetInfo : public OSTargetInfo<Target> {
363protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000364 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000365 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000366 // OpenBSD defines; list based off of gcc output
367
Benjamin Kramera9992772010-01-09 17:55:51 +0000368 Builder.defineMacro("__OpenBSD__");
369 DefineStd(Builder, "unix", Opts);
370 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000371 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000372 Builder.defineMacro("_POSIX_THREADS");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000373 }
374public:
Mike Stump1eb44332009-09-09 15:08:12 +0000375 OpenBSDTargetInfo(const std::string &triple)
Eli Friedman62d829a2011-12-15 02:15:56 +0000376 : OSTargetInfo<Target>(triple) {
377 this->UserLabelPrefix = "";
378
379 llvm::Triple Triple(triple);
380 switch (Triple.getArch()) {
381 default:
382 case llvm::Triple::x86:
383 case llvm::Triple::x86_64:
384 case llvm::Triple::arm:
385 case llvm::Triple::sparc:
386 this->MCountName = "__mcount";
387 break;
388 case llvm::Triple::mips64:
389 case llvm::Triple::mips64el:
390 case llvm::Triple::ppc:
391 case llvm::Triple::sparcv9:
392 this->MCountName = "_mcount";
393 break;
394 }
395 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000396};
397
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000398// PSP Target
399template<typename Target>
400class PSPTargetInfo : public OSTargetInfo<Target> {
401protected:
402 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000403 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000404 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000405 Builder.defineMacro("PSP");
406 Builder.defineMacro("_PSP");
407 Builder.defineMacro("__psp__");
408 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000409 }
410public:
411 PSPTargetInfo(const std::string& triple)
412 : OSTargetInfo<Target>(triple) {
413 this->UserLabelPrefix = "";
414 }
415};
416
John Thompson3f6918a2009-11-19 17:18:50 +0000417// PS3 PPU Target
418template<typename Target>
419class PS3PPUTargetInfo : public OSTargetInfo<Target> {
420protected:
421 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000422 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000423 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000424 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000425 Builder.defineMacro("__PPU__");
426 Builder.defineMacro("__CELLOS_LV2__");
427 Builder.defineMacro("__ELF__");
428 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000429 Builder.defineMacro("_ARCH_PPC64");
430 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000431 }
432public:
433 PS3PPUTargetInfo(const std::string& triple)
434 : OSTargetInfo<Target>(triple) {
435 this->UserLabelPrefix = "";
Nick Lewycky99520702011-12-16 22:32:39 +0000436 this->LongWidth = this->LongAlign = 32;
437 this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000438 this->IntMaxType = TargetInfo::SignedLongLong;
439 this->UIntMaxType = TargetInfo::UnsignedLongLong;
440 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000441 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000442 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 +0000443 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000444 }
445};
446
447// FIXME: Need a real SPU target.
448// PS3 SPU Target
449template<typename Target>
450class PS3SPUTargetInfo : public OSTargetInfo<Target> {
451protected:
452 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000453 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000454 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000455 Builder.defineMacro("__SPU__");
456 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000457 }
458public:
459 PS3SPUTargetInfo(const std::string& triple)
460 : OSTargetInfo<Target>(triple) {
461 this->UserLabelPrefix = "";
462 }
463};
464
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000465// AuroraUX target
466template<typename Target>
467class AuroraUXTargetInfo : public OSTargetInfo<Target> {
468protected:
469 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000470 MacroBuilder &Builder) const {
471 DefineStd(Builder, "sun", Opts);
472 DefineStd(Builder, "unix", Opts);
473 Builder.defineMacro("__ELF__");
474 Builder.defineMacro("__svr4__");
475 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000476 }
477public:
478 AuroraUXTargetInfo(const std::string& triple)
479 : OSTargetInfo<Target>(triple) {
480 this->UserLabelPrefix = "";
481 this->WCharType = this->SignedLong;
482 // FIXME: WIntType should be SignedLong
483 }
484};
485
Torok Edwin5f6c1942009-06-30 17:10:35 +0000486// Solaris target
487template<typename Target>
488class SolarisTargetInfo : public OSTargetInfo<Target> {
489protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000490 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000491 MacroBuilder &Builder) const {
492 DefineStd(Builder, "sun", Opts);
493 DefineStd(Builder, "unix", Opts);
494 Builder.defineMacro("__ELF__");
495 Builder.defineMacro("__svr4__");
496 Builder.defineMacro("__SVR4");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000497 }
498public:
Mike Stump1eb44332009-09-09 15:08:12 +0000499 SolarisTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000500 : OSTargetInfo<Target>(triple) {
501 this->UserLabelPrefix = "";
502 this->WCharType = this->SignedLong;
503 // FIXME: WIntType should be SignedLong
504 }
505};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000506
507// Windows target
508template<typename Target>
509class WindowsTargetInfo : public OSTargetInfo<Target> {
510protected:
511 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
512 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000513 Builder.defineMacro("_WIN32");
514 }
515 void getVisualStudioDefines(const LangOptions &Opts,
516 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000517 if (Opts.CPlusPlus) {
518 if (Opts.RTTI)
519 Builder.defineMacro("_CPPRTTI");
520
521 if (Opts.Exceptions)
522 Builder.defineMacro("_CPPUNWIND");
523 }
524
525 if (!Opts.CharIsSigned)
526 Builder.defineMacro("_CHAR_UNSIGNED");
527
528 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
529 // but it works for now.
530 if (Opts.POSIXThreads)
531 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000532
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000533 if (Opts.MSCVersion != 0)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000534 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000535
Francois Pichet62ec1f22011-09-17 17:15:52 +0000536 if (Opts.MicrosoftExt) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000537 Builder.defineMacro("_MSC_EXTENSIONS");
538
539 if (Opts.CPlusPlus0x) {
540 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
541 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
542 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
543 }
544 }
545
546 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000547 }
548
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000549public:
550 WindowsTargetInfo(const std::string &triple)
551 : OSTargetInfo<Target>(triple) {}
552};
553
Mike Stump1eb44332009-09-09 15:08:12 +0000554} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000555
Chris Lattnerd29b6302008-10-05 21:50:58 +0000556//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000557// Specific target implementations.
558//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000559
Eli Friedmane4277982008-08-20 23:11:40 +0000560namespace {
561// PPC abstract base class
562class PPCTargetInfo : public TargetInfo {
563 static const Builtin::Info BuiltinInfo[];
564 static const char * const GCCRegNames[];
565 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Eli Friedmane4277982008-08-20 23:11:40 +0000566public:
Eli Friedman15b91762009-06-05 07:05:05 +0000567 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
568
Eli Friedmane4277982008-08-20 23:11:40 +0000569 virtual void getTargetBuiltins(const Builtin::Info *&Records,
570 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000571 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000572 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000573 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000574
Chris Lattner33328642009-03-20 15:52:06 +0000575 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000576 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000577
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000578 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000579 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000580 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000581 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000582 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000583 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000584 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000585 default: return false;
586 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000587 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000588 case 'b': // Base register
589 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000590 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000591 break;
592 // FIXME: The following are added to allow parsing.
593 // I just took a guess at what the actions should be.
594 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000595 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000596 case 'v': // Altivec vector register
597 Info.setAllowsRegister();
598 break;
599 case 'w':
600 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000601 case 'd':// VSX vector register to hold vector double data
602 case 'f':// VSX vector register to hold vector float data
603 case 's':// VSX vector register to hold scalar float data
604 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000605 break;
606 default:
607 return false;
608 }
609 Info.setAllowsRegister();
610 Name++; // Skip over 'w'.
611 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000612 case 'h': // `MQ', `CTR', or `LINK' register
613 case 'q': // `MQ' register
614 case 'c': // `CTR' register
615 case 'l': // `LINK' register
616 case 'x': // `CR' register (condition register) number 0
617 case 'y': // `CR' register (condition register)
618 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000619 Info.setAllowsRegister();
620 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000621 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000622 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000623 // (use `L' instead for SImode constants)
624 case 'K': // Unsigned 16-bit constant
625 case 'L': // Signed 16-bit constant shifted left 16 bits
626 case 'M': // Constant larger than 31
627 case 'N': // Exact power of 2
628 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000629 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000630 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000631 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000632 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000633 break;
634 case 'm': // Memory operand. Note that on PowerPC targets, m can
635 // include addresses that update the base register. It
636 // is therefore only safe to use `m' in an asm statement
637 // if that asm statement accesses the operand exactly once.
638 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000639 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000640 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000641 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000642 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000643 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
644 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000645 // register to be updated.
646 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000647 if (Name[1] != 's')
648 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000649 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000650 // include any automodification of the base register. Unlike
651 // `m', this constraint can be used in asm statements that
652 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000653 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000654 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000655 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000656 break;
657 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000658 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000659 case 'Z': // Memory operand that is an indexed or indirect from a
660 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000661 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000662 Info.setAllowsMemory();
663 Info.setAllowsRegister();
664 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000665 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000666 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000667 // register (`p' is preferable for asm statements)
668 case 'S': // Constant suitable as a 64-bit mask operand
669 case 'T': // Constant suitable as a 32-bit mask operand
670 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000671 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000672 // instructions
673 case 'W': // Vector constant that does not require memory
674 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000675 break;
676 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000677 }
John Thompson8e6065a2010-06-24 22:44:13 +0000678 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000679 }
Eli Friedmane4277982008-08-20 23:11:40 +0000680 virtual const char *getClobbers() const {
681 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000682 }
Eli Friedmane4277982008-08-20 23:11:40 +0000683};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000684
Eli Friedmane4277982008-08-20 23:11:40 +0000685const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000686#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000687#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000688 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000689#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000690};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000691
692
Chris Lattnerc0f59212009-03-02 22:27:17 +0000693/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
694/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000695void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000696 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000697 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000698 Builder.defineMacro("__ppc__");
699 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000700 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000701 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000702 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000703 Builder.defineMacro("_ARCH_PPC64");
704 Builder.defineMacro("_LP64");
705 Builder.defineMacro("__LP64__");
Chris Lattnere03ae302010-02-16 18:14:57 +0000706 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000707 Builder.defineMacro("__ppc64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000708 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +0000709 Builder.defineMacro("__ppc__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000710 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000711
Chris Lattnerc0f59212009-03-02 22:27:17 +0000712 // Target properties.
Joerg Sonnenberger7cd1de52011-07-05 14:56:12 +0000713 if (getTriple().getOS() != llvm::Triple::NetBSD)
714 Builder.defineMacro("_BIG_ENDIAN");
Benjamin Kramera9992772010-01-09 17:55:51 +0000715 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000716
Chris Lattnerc0f59212009-03-02 22:27:17 +0000717 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000718 Builder.defineMacro("__NATURAL_ALIGNMENT__");
719 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000720
Chris Lattnerc0f59212009-03-02 22:27:17 +0000721 // FIXME: Should be controlled by command line option.
Benjamin Kramera9992772010-01-09 17:55:51 +0000722 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000723
John Thompson3f6918a2009-11-19 17:18:50 +0000724 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000725 Builder.defineMacro("__VEC__", "10206");
726 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000727 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000728}
729
Chris Lattner393ff042008-04-21 18:56:49 +0000730
Eli Friedmane4277982008-08-20 23:11:40 +0000731const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +0000732 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
733 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
734 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
735 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
736 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
737 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
738 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
739 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +0000740 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000741 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +0000742 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000743 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
744 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
745 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
746 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +0000747 "vrsave", "vscr",
748 "spe_acc", "spefscr",
749 "sfp"
750};
Reid Spencer5f016e22007-07-11 17:01:13 +0000751
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000752void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000753 unsigned &NumNames) const {
754 Names = GCCRegNames;
755 NumNames = llvm::array_lengthof(GCCRegNames);
756}
Reid Spencer5f016e22007-07-11 17:01:13 +0000757
Eli Friedmane4277982008-08-20 23:11:40 +0000758const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
759 // While some of these aliases do map to different registers
760 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000761 { { "0" }, "r0" },
762 { { "1"}, "r1" },
763 { { "2" }, "r2" },
764 { { "3" }, "r3" },
765 { { "4" }, "r4" },
766 { { "5" }, "r5" },
767 { { "6" }, "r6" },
768 { { "7" }, "r7" },
769 { { "8" }, "r8" },
770 { { "9" }, "r9" },
771 { { "10" }, "r10" },
772 { { "11" }, "r11" },
773 { { "12" }, "r12" },
774 { { "13" }, "r13" },
775 { { "14" }, "r14" },
776 { { "15" }, "r15" },
777 { { "16" }, "r16" },
778 { { "17" }, "r17" },
779 { { "18" }, "r18" },
780 { { "19" }, "r19" },
781 { { "20" }, "r20" },
782 { { "21" }, "r21" },
783 { { "22" }, "r22" },
784 { { "23" }, "r23" },
785 { { "24" }, "r24" },
786 { { "25" }, "r25" },
787 { { "26" }, "r26" },
788 { { "27" }, "r27" },
789 { { "28" }, "r28" },
790 { { "29" }, "r29" },
791 { { "30" }, "r30" },
792 { { "31" }, "r31" },
793 { { "fr0" }, "f0" },
794 { { "fr1" }, "f1" },
795 { { "fr2" }, "f2" },
796 { { "fr3" }, "f3" },
797 { { "fr4" }, "f4" },
798 { { "fr5" }, "f5" },
799 { { "fr6" }, "f6" },
800 { { "fr7" }, "f7" },
801 { { "fr8" }, "f8" },
802 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +0000803 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000804 { { "fr11" }, "f11" },
805 { { "fr12" }, "f12" },
806 { { "fr13" }, "f13" },
807 { { "fr14" }, "f14" },
808 { { "fr15" }, "f15" },
809 { { "fr16" }, "f16" },
810 { { "fr17" }, "f17" },
811 { { "fr18" }, "f18" },
812 { { "fr19" }, "f19" },
813 { { "fr20" }, "f20" },
814 { { "fr21" }, "f21" },
815 { { "fr22" }, "f22" },
816 { { "fr23" }, "f23" },
817 { { "fr24" }, "f24" },
818 { { "fr25" }, "f25" },
819 { { "fr26" }, "f26" },
820 { { "fr27" }, "f27" },
821 { { "fr28" }, "f28" },
822 { { "fr29" }, "f29" },
823 { { "fr30" }, "f30" },
824 { { "fr31" }, "f31" },
825 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +0000826};
827
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000828void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000829 unsigned &NumAliases) const {
830 Aliases = GCCRegAliases;
831 NumAliases = llvm::array_lengthof(GCCRegAliases);
832}
833} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +0000834
835namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000836class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000837public:
Chris Lattnere03ae302010-02-16 18:14:57 +0000838 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +0000839 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 +0000840 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +0000841
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +0000842 switch (getTriple().getOS()) {
843 case llvm::Triple::FreeBSD:
844 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +0000845 SizeType = UnsignedInt;
846 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +0000847 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +0000848 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +0000849 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000850 }
851
852 virtual const char *getVAListDeclaration() const {
853 // This is the ELF definition, and is overridden by the Darwin sub-target
854 return "typedef struct __va_list_tag {"
855 " unsigned char gpr;"
856 " unsigned char fpr;"
857 " unsigned short reserved;"
858 " void* overflow_arg_area;"
859 " void* reg_save_area;"
860 "} __builtin_va_list[1];";
Eli Friedmaned855cb2008-08-21 00:13:15 +0000861 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000862};
863} // end anonymous namespace.
864
865namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000866class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000867public:
Eli Friedmane4277982008-08-20 23:11:40 +0000868 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000869 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +0000870 IntMaxType = SignedLong;
871 UIntMaxType = UnsignedLong;
872 Int64Type = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000873 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 +0000874 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerf291b102008-05-09 06:17:04 +0000875 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000876 virtual const char *getVAListDeclaration() const {
877 return "typedef char* __builtin_va_list;";
878 }
Eli Friedmane4277982008-08-20 23:11:40 +0000879};
880} // end anonymous namespace.
881
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000882
883namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +0000884class DarwinPPC32TargetInfo :
885 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000886public:
Roman Divackyc81f2a22011-01-06 08:27:10 +0000887 DarwinPPC32TargetInfo(const std::string& triple)
888 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000889 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +0000890 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Nick Lewycky9bddf432011-12-21 04:25:47 +0000891 SuitableAlign = 128;
Roman Divackyc81f2a22011-01-06 08:27:10 +0000892 }
893 virtual const char *getVAListDeclaration() const {
894 return "typedef char* __builtin_va_list;";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000895 }
896};
897
898class DarwinPPC64TargetInfo :
899 public DarwinTargetInfo<PPC64TargetInfo> {
900public:
901 DarwinPPC64TargetInfo(const std::string& triple)
902 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
903 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +0000904 SuitableAlign = 128;
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000905 }
906};
907} // end anonymous namespace.
908
Reid Spencer5f016e22007-07-11 17:01:13 +0000909namespace {
Justin Holewinski25bedca2011-10-03 17:28:37 +0000910 static const unsigned PTXAddrSpaceMap[] = {
911 0, // opencl_global
912 4, // opencl_local
913 1 // opencl_constant
914 };
Justin Holewinski285dc652011-04-20 19:34:15 +0000915 class PTXTargetInfo : public TargetInfo {
916 static const char * const GCCRegNames[];
917 static const Builtin::Info BuiltinInfo[];
Justin Holewinskid8e0fe62011-09-22 17:57:40 +0000918 std::vector<llvm::StringRef> AvailableFeatures;
Justin Holewinski285dc652011-04-20 19:34:15 +0000919 public:
920 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +0000921 BigEndian = false;
Justin Holewinski285dc652011-04-20 19:34:15 +0000922 TLSSupported = false;
923 LongWidth = LongAlign = 64;
Justin Holewinski25bedca2011-10-03 17:28:37 +0000924 AddrSpaceMap = &PTXAddrSpaceMap;
Justin Holewinskid8e0fe62011-09-22 17:57:40 +0000925 // Define available target features
926 // These must be defined in sorted order!
927 AvailableFeatures.push_back("compute10");
928 AvailableFeatures.push_back("compute11");
929 AvailableFeatures.push_back("compute12");
930 AvailableFeatures.push_back("compute13");
931 AvailableFeatures.push_back("compute20");
932 AvailableFeatures.push_back("double");
933 AvailableFeatures.push_back("no-fma");
934 AvailableFeatures.push_back("ptx20");
935 AvailableFeatures.push_back("ptx21");
936 AvailableFeatures.push_back("ptx22");
937 AvailableFeatures.push_back("ptx23");
938 AvailableFeatures.push_back("sm10");
939 AvailableFeatures.push_back("sm11");
940 AvailableFeatures.push_back("sm12");
941 AvailableFeatures.push_back("sm13");
942 AvailableFeatures.push_back("sm20");
943 AvailableFeatures.push_back("sm21");
944 AvailableFeatures.push_back("sm22");
945 AvailableFeatures.push_back("sm23");
Justin Holewinski285dc652011-04-20 19:34:15 +0000946 }
947 virtual void getTargetDefines(const LangOptions &Opts,
948 MacroBuilder &Builder) const {
949 Builder.defineMacro("__PTX__");
950 }
951 virtual void getTargetBuiltins(const Builtin::Info *&Records,
952 unsigned &NumRecords) const {
953 Records = BuiltinInfo;
954 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
955 }
956
957 virtual void getGCCRegNames(const char * const *&Names,
958 unsigned &NumNames) const;
959 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
960 unsigned &NumAliases) const {
961 // No aliases.
962 Aliases = 0;
963 NumAliases = 0;
964 }
965 virtual bool validateAsmConstraint(const char *&Name,
966 TargetInfo::ConstraintInfo &info) const {
967 // FIXME: implement
968 return true;
969 }
970 virtual const char *getClobbers() const {
971 // FIXME: Is this really right?
972 return "";
973 }
974 virtual const char *getVAListDeclaration() const {
975 // FIXME: implement
976 return "typedef char* __builtin_va_list;";
977 }
Justin Holewinski808ef662011-09-15 12:13:38 +0000978
979 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
980 const std::string &Name,
981 bool Enabled) const;
Justin Holewinski285dc652011-04-20 19:34:15 +0000982 };
983
984 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000985#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +0000986#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000987 ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +0000988#include "clang/Basic/BuiltinsPTX.def"
989 };
990
991 const char * const PTXTargetInfo::GCCRegNames[] = {
992 "r0"
993 };
994
995 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
996 unsigned &NumNames) const {
997 Names = GCCRegNames;
998 NumNames = llvm::array_lengthof(GCCRegNames);
999 }
1000
Justin Holewinski808ef662011-09-15 12:13:38 +00001001 bool PTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1002 const std::string &Name,
1003 bool Enabled) const {
Justin Holewinskid8e0fe62011-09-22 17:57:40 +00001004 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1005 Name)) {
1006 Features[Name] = Enabled;
1007 return true;
Justin Holewinski808ef662011-09-15 12:13:38 +00001008 } else {
Justin Holewinskid8e0fe62011-09-22 17:57:40 +00001009 return false;
Justin Holewinski808ef662011-09-15 12:13:38 +00001010 }
Justin Holewinski808ef662011-09-15 12:13:38 +00001011 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001012
1013 class PTX32TargetInfo : public PTXTargetInfo {
1014 public:
1015 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1016 PointerWidth = PointerAlign = 32;
1017 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
1018 DescriptionString
1019 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
1020 }
1021 };
1022
1023 class PTX64TargetInfo : public PTXTargetInfo {
1024 public:
1025 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1026 PointerWidth = PointerAlign = 64;
1027 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
1028 DescriptionString
1029 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
1030 }
1031 };
1032}
1033
1034namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +00001035// MBlaze abstract base class
1036class MBlazeTargetInfo : public TargetInfo {
1037 static const char * const GCCRegNames[];
1038 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1039
1040public:
1041 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +00001042 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +00001043 }
1044
1045 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1046 unsigned &NumRecords) const {
1047 // FIXME: Implement.
1048 Records = 0;
1049 NumRecords = 0;
1050 }
1051
1052 virtual void getTargetDefines(const LangOptions &Opts,
1053 MacroBuilder &Builder) const;
1054
1055 virtual const char *getVAListDeclaration() const {
1056 return "typedef char* __builtin_va_list;";
1057 }
1058 virtual const char *getTargetPrefix() const {
1059 return "mblaze";
1060 }
1061 virtual void getGCCRegNames(const char * const *&Names,
1062 unsigned &NumNames) const;
1063 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1064 unsigned &NumAliases) const;
1065 virtual bool validateAsmConstraint(const char *&Name,
1066 TargetInfo::ConstraintInfo &Info) const {
1067 switch (*Name) {
1068 default: return false;
1069 case 'O': // Zero
1070 return true;
1071 case 'b': // Base register
1072 case 'f': // Floating point register
1073 Info.setAllowsRegister();
1074 return true;
1075 }
1076 }
1077 virtual const char *getClobbers() const {
1078 return "";
1079 }
1080};
1081
1082/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1083/// #defines that are not tied to a specific subtarget.
1084void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1085 MacroBuilder &Builder) const {
1086 // Target identification.
1087 Builder.defineMacro("__microblaze__");
1088 Builder.defineMacro("_ARCH_MICROBLAZE");
1089 Builder.defineMacro("__MICROBLAZE__");
1090
1091 // Target properties.
1092 Builder.defineMacro("_BIG_ENDIAN");
1093 Builder.defineMacro("__BIG_ENDIAN__");
1094
1095 // Subtarget options.
1096 Builder.defineMacro("__REGISTER_PREFIX__", "");
1097}
1098
1099
1100const char * const MBlazeTargetInfo::GCCRegNames[] = {
1101 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1102 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1103 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1104 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1105 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1106 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1107 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1108 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1109 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1110 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1111};
1112
1113void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1114 unsigned &NumNames) const {
1115 Names = GCCRegNames;
1116 NumNames = llvm::array_lengthof(GCCRegNames);
1117}
1118
1119const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1120 { {"f0"}, "r0" },
1121 { {"f1"}, "r1" },
1122 { {"f2"}, "r2" },
1123 { {"f3"}, "r3" },
1124 { {"f4"}, "r4" },
1125 { {"f5"}, "r5" },
1126 { {"f6"}, "r6" },
1127 { {"f7"}, "r7" },
1128 { {"f8"}, "r8" },
1129 { {"f9"}, "r9" },
1130 { {"f10"}, "r10" },
1131 { {"f11"}, "r11" },
1132 { {"f12"}, "r12" },
1133 { {"f13"}, "r13" },
1134 { {"f14"}, "r14" },
1135 { {"f15"}, "r15" },
1136 { {"f16"}, "r16" },
1137 { {"f17"}, "r17" },
1138 { {"f18"}, "r18" },
1139 { {"f19"}, "r19" },
1140 { {"f20"}, "r20" },
1141 { {"f21"}, "r21" },
1142 { {"f22"}, "r22" },
1143 { {"f23"}, "r23" },
1144 { {"f24"}, "r24" },
1145 { {"f25"}, "r25" },
1146 { {"f26"}, "r26" },
1147 { {"f27"}, "r27" },
1148 { {"f28"}, "r28" },
1149 { {"f29"}, "r29" },
1150 { {"f30"}, "r30" },
1151 { {"f31"}, "r31" },
1152};
1153
1154void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1155 unsigned &NumAliases) const {
1156 Aliases = GCCRegAliases;
1157 NumAliases = llvm::array_lengthof(GCCRegAliases);
1158}
1159} // end anonymous namespace.
1160
1161namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001162// Namespace for x86 abstract base class
1163const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001164#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001165#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001166 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +00001167#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +00001168};
Eli Friedman61538a72008-05-20 14:21:01 +00001169
Nuno Lopes2550d702009-12-23 17:49:57 +00001170static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +00001171 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1172 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001173 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman618234a2008-08-20 02:34:37 +00001174 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1175 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1176 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001177 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001178 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1179 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman618234a2008-08-20 02:34:37 +00001180};
1181
Eric Christophercfd323d2011-06-21 00:05:20 +00001182const TargetInfo::AddlRegName AddlRegNames[] = {
1183 { { "al", "ah", "eax", "rax" }, 0 },
1184 { { "bl", "bh", "ebx", "rbx" }, 3 },
1185 { { "cl", "ch", "ecx", "rcx" }, 2 },
1186 { { "dl", "dh", "edx", "rdx" }, 1 },
1187 { { "esi", "rsi" }, 4 },
1188 { { "edi", "rdi" }, 5 },
1189 { { "esp", "rsp" }, 7 },
1190 { { "ebp", "rbp" }, 6 },
Eli Friedman618234a2008-08-20 02:34:37 +00001191};
1192
1193// X86 target abstract base class; x86-32 and x86-64 are very close, so
1194// most of the implementation can be shared.
1195class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001196 enum X86SSEEnum {
Craig Topper05fe4b52012-01-09 09:19:09 +00001197 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
Chris Lattner84f0ea82009-03-02 22:40:39 +00001198 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001199 enum MMX3DNowEnum {
1200 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1201 } MMX3DNowLevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001202
Eric Christophereea12d12010-04-02 23:50:19 +00001203 bool HasAES;
Craig Topper31ceea02011-12-25 05:06:45 +00001204 bool HasLZCNT;
1205 bool HasBMI;
1206 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001207 bool HasPOPCNT;
Craig Topper6a511e12011-12-30 07:33:42 +00001208 bool HasFMA4;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001209
Chandler Carruth499d9722011-09-28 08:55:34 +00001210 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1211 ///
1212 /// Each enumeration represents a particular CPU supported by Clang. These
1213 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1214 enum CPUKind {
1215 CK_Generic,
1216
1217 /// \name i386
1218 /// i386-generation processors.
1219 //@{
1220 CK_i386,
1221 //@}
1222
1223 /// \name i486
1224 /// i486-generation processors.
1225 //@{
1226 CK_i486,
1227 CK_WinChipC6,
1228 CK_WinChip2,
1229 CK_C3,
1230 //@}
1231
1232 /// \name i586
1233 /// i586-generation processors, P5 microarchitecture based.
1234 //@{
1235 CK_i586,
1236 CK_Pentium,
1237 CK_PentiumMMX,
1238 //@}
1239
1240 /// \name i686
1241 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1242 //@{
1243 CK_i686,
1244 CK_PentiumPro,
1245 CK_Pentium2,
1246 CK_Pentium3,
1247 CK_Pentium3M,
1248 CK_PentiumM,
1249 CK_C3_2,
1250
1251 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1252 /// Clang however has some logic to suport this.
1253 // FIXME: Warn, deprecate, and potentially remove this.
1254 CK_Yonah,
1255 //@}
1256
1257 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001258 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001259 //@{
1260 CK_Pentium4,
1261 CK_Pentium4M,
1262 CK_Prescott,
1263 CK_Nocona,
1264 //@}
1265
1266 /// \name Core
1267 /// Core microarchitecture based processors.
1268 //@{
1269 CK_Core2,
1270
1271 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1272 /// codename which GCC no longer accepts as an option to -march, but Clang
1273 /// has some logic for recognizing it.
1274 // FIXME: Warn, deprecate, and potentially remove this.
1275 CK_Penryn,
1276 //@}
1277
1278 /// \name Atom
1279 /// Atom processors
1280 //@{
1281 CK_Atom,
1282 //@}
1283
1284 /// \name Nehalem
1285 /// Nehalem microarchitecture based processors.
1286 //@{
1287 CK_Corei7,
1288 CK_Corei7AVX,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001289 CK_CoreAVXi,
Craig Topper2b03bb02011-12-17 19:55:21 +00001290 CK_CoreAVX2,
Chandler Carruth499d9722011-09-28 08:55:34 +00001291 //@}
1292
1293 /// \name K6
1294 /// K6 architecture processors.
1295 //@{
1296 CK_K6,
1297 CK_K6_2,
1298 CK_K6_3,
1299 //@}
1300
1301 /// \name K7
1302 /// K7 architecture processors.
1303 //@{
1304 CK_Athlon,
1305 CK_AthlonThunderbird,
1306 CK_Athlon4,
1307 CK_AthlonXP,
1308 CK_AthlonMP,
1309 //@}
1310
1311 /// \name K8
1312 /// K8 architecture processors.
1313 //@{
1314 CK_Athlon64,
1315 CK_Athlon64SSE3,
1316 CK_AthlonFX,
1317 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001318 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001319 CK_Opteron,
1320 CK_OpteronSSE3,
Roman Divacky01c770d2011-10-30 07:48:46 +00001321 CK_AMDFAM10,
Chandler Carruth499d9722011-09-28 08:55:34 +00001322
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001323 /// \name K10
1324 /// K10 architecture processors.
1325 //@{
1326 CK_BDVER1,
1327 CK_BDVER2,
1328
Chandler Carruth499d9722011-09-28 08:55:34 +00001329 /// This specification is deprecated and will be removed in the future.
1330 /// Users should prefer \see CK_K8.
1331 // FIXME: Warn on this when the CPU is set to it.
1332 CK_x86_64,
1333 //@}
1334
1335 /// \name Geode
1336 /// Geode processors.
1337 //@{
1338 CK_Geode
1339 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001340 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001341
Eli Friedman618234a2008-08-20 02:34:37 +00001342public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001343 X86TargetInfo(const std::string& triple)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001344 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Craig Topper05fe4b52012-01-09 09:19:09 +00001345 HasAES(false), HasLZCNT(false), HasBMI(false), HasBMI2(false),
1346 HasPOPCNT(false), HasFMA4(false), CPU(CK_Generic) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001347 BigEndian = false;
Eli Friedman618234a2008-08-20 02:34:37 +00001348 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001349 }
Benjamin Kramerb4066692011-12-28 15:47:06 +00001350 virtual unsigned getFloatEvalMethod() const {
1351 // X87 evaluates with 80 bits "long double" precision.
1352 return SSELevel == NoSSE ? 2 : 0;
1353 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001354 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1355 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001356 Records = BuiltinInfo;
1357 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001358 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001359 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001360 unsigned &NumNames) const {
1361 Names = GCCRegNames;
1362 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001363 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001364 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001365 unsigned &NumAliases) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001366 Aliases = 0;
1367 NumAliases = 0;
1368 }
1369 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1370 unsigned &NumNames) const {
1371 Names = AddlRegNames;
1372 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001373 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001374 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001375 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings002333f2011-06-07 23:45:05 +00001376 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001377 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001378 return "~{dirflag},~{fpsr},~{flags}";
1379 }
Chris Lattner33328642009-03-20 15:52:06 +00001380 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001381 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001382 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1383 const std::string &Name,
1384 bool Enabled) const;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001385 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001386 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001387 virtual const char* getABI() const {
Craig Topper05fe4b52012-01-09 09:19:09 +00001388 if (PointerWidth == 64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001389 return "avx";
1390 else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow)
1391 return "no-mmx";
1392 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001393 }
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001394 virtual bool setCPU(const std::string &Name) {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001395 CPU = llvm::StringSwitch<CPUKind>(Name)
1396 .Case("i386", CK_i386)
1397 .Case("i486", CK_i486)
1398 .Case("winchip-c6", CK_WinChipC6)
1399 .Case("winchip2", CK_WinChip2)
1400 .Case("c3", CK_C3)
1401 .Case("i586", CK_i586)
1402 .Case("pentium", CK_Pentium)
1403 .Case("pentium-mmx", CK_PentiumMMX)
1404 .Case("i686", CK_i686)
1405 .Case("pentiumpro", CK_PentiumPro)
1406 .Case("pentium2", CK_Pentium2)
1407 .Case("pentium3", CK_Pentium3)
1408 .Case("pentium3m", CK_Pentium3M)
1409 .Case("pentium-m", CK_PentiumM)
1410 .Case("c3-2", CK_C3_2)
1411 .Case("yonah", CK_Yonah)
1412 .Case("pentium4", CK_Pentium4)
1413 .Case("pentium4m", CK_Pentium4M)
1414 .Case("prescott", CK_Prescott)
1415 .Case("nocona", CK_Nocona)
1416 .Case("core2", CK_Core2)
1417 .Case("penryn", CK_Penryn)
1418 .Case("atom", CK_Atom)
1419 .Case("corei7", CK_Corei7)
1420 .Case("corei7-avx", CK_Corei7AVX)
1421 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper2b03bb02011-12-17 19:55:21 +00001422 .Case("core-avx2", CK_CoreAVX2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001423 .Case("k6", CK_K6)
1424 .Case("k6-2", CK_K6_2)
1425 .Case("k6-3", CK_K6_3)
1426 .Case("athlon", CK_Athlon)
1427 .Case("athlon-tbird", CK_AthlonThunderbird)
1428 .Case("athlon-4", CK_Athlon4)
1429 .Case("athlon-xp", CK_AthlonXP)
1430 .Case("athlon-mp", CK_AthlonMP)
1431 .Case("athlon64", CK_Athlon64)
1432 .Case("athlon64-sse3", CK_Athlon64SSE3)
1433 .Case("athlon-fx", CK_AthlonFX)
1434 .Case("k8", CK_K8)
1435 .Case("k8-sse3", CK_K8SSE3)
1436 .Case("opteron", CK_Opteron)
1437 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky01c770d2011-10-30 07:48:46 +00001438 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001439 .Case("bdver1", CK_BDVER1)
1440 .Case("bdver2", CK_BDVER2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001441 .Case("x86-64", CK_x86_64)
1442 .Case("geode", CK_Geode)
1443 .Default(CK_Generic);
1444
Chandler Carruth26a39142011-09-28 09:45:08 +00001445 // Perform any per-CPU checks necessary to determine if this CPU is
1446 // acceptable.
1447 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1448 // invalid without explaining *why*.
1449 switch (CPU) {
1450 case CK_Generic:
1451 // No processor selected!
1452 return false;
1453
1454 case CK_i386:
1455 case CK_i486:
1456 case CK_WinChipC6:
1457 case CK_WinChip2:
1458 case CK_C3:
1459 case CK_i586:
1460 case CK_Pentium:
1461 case CK_PentiumMMX:
1462 case CK_i686:
1463 case CK_PentiumPro:
1464 case CK_Pentium2:
1465 case CK_Pentium3:
1466 case CK_Pentium3M:
1467 case CK_PentiumM:
1468 case CK_Yonah:
1469 case CK_C3_2:
1470 case CK_Pentium4:
1471 case CK_Pentium4M:
1472 case CK_Prescott:
1473 case CK_K6:
1474 case CK_K6_2:
1475 case CK_K6_3:
1476 case CK_Athlon:
1477 case CK_AthlonThunderbird:
1478 case CK_Athlon4:
1479 case CK_AthlonXP:
1480 case CK_AthlonMP:
1481 case CK_Geode:
1482 // Only accept certain architectures when compiling in 32-bit mode.
1483 if (PointerWidth != 32)
1484 return false;
1485
1486 // Fallthrough
1487 case CK_Nocona:
1488 case CK_Core2:
1489 case CK_Penryn:
1490 case CK_Atom:
1491 case CK_Corei7:
1492 case CK_Corei7AVX:
1493 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001494 case CK_CoreAVX2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001495 case CK_Athlon64:
1496 case CK_Athlon64SSE3:
1497 case CK_AthlonFX:
1498 case CK_K8:
1499 case CK_K8SSE3:
1500 case CK_Opteron:
1501 case CK_OpteronSSE3:
Roman Divacky01c770d2011-10-30 07:48:46 +00001502 case CK_AMDFAM10:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001503 case CK_BDVER1:
1504 case CK_BDVER2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001505 case CK_x86_64:
1506 return true;
1507 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00001508 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001509 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001510};
Chris Lattner3daed522009-03-02 22:20:04 +00001511
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001512void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001513 // FIXME: This should not be here.
1514 Features["3dnow"] = false;
1515 Features["3dnowa"] = false;
1516 Features["mmx"] = false;
1517 Features["sse"] = false;
1518 Features["sse2"] = false;
1519 Features["sse3"] = false;
1520 Features["ssse3"] = false;
1521 Features["sse41"] = false;
1522 Features["sse42"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00001523 Features["sse4a"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001524 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001525 Features["avx"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00001526 Features["avx2"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00001527 Features["lzcnt"] = false;
1528 Features["bmi"] = false;
1529 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00001530 Features["popcnt"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00001531 Features["fma4"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001532
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001533 // FIXME: This *really* should not be here.
1534
1535 // X86_64 always has SSE2.
1536 if (PointerWidth == 64)
1537 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1538
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001539 switch (CPU) {
1540 case CK_Generic:
1541 case CK_i386:
1542 case CK_i486:
1543 case CK_i586:
1544 case CK_Pentium:
1545 case CK_i686:
1546 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001547 break;
1548 case CK_PentiumMMX:
1549 case CK_Pentium2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001550 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001551 break;
1552 case CK_Pentium3:
1553 case CK_Pentium3M:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001554 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001555 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001556 break;
1557 case CK_PentiumM:
1558 case CK_Pentium4:
1559 case CK_Pentium4M:
1560 case CK_x86_64:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001561 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001562 setFeatureEnabled(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001563 break;
1564 case CK_Yonah:
1565 case CK_Prescott:
1566 case CK_Nocona:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001567 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001568 setFeatureEnabled(Features, "sse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001569 break;
1570 case CK_Core2:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001571 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001572 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001573 break;
1574 case CK_Penryn:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001575 setFeatureEnabled(Features, "mmx", true);
Benjamin Kramerb3453a82012-01-04 14:36:57 +00001576 setFeatureEnabled(Features, "sse4.1", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001577 break;
1578 case CK_Atom:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001579 setFeatureEnabled(Features, "mmx", true);
Chandler Carruth49defe62011-09-28 10:36:46 +00001580 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001581 break;
1582 case CK_Corei7:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001583 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001584 setFeatureEnabled(Features, "sse4", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001585 setFeatureEnabled(Features, "aes", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001586 break;
1587 case CK_Corei7AVX:
1588 case CK_CoreAVXi:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001589 setFeatureEnabled(Features, "mmx", true);
Roman Divackybcaa3b82011-04-05 20:32:44 +00001590 setFeatureEnabled(Features, "sse4", true);
1591 setFeatureEnabled(Features, "aes", true);
Bruno Cardoso Lopese02d3912011-07-11 23:33:46 +00001592 //setFeatureEnabled(Features, "avx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001593 break;
Craig Topper2b03bb02011-12-17 19:55:21 +00001594 case CK_CoreAVX2:
1595 setFeatureEnabled(Features, "mmx", true);
1596 setFeatureEnabled(Features, "sse4", true);
1597 setFeatureEnabled(Features, "aes", true);
Craig Topper31ceea02011-12-25 05:06:45 +00001598 setFeatureEnabled(Features, "lzcnt", true);
1599 setFeatureEnabled(Features, "bmi", true);
1600 setFeatureEnabled(Features, "bmi2", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00001601 //setFeatureEnabled(Features, "avx2", true);
1602 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001603 case CK_K6:
1604 case CK_WinChipC6:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001605 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001606 break;
1607 case CK_K6_2:
1608 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001609 case CK_WinChip2:
1610 case CK_C3:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001611 setFeatureEnabled(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001612 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00001613 case CK_Athlon:
1614 case CK_AthlonThunderbird:
1615 case CK_Geode:
1616 setFeatureEnabled(Features, "3dnowa", true);
1617 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001618 case CK_Athlon4:
1619 case CK_AthlonXP:
1620 case CK_AthlonMP:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001621 setFeatureEnabled(Features, "sse", true);
1622 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001623 break;
1624 case CK_K8:
1625 case CK_Opteron:
1626 case CK_Athlon64:
1627 case CK_AthlonFX:
Mike Stump1eb44332009-09-09 15:08:12 +00001628 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001629 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001630 break;
1631 case CK_K8SSE3:
1632 case CK_OpteronSSE3:
1633 case CK_Athlon64SSE3:
Roman Divacky80b32b82011-10-30 13:47:56 +00001634 setFeatureEnabled(Features, "sse3", true);
1635 setFeatureEnabled(Features, "3dnowa", true);
1636 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00001637 case CK_AMDFAM10:
Roman Divackyc8b09a12010-12-29 13:28:29 +00001638 setFeatureEnabled(Features, "sse3", true);
Roman Divacky80b32b82011-10-30 13:47:56 +00001639 setFeatureEnabled(Features, "sse4a", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00001640 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001641 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001642 case CK_BDVER1:
1643 case CK_BDVER2:
1644 setFeatureEnabled(Features, "sse4", true);
1645 setFeatureEnabled(Features, "sse4a", true);
1646 setFeatureEnabled(Features, "aes", true);
1647 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001648 case CK_C3_2:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001649 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001650 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001651 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001652 }
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001653}
1654
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001655bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump1eb44332009-09-09 15:08:12 +00001656 const std::string &Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001657 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00001658 // FIXME: This *really* should not be here. We need some way of translating
1659 // options into llvm subtarget features.
1660 if (!Features.count(Name) &&
1661 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001662 return false;
1663
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001664 // FIXME: this should probably use a switch with fall through.
1665
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001666 if (Enabled) {
1667 if (Name == "mmx")
1668 Features["mmx"] = true;
1669 else if (Name == "sse")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001670 Features["mmx"] = Features["sse"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001671 else if (Name == "sse2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001672 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001673 else if (Name == "sse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001674 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1675 true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001676 else if (Name == "ssse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001677 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001678 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001679 else if (Name == "sse4" || Name == "sse4.2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001680 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001681 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1682 Features["popcnt"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001683 else if (Name == "sse4.1")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001684 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopherd39ebe22010-03-04 02:26:37 +00001685 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001686 else if (Name == "3dnow")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001687 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001688 else if (Name == "3dnowa")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001689 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00001690 else if (Name == "aes")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001691 Features["aes"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001692 else if (Name == "avx")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001693 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1694 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001695 Features["popcnt"] = Features["avx"] = true;
Craig Topper2b03bb02011-12-17 19:55:21 +00001696 else if (Name == "avx2")
1697 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1698 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001699 Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
Craig Topper6a511e12011-12-30 07:33:42 +00001700 else if (Name == "fma4")
1701 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1702 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1703 Features["popcnt"] = Features["avx"] = Features["fma4"] = true;
Roman Divacky80b32b82011-10-30 13:47:56 +00001704 else if (Name == "sse4a")
Craig Topper6a511e12011-12-30 07:33:42 +00001705 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1706 Features["sse4a"] = true;
Craig Topper31ceea02011-12-25 05:06:45 +00001707 else if (Name == "lzcnt")
1708 Features["lzcnt"] = true;
1709 else if (Name == "bmi")
1710 Features["bmi"] = true;
1711 else if (Name == "bmi2")
1712 Features["bmi2"] = true;
Craig Toppere14e08b2011-12-29 16:10:46 +00001713 else if (Name == "popcnt")
1714 Features["popcnt"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001715 } else {
1716 if (Name == "mmx")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001717 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001718 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00001719 Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00001720 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1721 Features["sse4a"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001722 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00001723 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00001724 Features["sse41"] = Features["sse42"] = Features["sse4a"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001725 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001726 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Craig Topper6a511e12011-12-30 07:33:42 +00001727 Features["sse42"] = Features["sse4a"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001728 else if (Name == "ssse3")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001729 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencerb24bac92011-04-17 19:22:03 +00001730 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001731 Features["sse41"] = Features["sse42"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00001732 else if (Name == "sse4.2")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001733 Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001734 else if (Name == "3dnow")
1735 Features["3dnow"] = Features["3dnowa"] = false;
1736 else if (Name == "3dnowa")
1737 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001738 else if (Name == "aes")
1739 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001740 else if (Name == "avx")
Craig Topper6a511e12011-12-30 07:33:42 +00001741 Features["avx"] = Features["avx2"] = Features["fma4"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00001742 else if (Name == "avx2")
1743 Features["avx2"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00001744 else if (Name == "sse4a")
1745 Features["sse4a"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00001746 else if (Name == "lzcnt")
1747 Features["lzcnt"] = false;
1748 else if (Name == "bmi")
1749 Features["bmi"] = false;
1750 else if (Name == "bmi2")
1751 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00001752 else if (Name == "popcnt")
1753 Features["popcnt"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00001754 else if (Name == "fma4")
1755 Features["fma4"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001756 }
1757
1758 return true;
1759}
1760
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001761/// HandleTargetOptions - Perform initialization based on the user
1762/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001763void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001764 // Remember the maximum enabled sselevel.
1765 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1766 // Ignore disabled features.
1767 if (Features[i][0] == '-')
1768 continue;
1769
Eric Christophereea12d12010-04-02 23:50:19 +00001770 if (Features[i].substr(1) == "aes") {
1771 HasAES = true;
1772 continue;
1773 }
1774
Craig Topper31ceea02011-12-25 05:06:45 +00001775 if (Features[i].substr(1) == "lzcnt") {
1776 HasLZCNT = true;
1777 continue;
1778 }
1779
1780 if (Features[i].substr(1) == "bmi") {
1781 HasBMI = true;
1782 continue;
1783 }
1784
1785 if (Features[i].substr(1) == "bmi2") {
1786 HasBMI2 = true;
1787 continue;
1788 }
1789
Craig Toppere14e08b2011-12-29 16:10:46 +00001790 if (Features[i].substr(1) == "popcnt") {
1791 HasPOPCNT = true;
1792 continue;
1793 }
1794
Craig Topper6a511e12011-12-30 07:33:42 +00001795 if (Features[i].substr(1) == "fma4") {
1796 HasFMA4 = true;
1797 continue;
1798 }
1799
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001800 assert(Features[i][0] == '+' && "Invalid target feature!");
1801 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
Craig Topper05fe4b52012-01-09 09:19:09 +00001802 .Case("avx2", AVX2)
1803 .Case("avx", AVX)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001804 .Case("sse42", SSE42)
1805 .Case("sse41", SSE41)
1806 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00001807 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001808 .Case("sse2", SSE2)
1809 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001810 .Default(NoSSE);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001811 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001812
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001813 MMX3DNowEnum ThreeDNowLevel =
1814 llvm::StringSwitch<MMX3DNowEnum>(Features[i].substr(1))
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001815 .Case("3dnowa", AMD3DNowAthlon)
1816 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001817 .Case("mmx", MMX)
1818 .Default(NoMMX3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001819
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001820 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001821 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001822
1823 // Don't tell the backend if we're turning off mmx; it will end up disabling
1824 // SSE, which we don't want.
1825 std::vector<std::string>::iterator it;
1826 it = std::find(Features.begin(), Features.end(), "-mmx");
1827 if (it != Features.end())
1828 Features.erase(it);
Chris Lattner3daed522009-03-02 22:20:04 +00001829}
Chris Lattnerc0f59212009-03-02 22:27:17 +00001830
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001831/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
1832/// definitions for this particular subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00001833void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001834 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001835 // Target identification.
1836 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001837 Builder.defineMacro("_LP64");
1838 Builder.defineMacro("__LP64__");
1839 Builder.defineMacro("__amd64__");
1840 Builder.defineMacro("__amd64");
1841 Builder.defineMacro("__x86_64");
1842 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00001843 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00001844 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00001845 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001846
Chris Lattnerc0f59212009-03-02 22:27:17 +00001847 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001848 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
1849 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001850 switch (CPU) {
1851 case CK_Generic:
1852 break;
1853 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001854 // The rest are coming from the i386 define above.
1855 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001856 break;
1857 case CK_i486:
1858 case CK_WinChipC6:
1859 case CK_WinChip2:
1860 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001861 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001862 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00001863 case CK_PentiumMMX:
1864 Builder.defineMacro("__pentium_mmx__");
1865 Builder.defineMacro("__tune_pentium_mmx__");
1866 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001867 case CK_i586:
1868 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001869 defineCPUMacros(Builder, "i586");
1870 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001871 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001872 case CK_Pentium3:
1873 case CK_Pentium3M:
1874 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001875 Builder.defineMacro("__tune_pentium3__");
1876 // Fallthrough
1877 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001878 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001879 Builder.defineMacro("__tune_pentium2__");
1880 // Fallthrough
1881 case CK_PentiumPro:
1882 Builder.defineMacro("__tune_i686__");
1883 Builder.defineMacro("__tune_pentiumpro__");
1884 // Fallthrough
1885 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001886 Builder.defineMacro("__i686");
1887 Builder.defineMacro("__i686__");
1888 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
1889 Builder.defineMacro("__pentiumpro");
1890 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001891 break;
1892 case CK_Pentium4:
1893 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001894 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001895 break;
1896 case CK_Yonah:
1897 case CK_Prescott:
1898 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001899 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001900 break;
1901 case CK_Core2:
1902 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001903 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001904 break;
1905 case CK_Atom:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001906 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001907 break;
1908 case CK_Corei7:
1909 case CK_Corei7AVX:
1910 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001911 case CK_CoreAVX2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001912 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001913 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001914 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001915 Builder.defineMacro("__k6_2__");
1916 Builder.defineMacro("__tune_k6_2__");
1917 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001918 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001919 if (CPU != CK_K6_2) { // In case of fallthrough
1920 // FIXME: GCC may be enabling these in cases where some other k6
1921 // architecture is specified but -m3dnow is explicitly provided. The
1922 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001923 Builder.defineMacro("__k6_3__");
1924 Builder.defineMacro("__tune_k6_3__");
1925 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00001926 // Fallthrough
1927 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001928 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001929 break;
1930 case CK_Athlon:
1931 case CK_AthlonThunderbird:
1932 case CK_Athlon4:
1933 case CK_AthlonXP:
1934 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001935 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00001936 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001937 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00001938 Builder.defineMacro("__tune_athlon_sse__");
1939 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001940 break;
1941 case CK_K8:
1942 case CK_K8SSE3:
1943 case CK_x86_64:
1944 case CK_Opteron:
1945 case CK_OpteronSSE3:
1946 case CK_Athlon64:
1947 case CK_Athlon64SSE3:
1948 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001949 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001950 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00001951 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001952 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00001953 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001954 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001955 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001956 break;
1957 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001958 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001959 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001960 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001961 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001962 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001963 }
Chris Lattner84f0ea82009-03-02 22:40:39 +00001964
Chandler Carruth88c75b02011-09-28 09:54:07 +00001965 // Target properties.
1966 Builder.defineMacro("__LITTLE_ENDIAN__");
1967 Builder.defineMacro("__REGISTER_PREFIX__", "");
1968
Chris Lattner54175442009-04-19 17:32:33 +00001969 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1970 // functions in glibc header files that use FP Stack inline asm which the
1971 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00001972 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001973
Chandler Carruth88c75b02011-09-28 09:54:07 +00001974 if (HasAES)
1975 Builder.defineMacro("__AES__");
1976
Craig Topper31ceea02011-12-25 05:06:45 +00001977 if (HasLZCNT)
1978 Builder.defineMacro("__LZCNT__");
1979
1980 if (HasBMI)
1981 Builder.defineMacro("__BMI__");
1982
1983 if (HasBMI2)
1984 Builder.defineMacro("__BMI2__");
1985
Craig Toppere14e08b2011-12-29 16:10:46 +00001986 if (HasPOPCNT)
1987 Builder.defineMacro("__POPCNT__");
1988
Craig Topper6a511e12011-12-30 07:33:42 +00001989 if (HasFMA4)
1990 Builder.defineMacro("__FMA4__");
1991
Chris Lattner84f0ea82009-03-02 22:40:39 +00001992 // Each case falls through to the previous one here.
1993 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00001994 case AVX2:
1995 Builder.defineMacro("__AVX2__");
1996 case AVX:
1997 Builder.defineMacro("__AVX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00001998 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00001999 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002000 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00002001 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002002 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002003 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002004 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002005 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002006 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00002007 Builder.defineMacro("__SSE2__");
2008 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00002009 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00002010 Builder.defineMacro("__SSE__");
2011 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002012 case NoSSE:
Chris Lattner84f0ea82009-03-02 22:40:39 +00002013 break;
2014 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002015
Francois Pichet62ec1f22011-09-17 17:15:52 +00002016 if (Opts.MicrosoftExt && PointerWidth == 32) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002017 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002018 case AVX2:
2019 case AVX:
Michael J. Spencera764e832010-10-21 08:22:51 +00002020 case SSE42:
2021 case SSE41:
2022 case SSSE3:
2023 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002024 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002025 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002026 break;
2027 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002028 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002029 break;
2030 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002031 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002032 }
2033 }
2034
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002035 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002036 switch (MMX3DNowLevel) {
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002037 case AMD3DNowAthlon:
2038 Builder.defineMacro("__3dNOW_A__");
2039 case AMD3DNow:
2040 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002041 case MMX:
2042 Builder.defineMacro("__MMX__");
2043 case NoMMX3DNow:
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002044 break;
2045 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00002046}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002047
2048
Eli Friedman618234a2008-08-20 02:34:37 +00002049bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002050X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002051 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002052 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00002053 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00002054 case 'Y': // first letter of a pair:
2055 switch (*(Name+1)) {
2056 default: return false;
2057 case '0': // First SSE register.
2058 case 't': // Any SSE register, when SSE2 is enabled.
2059 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2060 case 'm': // any MMX register, when inter-unit moves enabled.
2061 break; // falls through to setAllowsRegister.
2062 }
Eli Friedman618234a2008-08-20 02:34:37 +00002063 case 'a': // eax.
2064 case 'b': // ebx.
2065 case 'c': // ecx.
2066 case 'd': // edx.
2067 case 'S': // esi.
2068 case 'D': // edi.
2069 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00002070 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00002071 case 't': // top of floating point stack.
2072 case 'u': // second from top of floating point stack.
2073 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00002074 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00002075 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00002076 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00002077 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2078 case 'l': // "Index" registers: any general register that can be used as an
2079 // index in a base+index memory access.
2080 Info.setAllowsRegister();
2081 return true;
2082 case 'C': // SSE floating point constant.
2083 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002084 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002085 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002086 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002087 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00002088 return true;
2089 }
Dale Johannesen545be512010-08-24 22:33:12 +00002090 return false;
Eli Friedman618234a2008-08-20 02:34:37 +00002091}
2092
Dale Johannesenf6e2c202010-10-29 23:12:32 +00002093
Eli Friedman618234a2008-08-20 02:34:37 +00002094std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00002095X86TargetInfo::convertConstraint(const char *&Constraint) const {
2096 switch (*Constraint) {
Eli Friedman618234a2008-08-20 02:34:37 +00002097 case 'a': return std::string("{ax}");
2098 case 'b': return std::string("{bx}");
2099 case 'c': return std::string("{cx}");
2100 case 'd': return std::string("{dx}");
2101 case 'S': return std::string("{si}");
2102 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00002103 case 'p': // address
2104 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00002105 case 't': // top of floating point stack.
2106 return std::string("{st}");
2107 case 'u': // second from top of floating point stack.
2108 return std::string("{st(1)}"); // second from top of floating point stack.
2109 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00002110 return std::string(1, *Constraint);
Eli Friedman618234a2008-08-20 02:34:37 +00002111 }
2112}
Eli Friedman618234a2008-08-20 02:34:37 +00002113} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00002114
2115namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002116// X86-32 generic target
2117class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00002118public:
Eli Friedman618234a2008-08-20 02:34:37 +00002119 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2120 DoubleAlign = LongLongAlign = 32;
2121 LongDoubleWidth = 96;
2122 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00002123 SuitableAlign = 128;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002124 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2125 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames567c6002011-10-11 00:52:51 +00002126 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman1afabd92009-03-29 20:31:09 +00002127 SizeType = UnsignedInt;
2128 PtrDiffType = SignedInt;
2129 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002130 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002131
2132 // Use fpret for all types.
2133 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2134 (1 << TargetInfo::Double) |
2135 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00002136
2137 // x86-32 has atomics up to 8 bytes
2138 // FIXME: Check that we actually have cmpxchg8b before setting
2139 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2140 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman618234a2008-08-20 02:34:37 +00002141 }
2142 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002143 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +00002144 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002145
Chris Lattner21fb98e2009-09-23 06:06:36 +00002146 int getEHDataRegisterNumber(unsigned RegNo) const {
2147 if (RegNo == 0) return 0;
2148 if (RegNo == 1) return 2;
2149 return -1;
2150 }
Eli Friedman618234a2008-08-20 02:34:37 +00002151};
2152} // end anonymous namespace
2153
2154namespace {
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00002155class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2156public:
2157 NetBSDI386TargetInfo(const std::string &triple) :
2158 NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2159 }
2160
2161 virtual unsigned getFloatEvalMethod() const {
2162 // NetBSD defaults to "double" rounding
2163 return 1;
2164 }
2165};
2166} // end anonymous namespace
2167
2168namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00002169class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2170public:
2171 OpenBSDI386TargetInfo(const std::string& triple) :
2172 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2173 SizeType = UnsignedLong;
2174 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00002175 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00002176 }
2177};
2178} // end anonymous namespace
2179
2180namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00002181class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00002182public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002183 DarwinI386TargetInfo(const std::string& triple) :
2184 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00002185 LongDoubleWidth = 128;
2186 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002187 SuitableAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +00002188 SizeType = UnsignedLong;
2189 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002190 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2191 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002192 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbar613fd672010-05-27 00:35:16 +00002193 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00002194 }
2195
Eli Friedman618234a2008-08-20 02:34:37 +00002196};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00002197} // end anonymous namespace
2198
2199namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00002200// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002201class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00002202public:
2203 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002204 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00002205 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00002206 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00002207 DoubleAlign = LongLongAlign = 64;
2208 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 +00002209 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002210 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedman29a30502008-08-21 01:40:19 +00002211 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002212 virtual void getTargetDefines(const LangOptions &Opts,
2213 MacroBuilder &Builder) const {
2214 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2215 }
2216};
2217} // end anonymous namespace
2218
2219namespace {
2220
2221// x86-32 Windows Visual Studio target
2222class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2223public:
2224 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2225 : WindowsX86_32TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002226 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00002227 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2228 }
2229 virtual void getTargetDefines(const LangOptions &Opts,
2230 MacroBuilder &Builder) const {
2231 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2232 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2233 // The value of the following reflects processor type.
2234 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2235 // We lost the original triple, so we use the default.
2236 Builder.defineMacro("_M_IX86", "600");
2237 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002238};
2239} // end anonymous namespace
2240
2241namespace {
2242// x86-32 MinGW target
2243class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2244public:
2245 MinGWX86_32TargetInfo(const std::string& triple)
2246 : WindowsX86_32TargetInfo(triple) {
2247 }
2248 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002249 MacroBuilder &Builder) const {
2250 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002251 DefineStd(Builder, "WIN32", Opts);
2252 DefineStd(Builder, "WINNT", Opts);
2253 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00002254 Builder.defineMacro("__MSVCRT__");
2255 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002256
2257 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2258 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002259 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002260 // Provide "as-is" __declspec.
2261 Builder.defineMacro("__declspec", "__declspec");
2262 else
2263 // Provide alias of __attribute__ like mingw32-gcc.
2264 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002265 }
2266};
2267} // end anonymous namespace
2268
2269namespace {
2270// x86-32 Cygwin target
2271class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2272public:
2273 CygwinX86_32TargetInfo(const std::string& triple)
2274 : X86_32TargetInfo(triple) {
2275 TLSSupported = false;
2276 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002277 DoubleAlign = LongLongAlign = 64;
2278 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2279 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002280 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002281 }
2282 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002283 MacroBuilder &Builder) const {
2284 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2285 Builder.defineMacro("__CYGWIN__");
2286 Builder.defineMacro("__CYGWIN32__");
2287 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00002288 if (Opts.CPlusPlus)
2289 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00002290 }
Eli Friedman29a30502008-08-21 01:40:19 +00002291};
2292} // end anonymous namespace
2293
2294namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00002295// x86-32 Haiku target
2296class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2297public:
2298 HaikuX86_32TargetInfo(const std::string& triple)
2299 : X86_32TargetInfo(triple) {
2300 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00002301 IntPtrType = SignedLong;
2302 PtrDiffType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00002303 this->UserLabelPrefix = "";
Eli Friedmana7e68452010-08-22 01:00:03 +00002304 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00002305 virtual void getTargetDefines(const LangOptions &Opts,
2306 MacroBuilder &Builder) const {
2307 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2308 Builder.defineMacro("__INTEL__");
2309 Builder.defineMacro("__HAIKU__");
2310 }
2311};
2312} // end anonymous namespace
2313
Douglas Gregordca52262011-07-01 22:41:14 +00002314// RTEMS Target
2315template<typename Target>
2316class RTEMSTargetInfo : public OSTargetInfo<Target> {
2317protected:
2318 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2319 MacroBuilder &Builder) const {
2320 // RTEMS defines; list based off of gcc output
2321
Douglas Gregordca52262011-07-01 22:41:14 +00002322 Builder.defineMacro("__rtems__");
2323 Builder.defineMacro("__ELF__");
2324 }
2325public:
2326 RTEMSTargetInfo(const std::string &triple)
2327 : OSTargetInfo<Target>(triple) {
2328 this->UserLabelPrefix = "";
2329
2330 llvm::Triple Triple(triple);
2331 switch (Triple.getArch()) {
2332 default:
2333 case llvm::Triple::x86:
2334 // this->MCountName = ".mcount";
2335 break;
2336 case llvm::Triple::mips:
2337 case llvm::Triple::mipsel:
2338 case llvm::Triple::ppc:
2339 case llvm::Triple::ppc64:
2340 // this->MCountName = "_mcount";
2341 break;
2342 case llvm::Triple::arm:
2343 // this->MCountName = "__mcount";
2344 break;
2345 }
2346
2347 }
2348};
2349
2350namespace {
2351// x86-32 RTEMS target
2352class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
2353public:
2354 RTEMSX86_32TargetInfo(const std::string& triple)
2355 : X86_32TargetInfo(triple) {
2356 SizeType = UnsignedLong;
2357 IntPtrType = SignedLong;
2358 PtrDiffType = SignedLong;
2359 this->UserLabelPrefix = "";
2360 }
2361 virtual void getTargetDefines(const LangOptions &Opts,
2362 MacroBuilder &Builder) const {
2363 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2364 Builder.defineMacro("__INTEL__");
2365 Builder.defineMacro("__rtems__");
2366 }
2367};
2368} // end anonymous namespace
2369
Chris Lattner86ed3a32010-04-11 19:29:39 +00002370namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002371// x86-64 generic target
2372class X86_64TargetInfo : public X86TargetInfo {
2373public:
Chris Lattner33328642009-03-20 15:52:06 +00002374 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00002375 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00002376 LongDoubleWidth = 128;
2377 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00002378 LargeArrayMinWidth = 128;
2379 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002380 SuitableAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00002381 IntMaxType = SignedLong;
2382 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002383 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002384 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00002385
Eli Friedmaned855cb2008-08-21 00:13:15 +00002386 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2387 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002388 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002389
2390 // Use fpret only for long double.
2391 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00002392
Anders Carlssoneea64802011-10-31 16:27:11 +00002393 // Use fp2ret for _Complex long double.
2394 ComplexLongDoubleUsesFP2Ret = true;
2395
Eli Friedman2be46072011-10-14 20:59:01 +00002396 // x86-64 has atomics up to 16 bytes.
2397 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
2398 // on CPUs with cmpxchg16b
2399 MaxAtomicPromoteWidth = 128;
2400 MaxAtomicInlineWidth = 64;
Reid Spencer5f016e22007-07-11 17:01:13 +00002401 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00002402 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002403 return "typedef struct __va_list_tag {"
2404 " unsigned gp_offset;"
2405 " unsigned fp_offset;"
2406 " void* overflow_arg_area;"
2407 " void* reg_save_area;"
John McCall2b7baf02010-05-28 18:25:28 +00002408 "} __va_list_tag;"
Eli Friedmandc043162009-07-03 00:45:06 +00002409 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +00002410 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002411
Chris Lattner21fb98e2009-09-23 06:06:36 +00002412 int getEHDataRegisterNumber(unsigned RegNo) const {
2413 if (RegNo == 0) return 0;
2414 if (RegNo == 1) return 1;
2415 return -1;
2416 }
Eli Friedman618234a2008-08-20 02:34:37 +00002417};
2418} // end anonymous namespace
2419
2420namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002421// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002422class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002423public:
2424 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002425 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002426 TLSSupported = false;
2427 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00002428 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00002429 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00002430 IntMaxType = SignedLongLong;
2431 UIntMaxType = UnsignedLongLong;
2432 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00002433 SizeType = UnsignedLongLong;
2434 PtrDiffType = SignedLongLong;
2435 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00002436 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002437 }
2438 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002439 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002440 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002441 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00002442 }
NAKAMURA Takumi79521992011-01-17 22:56:23 +00002443 virtual const char *getVAListDeclaration() const {
2444 return "typedef char* __builtin_va_list;";
2445 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002446};
2447} // end anonymous namespace
2448
2449namespace {
2450// x86-64 Windows Visual Studio target
2451class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
2452public:
2453 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
2454 : WindowsX86_64TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002455 LongDoubleWidth = LongDoubleAlign = 64;
2456 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00002457 }
2458 virtual void getTargetDefines(const LangOptions &Opts,
2459 MacroBuilder &Builder) const {
2460 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2461 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00002462 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002463 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002464 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002465};
2466} // end anonymous namespace
2467
2468namespace {
2469// x86-64 MinGW target
2470class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
2471public:
2472 MinGWX86_64TargetInfo(const std::string& triple)
2473 : WindowsX86_64TargetInfo(triple) {
2474 }
2475 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002476 MacroBuilder &Builder) const {
2477 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002478 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00002479 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00002480 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00002481 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002482
2483 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2484 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002485 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002486 // Provide "as-is" __declspec.
2487 Builder.defineMacro("__declspec", "__declspec");
2488 else
2489 // Provide alias of __attribute__ like mingw32-gcc.
2490 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002491 }
2492};
2493} // end anonymous namespace
2494
2495namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002496class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
2497public:
Mike Stump1eb44332009-09-09 15:08:12 +00002498 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002499 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
2500 Int64Type = SignedLongLong;
2501 }
2502};
2503} // end anonymous namespace
2504
2505namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00002506class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
2507public:
Mike Stump1eb44332009-09-09 15:08:12 +00002508 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00002509 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
2510 IntMaxType = SignedLongLong;
2511 UIntMaxType = UnsignedLongLong;
2512 Int64Type = SignedLongLong;
2513 }
2514};
2515} // end anonymous namespace
2516
2517namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00002518class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002519 // Possible FPU choices.
2520 enum FPUMode {
2521 NoFPU,
2522 VFP2FPU,
2523 VFP3FPU,
2524 NeonFPU
2525 };
2526
2527 static bool FPUModeIsVFP(FPUMode Mode) {
2528 return Mode >= VFP2FPU && Mode <= NeonFPU;
2529 }
2530
2531 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2532 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002533
Daniel Dunbareac7c532009-12-18 18:42:37 +00002534 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00002535
2536 unsigned FPU : 3;
2537
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002538 unsigned IsThumb : 1;
2539
2540 // Initialized via features.
2541 unsigned SoftFloat : 1;
2542 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002543
Chris Lattner2752c012010-03-03 19:03:45 +00002544 static const Builtin::Info BuiltinInfo[];
2545
Chris Lattner393ff042008-04-21 18:56:49 +00002546public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002547 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbareac7c532009-12-18 18:42:37 +00002548 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002549 {
Eli Friedmane6a24e82011-12-22 03:51:45 +00002550 BigEndian = false;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002551 SizeType = UnsignedInt;
2552 PtrDiffType = SignedInt;
James Molloya6d81f92011-11-23 13:35:08 +00002553 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
2554 WCharType = UnsignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002555
Chris Lattner9bffb072010-04-23 16:29:58 +00002556 // {} in inline assembly are neon specifiers, not assembly variant
2557 // specifiers.
2558 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00002559
Daniel Dunbareac7c532009-12-18 18:42:37 +00002560 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00002561 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002562 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00002563 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2564 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002565 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2566 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002567 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002568 } else {
2569 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2570 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002571 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002572 }
John McCallee79a4c2010-08-21 22:46:04 +00002573
2574 // ARM targets default to using the ARM C++ ABI.
2575 CXXABI = CXXABI_ARM;
Eli Friedman2be46072011-10-14 20:59:01 +00002576
2577 // ARM has atomics up to 8 bytes
2578 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
2579 MaxAtomicPromoteWidth = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00002580 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002581 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00002582 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002583 ABI = Name;
2584
Daniel Dunbara2a41612009-09-14 00:02:24 +00002585 // The defaults (above) are for AAPCS, check if we need to change them.
2586 //
2587 // FIXME: We need support for -meabi... we could just mangle it into the
2588 // name.
2589 if (Name == "apcs-gnu") {
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002590 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002591 SizeType = UnsignedLong;
2592
James Molloya6d81f92011-11-23 13:35:08 +00002593 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
2594 WCharType = SignedInt;
2595
Daniel Dunbar684de632010-04-22 16:14:54 +00002596 // Do not respect the alignment of bit-field types when laying out
2597 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
2598 UseBitFieldTypeAlignment = false;
2599
Chad Rosier61a62212011-08-04 01:21:14 +00002600 /// Do force alignment of members that follow zero length bitfields. If
2601 /// the alignment of the zero-length bitfield is greater than the member
2602 /// that follows it, `bar', `bar' will be aligned as the type of the
2603 /// zero length bitfield.
2604 UseZeroLengthBitfieldAlignment = true;
2605
2606 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosier6e43f3f2011-08-04 17:52:43 +00002607 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
2608 /// gcc.
Chad Rosier61a62212011-08-04 01:21:14 +00002609 ZeroLengthBitfieldBoundary = 32;
2610
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002611 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00002612 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2613 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002614 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 +00002615 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002616 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002617 } else {
2618 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 +00002619 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002620 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002621 }
2622
Chad Rosier9f1210c2011-07-26 07:03:04 +00002623 // FIXME: Override "preferred align" for double and long long.
Daniel Dunbara2a41612009-09-14 00:02:24 +00002624 } else if (Name == "aapcs") {
2625 // FIXME: Enumerated types are variable width in straight AAPCS.
2626 } else if (Name == "aapcs-linux") {
Chad Rosier9f1210c2011-07-26 07:03:04 +00002627 ;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002628 } else
2629 return false;
2630
2631 return true;
2632 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002633
Chandler Carruthc3a2e652011-09-28 05:56:05 +00002634 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002635 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
2636 Features["vfp2"] = true;
2637 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
2638 Features["neon"] = true;
2639 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002640
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002641 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2642 const std::string &Name,
2643 bool Enabled) const {
Evan Chengf972b262011-07-08 06:40:11 +00002644 if (Name == "soft-float" || Name == "soft-float-abi" ||
2645 Name == "vfp2" || Name == "vfp3" || Name == "neon") {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002646 Features[Name] = Enabled;
2647 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002648 return false;
2649
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002650 return true;
2651 }
2652
2653 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002654 FPU = NoFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002655 SoftFloat = SoftFloatABI = false;
2656 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2657 if (Features[i] == "+soft-float")
2658 SoftFloat = true;
2659 else if (Features[i] == "+soft-float-abi")
2660 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00002661 else if (Features[i] == "+vfp2")
2662 FPU = VFP2FPU;
2663 else if (Features[i] == "+vfp3")
2664 FPU = VFP3FPU;
2665 else if (Features[i] == "+neon")
2666 FPU = NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002667 }
2668
2669 // Remove front-end specific options which the backend handles differently.
2670 std::vector<std::string>::iterator it;
2671 it = std::find(Features.begin(), Features.end(), "+soft-float");
2672 if (it != Features.end())
2673 Features.erase(it);
2674 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2675 if (it != Features.end())
2676 Features.erase(it);
2677 }
2678
Chris Lattner5f9e2722011-07-23 10:55:15 +00002679 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbareac7c532009-12-18 18:42:37 +00002680 return llvm::StringSwitch<const char*>(Name)
2681 .Cases("arm8", "arm810", "4")
2682 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2683 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2684 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2685 .Case("ep9312", "4T")
2686 .Cases("arm10tdmi", "arm1020t", "5T")
2687 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2688 .Case("arm926ej-s", "5TEJ")
2689 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2690 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002691 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002692 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002693 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002694 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2695 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson06f45632011-01-06 16:57:20 +00002696 .Case("cortex-m3", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00002697 .Case("cortex-m0", "6M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002698 .Default(0);
2699 }
2700 virtual bool setCPU(const std::string &Name) {
2701 if (!getCPUDefineSuffix(Name))
2702 return false;
2703
2704 CPU = Name;
2705 return true;
2706 }
Chris Lattner33328642009-03-20 15:52:06 +00002707 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002708 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00002709 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00002710 Builder.defineMacro("__arm");
2711 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002712
Chris Lattnerc0f59212009-03-02 22:27:17 +00002713 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00002714 Builder.defineMacro("__ARMEL__");
2715 Builder.defineMacro("__LITTLE_ENDIAN__");
2716 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002717
Chris Lattner5f9e2722011-07-23 10:55:15 +00002718 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00002719 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002720
Mike Stump437bb4b2009-04-08 02:07:04 +00002721 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002722
Daniel Dunbareac7c532009-12-18 18:42:37 +00002723 // FIXME: It's more complicated than this and we don't really support
2724 // interworking.
2725 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00002726 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002727
Daniel Dunbareac7c532009-12-18 18:42:37 +00002728 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramera9992772010-01-09 17:55:51 +00002729 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002730
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002731 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00002732 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002733
2734 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00002735 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002736
Bob Wilson84f95cf2011-05-13 18:56:03 +00002737 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002738 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00002739 Builder.defineMacro("__THUMBEL__");
2740 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00002741 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002742 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002743 }
2744
2745 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00002746 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002747
2748 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramera9992772010-01-09 17:55:51 +00002749 Builder.defineMacro("__VFP_FP__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002750
2751 // This only gets set when Neon instructions are actually available, unlike
2752 // the VFP define, hence the soft float and arch check. This is subtly
2753 // different from gcc, we follow the intent which was that it should be set
2754 // when Neon instructions are actually available.
Bob Wilson84f95cf2011-05-13 18:56:03 +00002755 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002756 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00002757 }
2758 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2759 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00002760 Records = BuiltinInfo;
2761 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00002762 }
2763 virtual const char *getVAListDeclaration() const {
John McCall0e9972c2011-05-09 02:19:37 +00002764 return "typedef void* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +00002765 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002766 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002767 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002768 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002769 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002770 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002771 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002772 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002773 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00002774 default:
Nate Begemanad487f42008-04-22 05:03:19 +00002775 case 'l': // r0-r7
2776 case 'h': // r8-r15
2777 case 'w': // VFP Floating point register single precision
2778 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00002779 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00002780 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00002781 case 'Q': // A memory address that is a single base register.
2782 Info.setAllowsMemory();
2783 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00002784 case 'U': // a memory reference...
2785 switch (Name[1]) {
2786 case 'q': // ...ARMV4 ldrsb
2787 case 'v': // ...VFP load/store (reg+constant offset)
2788 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00002789 case 't': // address valid for load/store opaque types wider
2790 // than 128-bits
2791 case 'n': // valid address for Neon doubleword vector load/store
2792 case 'm': // valid address for Neon element and structure load/store
2793 case 's': // valid address for non-offset loads/stores of quad-word
2794 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00002795 Info.setAllowsMemory();
2796 Name++;
2797 return true;
2798 }
Nate Begemanad487f42008-04-22 05:03:19 +00002799 }
Chris Lattner393ff042008-04-21 18:56:49 +00002800 return false;
2801 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00002802 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00002803 std::string R;
2804 switch (*Constraint) {
2805 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00002806 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00002807 Constraint++;
2808 break;
Eric Christopher283f4472011-06-17 00:40:18 +00002809 case 'p': // 'p' should be translated to 'r' by default.
2810 R = std::string("r");
2811 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00002812 default:
2813 return std::string(1, *Constraint);
2814 }
2815 return R;
2816 }
Chris Lattner393ff042008-04-21 18:56:49 +00002817 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002818 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00002819 return "";
2820 }
2821};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002822
2823const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002824 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002825 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002826 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2827
2828 // Float registers
2829 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2830 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2831 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002832 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002833
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002834 // Double registers
2835 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2836 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00002837 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2838 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002839
2840 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00002841 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2842 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002843};
2844
2845void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002846 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002847 Names = GCCRegNames;
2848 NumNames = llvm::array_lengthof(GCCRegNames);
2849}
2850
2851const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002852 { { "a1" }, "r0" },
2853 { { "a2" }, "r1" },
2854 { { "a3" }, "r2" },
2855 { { "a4" }, "r3" },
2856 { { "v1" }, "r4" },
2857 { { "v2" }, "r5" },
2858 { { "v3" }, "r6" },
2859 { { "v4" }, "r7" },
2860 { { "v5" }, "r8" },
2861 { { "v6", "rfp" }, "r9" },
2862 { { "sl" }, "r10" },
2863 { { "fp" }, "r11" },
2864 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002865 { { "r13" }, "sp" },
2866 { { "r14" }, "lr" },
2867 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002868 // The S, D and Q registers overlap, but aren't really aliases; we
2869 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002870};
2871
2872void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2873 unsigned &NumAliases) const {
2874 Aliases = GCCRegAliases;
2875 NumAliases = llvm::array_lengthof(GCCRegAliases);
2876}
Chris Lattner2752c012010-03-03 19:03:45 +00002877
2878const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00002879#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00002880#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00002881 ALL_LANGUAGES },
Chris Lattner2752c012010-03-03 19:03:45 +00002882#include "clang/Basic/BuiltinsARM.def"
2883};
Chris Lattner393ff042008-04-21 18:56:49 +00002884} // end anonymous namespace.
2885
Eli Friedmana9f54962008-08-20 07:44:10 +00002886namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00002887class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002888 public DarwinTargetInfo<ARMTargetInfo> {
2889protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00002890 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00002891 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00002892 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00002893 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002894
Torok Edwin5f6c1942009-06-30 17:10:35 +00002895public:
Mike Stump1eb44332009-09-09 15:08:12 +00002896 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002897 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2898 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00002899 // iOS always has 64-bit atomic instructions.
2900 // FIXME: This should be based off of the target features in ARMTargetInfo.
2901 MaxAtomicInlineWidth = 64;
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002902 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002903};
2904} // end anonymous namespace.
2905
Tony Linthicum96319392011-12-12 21:14:55 +00002906
2907namespace {
2908// Hexagon abstract base class
2909class HexagonTargetInfo : public TargetInfo {
2910 static const Builtin::Info BuiltinInfo[];
2911 static const char * const GCCRegNames[];
2912 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2913 std::string CPU;
2914public:
2915 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00002916 BigEndian = false;
Tony Linthicum96319392011-12-12 21:14:55 +00002917 DescriptionString = ("e-p:32:32:32-"
2918 "i64:64:64-i32:32:32-"
2919 "i16:16:16-i1:32:32-a:0:0");
2920
2921 // {} in inline assembly are packet specifiers, not assembly variant
2922 // specifiers.
2923 NoAsmVariants = true;
2924 }
2925
2926 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2927 unsigned &NumRecords) const {
2928 Records = BuiltinInfo;
2929 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
2930 }
2931
2932 virtual bool validateAsmConstraint(const char *&Name,
2933 TargetInfo::ConstraintInfo &Info) const {
2934 return true;
2935 }
2936
2937 virtual void getTargetDefines(const LangOptions &Opts,
2938 MacroBuilder &Builder) const;
2939
2940 virtual const char *getVAListDeclaration() const {
2941 return "typedef char* __builtin_va_list;";
2942 }
2943 virtual void getGCCRegNames(const char * const *&Names,
2944 unsigned &NumNames) const;
2945 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2946 unsigned &NumAliases) const;
2947 virtual const char *getClobbers() const {
2948 return "";
2949 }
2950 virtual bool setCPU(const std::string &Name) {
2951 CPU = Name;
2952 return true;
2953 }
2954};
2955
2956void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
2957 MacroBuilder &Builder) const {
2958 Builder.defineMacro("qdsp6");
2959 Builder.defineMacro("__qdsp6", "1");
2960 Builder.defineMacro("__qdsp6__", "1");
2961
2962 Builder.defineMacro("hexagon");
2963 Builder.defineMacro("__hexagon", "1");
2964 Builder.defineMacro("__hexagon__", "1");
2965
2966 if(CPU == "hexagonv1") {
2967 Builder.defineMacro("__HEXAGON_V1__");
2968 Builder.defineMacro("__HEXAGON_ARCH__", "1");
2969 if(Opts.HexagonQdsp6Compat) {
2970 Builder.defineMacro("__QDSP6_V1__");
2971 Builder.defineMacro("__QDSP6_ARCH__", "1");
2972 }
2973 }
2974 else if(CPU == "hexagonv2") {
2975 Builder.defineMacro("__HEXAGON_V2__");
2976 Builder.defineMacro("__HEXAGON_ARCH__", "2");
2977 if(Opts.HexagonQdsp6Compat) {
2978 Builder.defineMacro("__QDSP6_V2__");
2979 Builder.defineMacro("__QDSP6_ARCH__", "2");
2980 }
2981 }
2982 else if(CPU == "hexagonv3") {
2983 Builder.defineMacro("__HEXAGON_V3__");
2984 Builder.defineMacro("__HEXAGON_ARCH__", "3");
2985 if(Opts.HexagonQdsp6Compat) {
2986 Builder.defineMacro("__QDSP6_V3__");
2987 Builder.defineMacro("__QDSP6_ARCH__", "3");
2988 }
2989 }
2990 else if(CPU == "hexagonv4") {
2991 Builder.defineMacro("__HEXAGON_V4__");
2992 Builder.defineMacro("__HEXAGON_ARCH__", "4");
2993 if(Opts.HexagonQdsp6Compat) {
2994 Builder.defineMacro("__QDSP6_V4__");
2995 Builder.defineMacro("__QDSP6_ARCH__", "4");
2996 }
2997 }
2998}
2999
3000const char * const HexagonTargetInfo::GCCRegNames[] = {
3001 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3002 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3003 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3004 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3005 "p0", "p1", "p2", "p3",
3006 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
3007};
3008
3009void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
3010 unsigned &NumNames) const {
3011 Names = GCCRegNames;
3012 NumNames = llvm::array_lengthof(GCCRegNames);
3013}
3014
3015
3016const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
3017 { { "sp" }, "r29" },
3018 { { "fp" }, "r30" },
3019 { { "lr" }, "r31" },
3020 };
3021
3022void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3023 unsigned &NumAliases) const {
3024 Aliases = GCCRegAliases;
3025 NumAliases = llvm::array_lengthof(GCCRegAliases);
3026}
3027
3028
3029const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
3030#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3031#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3032 ALL_LANGUAGES },
3033#include "clang/Basic/BuiltinsHexagon.def"
3034};
3035}
3036
3037
Reid Spencer5f016e22007-07-11 17:01:13 +00003038namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00003039class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00003040 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3041 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003042 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00003043public:
Eli Friedman01b86682008-08-20 07:28:14 +00003044 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
3045 // FIXME: Support Sparc quad-precision long double?
Eli Friedmane6a24e82011-12-22 03:51:45 +00003046 BigEndian = false;
Eli Friedmaned855cb2008-08-21 00:13:15 +00003047 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 +00003048 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00003049 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003050 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3051 const std::string &Name,
3052 bool Enabled) const {
3053 if (Name == "soft-float")
3054 Features[Name] = Enabled;
3055 else
3056 return false;
3057
3058 return true;
3059 }
3060 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3061 SoftFloat = false;
3062 for (unsigned i = 0, e = Features.size(); i != e; ++i)
3063 if (Features[i] == "+soft-float")
3064 SoftFloat = true;
3065 }
Chris Lattner33328642009-03-20 15:52:06 +00003066 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003067 MacroBuilder &Builder) const {
3068 DefineStd(Builder, "sparc", Opts);
3069 Builder.defineMacro("__sparcv8");
3070 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003071
3072 if (SoftFloat)
3073 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00003074 }
3075 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3076 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00003077 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00003078 }
3079 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00003080 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00003081 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003082 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00003083 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003084 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00003085 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003086 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00003087 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00003088 // FIXME: Implement!
3089 return false;
Gabor Greif26658672008-02-21 16:29:08 +00003090 }
3091 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00003092 // FIXME: Implement!
3093 return "";
Gabor Greif26658672008-02-21 16:29:08 +00003094 }
3095};
3096
Chris Lattnere957f532009-01-27 01:58:38 +00003097const char * const SparcV8TargetInfo::GCCRegNames[] = {
3098 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3099 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3100 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3101 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
3102};
3103
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003104void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00003105 unsigned &NumNames) const {
3106 Names = GCCRegNames;
3107 NumNames = llvm::array_lengthof(GCCRegNames);
3108}
3109
3110const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003111 { { "g0" }, "r0" },
3112 { { "g1" }, "r1" },
3113 { { "g2" }, "r2" },
3114 { { "g3" }, "r3" },
3115 { { "g4" }, "r4" },
3116 { { "g5" }, "r5" },
3117 { { "g6" }, "r6" },
3118 { { "g7" }, "r7" },
3119 { { "o0" }, "r8" },
3120 { { "o1" }, "r9" },
3121 { { "o2" }, "r10" },
3122 { { "o3" }, "r11" },
3123 { { "o4" }, "r12" },
3124 { { "o5" }, "r13" },
3125 { { "o6", "sp" }, "r14" },
3126 { { "o7" }, "r15" },
3127 { { "l0" }, "r16" },
3128 { { "l1" }, "r17" },
3129 { { "l2" }, "r18" },
3130 { { "l3" }, "r19" },
3131 { { "l4" }, "r20" },
3132 { { "l5" }, "r21" },
3133 { { "l6" }, "r22" },
3134 { { "l7" }, "r23" },
3135 { { "i0" }, "r24" },
3136 { { "i1" }, "r25" },
3137 { { "i2" }, "r26" },
3138 { { "i3" }, "r27" },
3139 { { "i4" }, "r28" },
3140 { { "i5" }, "r29" },
3141 { { "i6", "fp" }, "r30" },
3142 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00003143};
3144
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003145void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00003146 unsigned &NumAliases) const {
3147 Aliases = GCCRegAliases;
3148 NumAliases = llvm::array_lengthof(GCCRegAliases);
3149}
Gabor Greif26658672008-02-21 16:29:08 +00003150} // end anonymous namespace.
3151
Eli Friedman01b86682008-08-20 07:28:14 +00003152namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003153class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
3154public:
3155 AuroraUXSparcV8TargetInfo(const std::string& triple) :
3156 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
3157 SizeType = UnsignedInt;
3158 PtrDiffType = SignedInt;
3159 }
3160};
Torok Edwin5f6c1942009-06-30 17:10:35 +00003161class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00003162public:
3163 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00003164 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00003165 SizeType = UnsignedInt;
3166 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00003167 }
3168};
3169} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00003170
Chris Lattner2621fd12008-05-08 05:58:21 +00003171namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003172 class MSP430TargetInfo : public TargetInfo {
3173 static const char * const GCCRegNames[];
3174 public:
3175 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003176 BigEndian = false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003177 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00003178 IntWidth = 16; IntAlign = 16;
3179 LongWidth = 32; LongLongWidth = 64;
3180 LongAlign = LongLongAlign = 16;
3181 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003182 SuitableAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003183 SizeType = UnsignedInt;
3184 IntMaxType = SignedLong;
3185 UIntMaxType = UnsignedLong;
3186 IntPtrType = SignedShort;
3187 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00003188 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00003189 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003190 }
3191 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003192 MacroBuilder &Builder) const {
3193 Builder.defineMacro("MSP430");
3194 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003195 // FIXME: defines for different 'flavours' of MCU
3196 }
3197 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3198 unsigned &NumRecords) const {
3199 // FIXME: Implement.
3200 Records = 0;
3201 NumRecords = 0;
3202 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003203 virtual void getGCCRegNames(const char * const *&Names,
3204 unsigned &NumNames) const;
3205 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3206 unsigned &NumAliases) const {
3207 // No aliases.
3208 Aliases = 0;
3209 NumAliases = 0;
3210 }
3211 virtual bool validateAsmConstraint(const char *&Name,
3212 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00003213 // No target constraints for now.
3214 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003215 }
3216 virtual const char *getClobbers() const {
3217 // FIXME: Is this really right?
3218 return "";
3219 }
3220 virtual const char *getVAListDeclaration() const {
3221 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00003222 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003223 }
3224 };
3225
3226 const char * const MSP430TargetInfo::GCCRegNames[] = {
3227 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3228 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3229 };
3230
3231 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
3232 unsigned &NumNames) const {
3233 Names = GCCRegNames;
3234 NumNames = llvm::array_lengthof(GCCRegNames);
3235 }
3236}
3237
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00003238namespace {
Eli Friedmanb63decf2009-08-19 20:47:07 +00003239
Mike Stump1eb44332009-09-09 15:08:12 +00003240 // LLVM and Clang cannot be used directly to output native binaries for
3241 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00003242 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00003243 //
3244 // TCE uses the llvm bitcode as input and uses it for generating customized
3245 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00003246 // publicly available in http://tce.cs.tut.fi
3247
Eli Friedman209f5bb2011-10-07 19:51:42 +00003248 static const unsigned TCEOpenCLAddrSpaceMap[] = {
3249 3, // opencl_global
3250 4, // opencl_local
3251 5 // opencl_constant
3252 };
3253
Eli Friedmanb63decf2009-08-19 20:47:07 +00003254 class TCETargetInfo : public TargetInfo{
3255 public:
3256 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
3257 TLSSupported = false;
3258 IntWidth = 32;
3259 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003260 PointerWidth = 32;
3261 IntAlign = 32;
3262 LongAlign = LongLongAlign = 32;
3263 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003264 SuitableAlign = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003265 SizeType = UnsignedInt;
3266 IntMaxType = SignedLong;
3267 UIntMaxType = UnsignedLong;
3268 IntPtrType = SignedInt;
3269 PtrDiffType = SignedInt;
3270 FloatWidth = 32;
3271 FloatAlign = 32;
3272 DoubleWidth = 32;
3273 DoubleAlign = 32;
3274 LongDoubleWidth = 32;
3275 LongDoubleAlign = 32;
3276 FloatFormat = &llvm::APFloat::IEEEsingle;
3277 DoubleFormat = &llvm::APFloat::IEEEsingle;
3278 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00003279 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
3280 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00003281 "f32:32:32-f64:32:32-v64:32:32-"
3282 "v128:32:32-a0:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00003283 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003284 }
3285
3286 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003287 MacroBuilder &Builder) const {
3288 DefineStd(Builder, "tce", Opts);
3289 Builder.defineMacro("__TCE__");
3290 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00003291 }
3292 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3293 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00003294 virtual const char *getClobbers() const {
3295 return "";
3296 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00003297 virtual const char *getVAListDeclaration() const {
3298 return "typedef void* __builtin_va_list;";
3299 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00003300 virtual void getGCCRegNames(const char * const *&Names,
3301 unsigned &NumNames) const {}
3302 virtual bool validateAsmConstraint(const char *&Name,
3303 TargetInfo::ConstraintInfo &info) const {
3304 return true;
3305 }
3306 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3307 unsigned &NumAliases) const {}
3308 };
3309}
3310
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003311namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003312class MipsTargetInfoBase : public TargetInfo {
3313 std::string CPU;
3314protected:
3315 std::string ABI;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003316public:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003317 MipsTargetInfoBase(const std::string& triple, const std::string& ABIStr)
Akira Hatanaka148735e2011-11-05 01:48:34 +00003318 : TargetInfo(triple), ABI(ABIStr) {}
Eric Christophered734732010-03-02 02:41:08 +00003319 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003320 virtual bool setABI(const std::string &Name) = 0;
Eric Christophered734732010-03-02 02:41:08 +00003321 virtual bool setCPU(const std::string &Name) {
3322 CPU = Name;
3323 return true;
3324 }
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003325 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christophered734732010-03-02 02:41:08 +00003326 Features[ABI] = true;
3327 Features[CPU] = true;
3328 }
3329 virtual void getArchDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003330 MacroBuilder &Builder) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003331 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003332 MacroBuilder &Builder) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003333 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3334 unsigned &NumRecords) const {
3335 // FIXME: Implement!
3336 }
3337 virtual const char *getVAListDeclaration() const {
3338 return "typedef void* __builtin_va_list;";
3339 }
3340 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003341 unsigned &NumNames) const {
3342 static const char * const GCCRegNames[] = {
3343 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
3344 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
3345 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
3346 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
3347 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
3348 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
3349 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
3350 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
3351 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
3352 "$fcc5","$fcc6","$fcc7"
3353 };
3354 Names = GCCRegNames;
3355 NumNames = llvm::array_lengthof(GCCRegNames);
3356 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003357 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003358 unsigned &NumAliases) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003359 virtual bool validateAsmConstraint(const char *&Name,
3360 TargetInfo::ConstraintInfo &Info) const {
3361 switch (*Name) {
3362 default:
Douglas Gregor21a25162011-11-02 20:52:01 +00003363 return false;
3364
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003365 case 'r': // CPU registers.
3366 case 'd': // Equivalent to "r" unless generating MIPS16 code.
3367 case 'y': // Equivalent to "r", backwards compatibility only.
3368 case 'f': // floating-point registers.
3369 Info.setAllowsRegister();
3370 return true;
3371 }
3372 return false;
3373 }
3374
3375 virtual const char *getClobbers() const {
3376 // FIXME: Implement!
3377 return "";
3378 }
3379};
3380
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003381class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003382public:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003383 Mips32TargetInfoBase(const std::string& triple) :
Akira Hatanaka148735e2011-11-05 01:48:34 +00003384 MipsTargetInfoBase(triple, "o32") {
3385 SizeType = UnsignedInt;
3386 PtrDiffType = SignedInt;
3387 }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003388 virtual bool setABI(const std::string &Name) {
3389 if ((Name == "o32") || (Name == "eabi")) {
3390 ABI = Name;
3391 return true;
3392 } else
3393 return false;
3394 }
3395 virtual void getArchDefines(const LangOptions &Opts,
3396 MacroBuilder &Builder) const {
Douglas Gregorc9a23712011-11-09 15:17:16 +00003397 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
3398 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
3399 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
3400
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003401 if (ABI == "o32") {
3402 Builder.defineMacro("__mips_o32");
3403 Builder.defineMacro("_ABIO32", "1");
3404 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
3405 }
3406 else if (ABI == "eabi")
3407 Builder.defineMacro("__mips_eabi");
3408 else
David Blaikieb219cfc2011-09-23 05:06:16 +00003409 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003410 }
3411 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3412 unsigned &NumAliases) const {
3413 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3414 { { "at" }, "$1" },
3415 { { "v0" }, "$2" },
3416 { { "v1" }, "$3" },
3417 { { "a0" }, "$4" },
3418 { { "a1" }, "$5" },
3419 { { "a2" }, "$6" },
3420 { { "a3" }, "$7" },
3421 { { "t0" }, "$8" },
3422 { { "t1" }, "$9" },
3423 { { "t2" }, "$10" },
3424 { { "t3" }, "$11" },
3425 { { "t4" }, "$12" },
3426 { { "t5" }, "$13" },
3427 { { "t6" }, "$14" },
3428 { { "t7" }, "$15" },
3429 { { "s0" }, "$16" },
3430 { { "s1" }, "$17" },
3431 { { "s2" }, "$18" },
3432 { { "s3" }, "$19" },
3433 { { "s4" }, "$20" },
3434 { { "s5" }, "$21" },
3435 { { "s6" }, "$22" },
3436 { { "s7" }, "$23" },
3437 { { "t8" }, "$24" },
3438 { { "t9" }, "$25" },
3439 { { "k0" }, "$26" },
3440 { { "k1" }, "$27" },
3441 { { "gp" }, "$28" },
3442 { { "sp" }, "$29" },
3443 { { "fp" }, "$30" },
3444 { { "ra" }, "$31" }
3445 };
3446 Aliases = GCCRegAliases;
3447 NumAliases = llvm::array_lengthof(GCCRegAliases);
3448 }
3449};
3450
3451class Mips32EBTargetInfo : public Mips32TargetInfoBase {
3452public:
3453 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3454 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3455 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3456 }
3457 virtual void getTargetDefines(const LangOptions &Opts,
3458 MacroBuilder &Builder) const {
3459 DefineStd(Builder, "mips", Opts);
3460 Builder.defineMacro("_mips");
3461 DefineStd(Builder, "MIPSEB", Opts);
3462 Builder.defineMacro("_MIPSEB");
3463 Builder.defineMacro("__REGISTER_PREFIX__", "");
3464 getArchDefines(Opts, Builder);
3465 }
3466};
3467
3468class Mips32ELTargetInfo : public Mips32TargetInfoBase {
3469public:
3470 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003471 BigEndian = false;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003472 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 +00003473 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003474 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003475 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003476 MacroBuilder &Builder) const {
3477 DefineStd(Builder, "mips", Opts);
3478 Builder.defineMacro("_mips");
3479 DefineStd(Builder, "MIPSEL", Opts);
3480 Builder.defineMacro("_MIPSEL");
3481 Builder.defineMacro("__REGISTER_PREFIX__", "");
3482 getArchDefines(Opts, Builder);
3483 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003484};
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003485
3486class Mips64TargetInfoBase : public MipsTargetInfoBase {
3487 virtual void SetDescriptionString(const std::string &Name) = 0;
3488public:
3489 Mips64TargetInfoBase(const std::string& triple) :
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003490 MipsTargetInfoBase(triple, "n64") {
3491 LongWidth = LongAlign = 64;
3492 PointerWidth = PointerAlign = 64;
3493 LongDoubleWidth = LongDoubleAlign = 128;
3494 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003495 SuitableAlign = 128;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003496 }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003497 virtual bool setABI(const std::string &Name) {
3498 SetDescriptionString(Name);
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003499
3500 if (Name != "n32" && Name != "n64")
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003501 return false;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003502
3503 ABI = Name;
3504
3505 if (Name == "n32") {
3506 LongWidth = LongAlign = 32;
3507 PointerWidth = PointerAlign = 32;
3508 }
3509
3510 return true;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003511 }
3512 virtual void getArchDefines(const LangOptions &Opts,
3513 MacroBuilder &Builder) const {
3514 if (ABI == "n32") {
3515 Builder.defineMacro("__mips_n32");
3516 Builder.defineMacro("_ABIN32", "2");
3517 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
3518 }
3519 else if (ABI == "n64") {
3520 Builder.defineMacro("__mips_n64");
3521 Builder.defineMacro("_ABI64", "3");
3522 Builder.defineMacro("_MIPS_SIM", "_ABI64");
3523 }
3524 else
David Blaikieb219cfc2011-09-23 05:06:16 +00003525 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003526 }
3527 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3528 unsigned &NumAliases) const {
3529 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3530 { { "at" }, "$1" },
3531 { { "v0" }, "$2" },
3532 { { "v1" }, "$3" },
3533 { { "a0" }, "$4" },
3534 { { "a1" }, "$5" },
3535 { { "a2" }, "$6" },
3536 { { "a3" }, "$7" },
3537 { { "a4" }, "$8" },
3538 { { "a5" }, "$9" },
3539 { { "a6" }, "$10" },
3540 { { "a7" }, "$11" },
3541 { { "t0" }, "$12" },
3542 { { "t1" }, "$13" },
3543 { { "t2" }, "$14" },
3544 { { "t3" }, "$15" },
3545 { { "s0" }, "$16" },
3546 { { "s1" }, "$17" },
3547 { { "s2" }, "$18" },
3548 { { "s3" }, "$19" },
3549 { { "s4" }, "$20" },
3550 { { "s5" }, "$21" },
3551 { { "s6" }, "$22" },
3552 { { "s7" }, "$23" },
3553 { { "t8" }, "$24" },
3554 { { "t9" }, "$25" },
3555 { { "k0" }, "$26" },
3556 { { "k1" }, "$27" },
3557 { { "gp" }, "$28" },
3558 { { "sp" }, "$29" },
3559 { { "fp" }, "$30" },
3560 { { "ra" }, "$31" }
3561 };
3562 Aliases = GCCRegAliases;
3563 NumAliases = llvm::array_lengthof(GCCRegAliases);
3564 }
3565};
3566
3567class Mips64EBTargetInfo : public Mips64TargetInfoBase {
3568 virtual void SetDescriptionString(const std::string &Name) {
3569 // Change DescriptionString only if ABI is n32.
3570 if (Name == "n32")
3571 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 +00003572 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3573 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003574 }
3575public:
3576 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
3577 // Default ABI is n64.
3578 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 +00003579 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3580 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003581 }
3582 virtual void getTargetDefines(const LangOptions &Opts,
3583 MacroBuilder &Builder) const {
3584 DefineStd(Builder, "mips", Opts);
3585 Builder.defineMacro("_mips");
3586 DefineStd(Builder, "MIPSEB", Opts);
3587 Builder.defineMacro("_MIPSEB");
3588 Builder.defineMacro("__REGISTER_PREFIX__", "");
3589 getArchDefines(Opts, Builder);
3590 }
3591};
3592
3593class Mips64ELTargetInfo : public Mips64TargetInfoBase {
3594 virtual void SetDescriptionString(const std::string &Name) {
3595 // Change DescriptionString only if ABI is n32.
3596 if (Name == "n32")
3597 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 +00003598 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
3599 "-v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003600 }
3601public:
3602 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003603 // Default ABI is n64.
3604 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003605 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 +00003606 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3607 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003608 }
3609 virtual void getTargetDefines(const LangOptions &Opts,
3610 MacroBuilder &Builder) const {
3611 DefineStd(Builder, "mips", Opts);
3612 Builder.defineMacro("_mips");
3613 DefineStd(Builder, "MIPSEL", Opts);
3614 Builder.defineMacro("_MIPSEL");
3615 Builder.defineMacro("__REGISTER_PREFIX__", "");
3616 getArchDefines(Opts, Builder);
3617 }
3618};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003619} // end anonymous namespace.
3620
Ivan Krasinef05abd2011-08-24 20:22:22 +00003621namespace {
3622class PNaClTargetInfo : public TargetInfo {
3623public:
3624 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003625 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00003626 this->UserLabelPrefix = "";
3627 this->LongAlign = 32;
3628 this->LongWidth = 32;
3629 this->PointerAlign = 32;
3630 this->PointerWidth = 32;
3631 this->IntMaxType = TargetInfo::SignedLongLong;
3632 this->UIntMaxType = TargetInfo::UnsignedLongLong;
3633 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00003634 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00003635 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00003636 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00003637 this->SizeType = TargetInfo::UnsignedInt;
3638 this->PtrDiffType = TargetInfo::SignedInt;
3639 this->IntPtrType = TargetInfo::SignedInt;
David Meyerdd4a8892011-10-11 03:12:01 +00003640 this->RegParmMax = 2;
Ivan Krasinef05abd2011-08-24 20:22:22 +00003641 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
3642 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
3643 }
3644
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003645 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00003646 }
3647 virtual void getArchDefines(const LangOptions &Opts,
3648 MacroBuilder &Builder) const {
3649 Builder.defineMacro("__le32__");
3650 Builder.defineMacro("__pnacl__");
3651 }
3652 virtual void getTargetDefines(const LangOptions &Opts,
3653 MacroBuilder &Builder) const {
Ivan Krasin089ee112011-08-25 23:49:20 +00003654 DefineStd(Builder, "unix", Opts);
3655 Builder.defineMacro("__ELF__");
3656 if (Opts.POSIXThreads)
3657 Builder.defineMacro("_REENTRANT");
3658 if (Opts.CPlusPlus)
3659 Builder.defineMacro("_GNU_SOURCE");
3660
Ivan Krasinef05abd2011-08-24 20:22:22 +00003661 Builder.defineMacro("__native_client__");
3662 getArchDefines(Opts, Builder);
3663 }
3664 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3665 unsigned &NumRecords) const {
3666 }
3667 virtual const char *getVAListDeclaration() const {
Ivan Krasin68018db2011-09-20 14:56:54 +00003668 return "typedef int __builtin_va_list[4];";
Ivan Krasinef05abd2011-08-24 20:22:22 +00003669 }
3670 virtual void getGCCRegNames(const char * const *&Names,
3671 unsigned &NumNames) const;
3672 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3673 unsigned &NumAliases) const;
3674 virtual bool validateAsmConstraint(const char *&Name,
3675 TargetInfo::ConstraintInfo &Info) const {
3676 return false;
3677 }
3678
3679 virtual const char *getClobbers() const {
3680 return "";
3681 }
3682};
3683
3684void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
3685 unsigned &NumNames) const {
3686 Names = NULL;
3687 NumNames = 0;
3688}
3689
3690void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3691 unsigned &NumAliases) const {
3692 Aliases = NULL;
3693 NumAliases = 0;
3694}
3695} // end anonymous namespace.
3696
3697
Reid Spencer5f016e22007-07-11 17:01:13 +00003698//===----------------------------------------------------------------------===//
3699// Driver code
3700//===----------------------------------------------------------------------===//
3701
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003702static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003703 llvm::Triple Triple(T);
3704 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00003705
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003706 switch (Triple.getArch()) {
3707 default:
3708 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00003709
Tony Linthicum96319392011-12-12 21:14:55 +00003710 case llvm::Triple::hexagon:
3711 return new HexagonTargetInfo(T);
3712
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003713 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00003714 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003715 if (Triple.isOSDarwin())
3716 return new DarwinARMTargetInfo(T);
3717
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003718 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00003719 case llvm::Triple::Linux:
3720 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003721 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00003722 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003723 case llvm::Triple::NetBSD:
3724 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Douglas Gregordca52262011-07-01 22:41:14 +00003725 case llvm::Triple::RTEMS:
3726 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003727 default:
3728 return new ARMTargetInfo(T);
3729 }
Eli Friedman61538a72008-05-20 14:21:01 +00003730
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003731 case llvm::Triple::msp430:
3732 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00003733
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003734 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003735 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003736 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003737 return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003738 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003739 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003740 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003741 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003742 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003743 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003744 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003745 return new Mips32EBTargetInfo(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003746 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003747
3748 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003749 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003750 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003751 return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003752 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003753 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003754 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003755 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003756 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003757 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003758 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003759 return new Mips32ELTargetInfo(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003760 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003761
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003762 case llvm::Triple::mips64:
3763 switch (os) {
3764 case llvm::Triple::Linux:
3765 return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
3766 case llvm::Triple::RTEMS:
3767 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
3768 case llvm::Triple::FreeBSD:
3769 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
3770 case llvm::Triple::NetBSD:
3771 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
3772 default:
3773 return new Mips64EBTargetInfo(T);
3774 }
3775
3776 case llvm::Triple::mips64el:
3777 switch (os) {
3778 case llvm::Triple::Linux:
3779 return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
3780 case llvm::Triple::RTEMS:
3781 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
3782 case llvm::Triple::FreeBSD:
3783 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
3784 case llvm::Triple::NetBSD:
3785 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
3786 default:
3787 return new Mips64ELTargetInfo(T);
3788 }
3789
Ivan Krasinef05abd2011-08-24 20:22:22 +00003790 case llvm::Triple::le32:
3791 switch (os) {
3792 case llvm::Triple::NativeClient:
3793 return new PNaClTargetInfo(T);
3794 default:
3795 return NULL;
3796 }
3797
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003798 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003799 if (Triple.isOSDarwin())
Roman Divackyc81f2a22011-01-06 08:27:10 +00003800 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003801 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003802 case llvm::Triple::Linux:
3803 return new LinuxTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003804 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00003805 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003806 case llvm::Triple::NetBSD:
3807 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
3808 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00003809 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003810 default:
3811 return new PPC32TargetInfo(T);
3812 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003813
3814 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003815 if (Triple.isOSDarwin())
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00003816 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003817 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003818 case llvm::Triple::Linux:
3819 return new LinuxTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003820 case llvm::Triple::Lv2:
John Thompson3f6918a2009-11-19 17:18:50 +00003821 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003822 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00003823 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003824 case llvm::Triple::NetBSD:
3825 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
3826 default:
3827 return new PPC64TargetInfo(T);
3828 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003829
Justin Holewinski285dc652011-04-20 19:34:15 +00003830 case llvm::Triple::ptx32:
3831 return new PTX32TargetInfo(T);
3832 case llvm::Triple::ptx64:
3833 return new PTX64TargetInfo(T);
3834
Chris Lattner9cbeb632010-03-06 21:21:27 +00003835 case llvm::Triple::mblaze:
3836 return new MBlazeTargetInfo(T);
3837
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003838 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003839 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003840 case llvm::Triple::Linux:
3841 return new LinuxTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003842 case llvm::Triple::AuroraUX:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003843 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003844 case llvm::Triple::Solaris:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003845 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003846 case llvm::Triple::NetBSD:
3847 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
3848 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00003849 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003850 default:
3851 return new SparcV8TargetInfo(T);
3852 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003853
John Thompson3f6918a2009-11-19 17:18:50 +00003854 // FIXME: Need a real SPU target.
3855 case llvm::Triple::cellspu:
3856 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
3857
Eli Friedmanb63decf2009-08-19 20:47:07 +00003858 case llvm::Triple::tce:
3859 return new TCETargetInfo(T);
3860
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003861 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003862 if (Triple.isOSDarwin())
3863 return new DarwinI386TargetInfo(T);
3864
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003865 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003866 case llvm::Triple::AuroraUX:
3867 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003868 case llvm::Triple::Linux:
3869 return new LinuxTargetInfo<X86_32TargetInfo>(T);
3870 case llvm::Triple::DragonFly:
3871 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
3872 case llvm::Triple::NetBSD:
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003873 return new NetBSDI386TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003874 case llvm::Triple::OpenBSD:
3875 return new OpenBSDI386TargetInfo(T);
3876 case llvm::Triple::FreeBSD:
3877 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00003878 case llvm::Triple::Minix:
3879 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003880 case llvm::Triple::Solaris:
3881 return new SolarisTargetInfo<X86_32TargetInfo>(T);
3882 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003883 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003884 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003885 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003886 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00003887 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00003888 case llvm::Triple::Haiku:
3889 return new HaikuX86_32TargetInfo(T);
Douglas Gregordca52262011-07-01 22:41:14 +00003890 case llvm::Triple::RTEMS:
3891 return new RTEMSX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003892 default:
3893 return new X86_32TargetInfo(T);
3894 }
3895
3896 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003897 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
3898 return new DarwinX86_64TargetInfo(T);
3899
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003900 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003901 case llvm::Triple::AuroraUX:
3902 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003903 case llvm::Triple::Linux:
3904 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00003905 case llvm::Triple::DragonFly:
3906 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003907 case llvm::Triple::NetBSD:
3908 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
3909 case llvm::Triple::OpenBSD:
3910 return new OpenBSDX86_64TargetInfo(T);
3911 case llvm::Triple::FreeBSD:
3912 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
3913 case llvm::Triple::Solaris:
3914 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00003915 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003916 return new MinGWX86_64TargetInfo(T);
3917 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003918 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003919 default:
3920 return new X86_64TargetInfo(T);
3921 }
3922 }
Reid Spencer5f016e22007-07-11 17:01:13 +00003923}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003924
3925/// CreateTargetInfo - Return the target info object for the specified target
3926/// triple.
David Blaikied6471f72011-09-25 23:23:43 +00003927TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00003928 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003929 llvm::Triple Triple(Opts.Triple);
3930
3931 // Construct the target
3932 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
3933 if (!Target) {
3934 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
3935 return 0;
3936 }
3937
Daniel Dunbareac7c532009-12-18 18:42:37 +00003938 // Set the target CPU if specified.
3939 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
3940 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
3941 return 0;
3942 }
3943
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003944 // Set the target ABI if specified.
3945 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
3946 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
3947 return 0;
3948 }
3949
Charles Davis98b7c5c2010-06-11 01:06:47 +00003950 // Set the target C++ ABI.
John McCallee79a4c2010-08-21 22:46:04 +00003951 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis98b7c5c2010-06-11 01:06:47 +00003952 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
3953 return 0;
3954 }
3955
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003956 // Compute the default target features, we need the target to handle this
3957 // because features may have dependencies on one another.
3958 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003959 Target->getDefaultFeatures(Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003960
3961 // Apply the user specified deltas.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00003962 // First the enables.
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003963 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
3964 ie = Opts.Features.end(); it != ie; ++it) {
3965 const char *Name = it->c_str();
3966
Rafael Espindola53ac3d82011-11-27 20:00:43 +00003967 if (Name[0] != '+')
3968 continue;
3969
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003970 // Apply the feature via the target.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00003971 if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
3972 Diags.Report(diag::err_target_invalid_feature) << Name;
3973 return 0;
3974 }
3975 }
3976
3977 // Then the disables.
3978 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
3979 ie = Opts.Features.end(); it != ie; ++it) {
3980 const char *Name = it->c_str();
3981
3982 if (Name[0] == '+')
3983 continue;
3984
3985 // Apply the feature via the target.
3986 if (Name[0] != '-' ||
3987 !Target->setFeatureEnabled(Features, Name + 1, false)) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003988 Diags.Report(diag::err_target_invalid_feature) << Name;
3989 return 0;
3990 }
3991 }
3992
3993 // Add the features to the compile options.
3994 //
3995 // FIXME: If we are completely confident that we have the right set, we only
3996 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00003997 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003998 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
3999 ie = Features.end(); it != ie; ++it)
Chris Lattner1e5f83b2011-07-14 18:24:21 +00004000 Opts.Features.push_back(std::string(it->second ? "+" : "-") +
Chris Lattner48b78bd2011-07-14 18:45:41 +00004001 it->first().str());
Daniel Dunbarb93292a2009-12-19 03:30:57 +00004002 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004003
4004 return Target.take();
4005}