blob: d050c53ce590948509b42b20592a7fa3ef5e030e [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
Eli Friedman31cbe682012-01-13 21:33: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?
Anton Yartsev9bc23ba2012-01-17 22:40:00 +0000891 LongLongAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +0000892 SuitableAlign = 128;
Anton Yartsev9bc23ba2012-01-17 22:40:00 +0000893 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
894 "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
Roman Divackyc81f2a22011-01-06 08:27:10 +0000895 }
896 virtual const char *getVAListDeclaration() const {
897 return "typedef char* __builtin_va_list;";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000898 }
899};
900
901class DarwinPPC64TargetInfo :
902 public DarwinTargetInfo<PPC64TargetInfo> {
903public:
904 DarwinPPC64TargetInfo(const std::string& triple)
905 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
906 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +0000907 SuitableAlign = 128;
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000908 }
909};
910} // end anonymous namespace.
911
Reid Spencer5f016e22007-07-11 17:01:13 +0000912namespace {
Justin Holewinski25bedca2011-10-03 17:28:37 +0000913 static const unsigned PTXAddrSpaceMap[] = {
914 0, // opencl_global
915 4, // opencl_local
916 1 // opencl_constant
917 };
Justin Holewinski285dc652011-04-20 19:34:15 +0000918 class PTXTargetInfo : public TargetInfo {
919 static const char * const GCCRegNames[];
920 static const Builtin::Info BuiltinInfo[];
Justin Holewinskid8e0fe62011-09-22 17:57:40 +0000921 std::vector<llvm::StringRef> AvailableFeatures;
Justin Holewinski285dc652011-04-20 19:34:15 +0000922 public:
923 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +0000924 BigEndian = false;
Justin Holewinski285dc652011-04-20 19:34:15 +0000925 TLSSupported = false;
926 LongWidth = LongAlign = 64;
Justin Holewinski25bedca2011-10-03 17:28:37 +0000927 AddrSpaceMap = &PTXAddrSpaceMap;
Justin Holewinskid8e0fe62011-09-22 17:57:40 +0000928 // Define available target features
929 // These must be defined in sorted order!
930 AvailableFeatures.push_back("compute10");
931 AvailableFeatures.push_back("compute11");
932 AvailableFeatures.push_back("compute12");
933 AvailableFeatures.push_back("compute13");
934 AvailableFeatures.push_back("compute20");
935 AvailableFeatures.push_back("double");
936 AvailableFeatures.push_back("no-fma");
937 AvailableFeatures.push_back("ptx20");
938 AvailableFeatures.push_back("ptx21");
939 AvailableFeatures.push_back("ptx22");
940 AvailableFeatures.push_back("ptx23");
941 AvailableFeatures.push_back("sm10");
942 AvailableFeatures.push_back("sm11");
943 AvailableFeatures.push_back("sm12");
944 AvailableFeatures.push_back("sm13");
945 AvailableFeatures.push_back("sm20");
946 AvailableFeatures.push_back("sm21");
947 AvailableFeatures.push_back("sm22");
948 AvailableFeatures.push_back("sm23");
Justin Holewinski285dc652011-04-20 19:34:15 +0000949 }
950 virtual void getTargetDefines(const LangOptions &Opts,
951 MacroBuilder &Builder) const {
952 Builder.defineMacro("__PTX__");
953 }
954 virtual void getTargetBuiltins(const Builtin::Info *&Records,
955 unsigned &NumRecords) const {
956 Records = BuiltinInfo;
957 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
958 }
959
960 virtual void getGCCRegNames(const char * const *&Names,
961 unsigned &NumNames) const;
962 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
963 unsigned &NumAliases) const {
964 // No aliases.
965 Aliases = 0;
966 NumAliases = 0;
967 }
968 virtual bool validateAsmConstraint(const char *&Name,
969 TargetInfo::ConstraintInfo &info) const {
970 // FIXME: implement
971 return true;
972 }
973 virtual const char *getClobbers() const {
974 // FIXME: Is this really right?
975 return "";
976 }
977 virtual const char *getVAListDeclaration() const {
978 // FIXME: implement
979 return "typedef char* __builtin_va_list;";
980 }
Justin Holewinski808ef662011-09-15 12:13:38 +0000981
982 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
983 const std::string &Name,
984 bool Enabled) const;
Justin Holewinski285dc652011-04-20 19:34:15 +0000985 };
986
987 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000988#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +0000989#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000990 ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +0000991#include "clang/Basic/BuiltinsPTX.def"
992 };
993
994 const char * const PTXTargetInfo::GCCRegNames[] = {
995 "r0"
996 };
997
998 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
999 unsigned &NumNames) const {
1000 Names = GCCRegNames;
1001 NumNames = llvm::array_lengthof(GCCRegNames);
1002 }
1003
Justin Holewinski808ef662011-09-15 12:13:38 +00001004 bool PTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1005 const std::string &Name,
1006 bool Enabled) const {
Justin Holewinskid8e0fe62011-09-22 17:57:40 +00001007 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1008 Name)) {
1009 Features[Name] = Enabled;
1010 return true;
Justin Holewinski808ef662011-09-15 12:13:38 +00001011 } else {
Justin Holewinskid8e0fe62011-09-22 17:57:40 +00001012 return false;
Justin Holewinski808ef662011-09-15 12:13:38 +00001013 }
Justin Holewinski808ef662011-09-15 12:13:38 +00001014 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001015
1016 class PTX32TargetInfo : public PTXTargetInfo {
1017 public:
1018 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1019 PointerWidth = PointerAlign = 32;
1020 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
1021 DescriptionString
1022 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
1023 }
1024 };
1025
1026 class PTX64TargetInfo : public PTXTargetInfo {
1027 public:
1028 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1029 PointerWidth = PointerAlign = 64;
1030 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
1031 DescriptionString
1032 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
1033 }
1034 };
1035}
1036
1037namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +00001038// MBlaze abstract base class
1039class MBlazeTargetInfo : public TargetInfo {
1040 static const char * const GCCRegNames[];
1041 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1042
1043public:
1044 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +00001045 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +00001046 }
1047
1048 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1049 unsigned &NumRecords) const {
1050 // FIXME: Implement.
1051 Records = 0;
1052 NumRecords = 0;
1053 }
1054
1055 virtual void getTargetDefines(const LangOptions &Opts,
1056 MacroBuilder &Builder) const;
1057
1058 virtual const char *getVAListDeclaration() const {
1059 return "typedef char* __builtin_va_list;";
1060 }
1061 virtual const char *getTargetPrefix() const {
1062 return "mblaze";
1063 }
1064 virtual void getGCCRegNames(const char * const *&Names,
1065 unsigned &NumNames) const;
1066 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1067 unsigned &NumAliases) const;
1068 virtual bool validateAsmConstraint(const char *&Name,
1069 TargetInfo::ConstraintInfo &Info) const {
1070 switch (*Name) {
1071 default: return false;
1072 case 'O': // Zero
1073 return true;
1074 case 'b': // Base register
1075 case 'f': // Floating point register
1076 Info.setAllowsRegister();
1077 return true;
1078 }
1079 }
1080 virtual const char *getClobbers() const {
1081 return "";
1082 }
1083};
1084
1085/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1086/// #defines that are not tied to a specific subtarget.
1087void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1088 MacroBuilder &Builder) const {
1089 // Target identification.
1090 Builder.defineMacro("__microblaze__");
1091 Builder.defineMacro("_ARCH_MICROBLAZE");
1092 Builder.defineMacro("__MICROBLAZE__");
1093
1094 // Target properties.
1095 Builder.defineMacro("_BIG_ENDIAN");
1096 Builder.defineMacro("__BIG_ENDIAN__");
1097
1098 // Subtarget options.
1099 Builder.defineMacro("__REGISTER_PREFIX__", "");
1100}
1101
1102
1103const char * const MBlazeTargetInfo::GCCRegNames[] = {
1104 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1105 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1106 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1107 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1108 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1109 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1110 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1111 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1112 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1113 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1114};
1115
1116void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1117 unsigned &NumNames) const {
1118 Names = GCCRegNames;
1119 NumNames = llvm::array_lengthof(GCCRegNames);
1120}
1121
1122const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1123 { {"f0"}, "r0" },
1124 { {"f1"}, "r1" },
1125 { {"f2"}, "r2" },
1126 { {"f3"}, "r3" },
1127 { {"f4"}, "r4" },
1128 { {"f5"}, "r5" },
1129 { {"f6"}, "r6" },
1130 { {"f7"}, "r7" },
1131 { {"f8"}, "r8" },
1132 { {"f9"}, "r9" },
1133 { {"f10"}, "r10" },
1134 { {"f11"}, "r11" },
1135 { {"f12"}, "r12" },
1136 { {"f13"}, "r13" },
1137 { {"f14"}, "r14" },
1138 { {"f15"}, "r15" },
1139 { {"f16"}, "r16" },
1140 { {"f17"}, "r17" },
1141 { {"f18"}, "r18" },
1142 { {"f19"}, "r19" },
1143 { {"f20"}, "r20" },
1144 { {"f21"}, "r21" },
1145 { {"f22"}, "r22" },
1146 { {"f23"}, "r23" },
1147 { {"f24"}, "r24" },
1148 { {"f25"}, "r25" },
1149 { {"f26"}, "r26" },
1150 { {"f27"}, "r27" },
1151 { {"f28"}, "r28" },
1152 { {"f29"}, "r29" },
1153 { {"f30"}, "r30" },
1154 { {"f31"}, "r31" },
1155};
1156
1157void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1158 unsigned &NumAliases) const {
1159 Aliases = GCCRegAliases;
1160 NumAliases = llvm::array_lengthof(GCCRegAliases);
1161}
1162} // end anonymous namespace.
1163
1164namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001165// Namespace for x86 abstract base class
1166const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001167#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001168#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001169 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +00001170#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +00001171};
Eli Friedman61538a72008-05-20 14:21:01 +00001172
Nuno Lopes2550d702009-12-23 17:49:57 +00001173static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +00001174 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1175 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001176 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman618234a2008-08-20 02:34:37 +00001177 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1178 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1179 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001180 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001181 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1182 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman618234a2008-08-20 02:34:37 +00001183};
1184
Eric Christophercfd323d2011-06-21 00:05:20 +00001185const TargetInfo::AddlRegName AddlRegNames[] = {
1186 { { "al", "ah", "eax", "rax" }, 0 },
1187 { { "bl", "bh", "ebx", "rbx" }, 3 },
1188 { { "cl", "ch", "ecx", "rcx" }, 2 },
1189 { { "dl", "dh", "edx", "rdx" }, 1 },
1190 { { "esi", "rsi" }, 4 },
1191 { { "edi", "rdi" }, 5 },
1192 { { "esp", "rsp" }, 7 },
1193 { { "ebp", "rbp" }, 6 },
Eli Friedman618234a2008-08-20 02:34:37 +00001194};
1195
1196// X86 target abstract base class; x86-32 and x86-64 are very close, so
1197// most of the implementation can be shared.
1198class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001199 enum X86SSEEnum {
Craig Topper05fe4b52012-01-09 09:19:09 +00001200 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
Chris Lattner84f0ea82009-03-02 22:40:39 +00001201 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001202 enum MMX3DNowEnum {
1203 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1204 } MMX3DNowLevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001205
Eric Christophereea12d12010-04-02 23:50:19 +00001206 bool HasAES;
Craig Topper31ceea02011-12-25 05:06:45 +00001207 bool HasLZCNT;
1208 bool HasBMI;
1209 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001210 bool HasPOPCNT;
Craig Topper6a511e12011-12-30 07:33:42 +00001211 bool HasFMA4;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001212
Chandler Carruth499d9722011-09-28 08:55:34 +00001213 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1214 ///
1215 /// Each enumeration represents a particular CPU supported by Clang. These
1216 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1217 enum CPUKind {
1218 CK_Generic,
1219
1220 /// \name i386
1221 /// i386-generation processors.
1222 //@{
1223 CK_i386,
1224 //@}
1225
1226 /// \name i486
1227 /// i486-generation processors.
1228 //@{
1229 CK_i486,
1230 CK_WinChipC6,
1231 CK_WinChip2,
1232 CK_C3,
1233 //@}
1234
1235 /// \name i586
1236 /// i586-generation processors, P5 microarchitecture based.
1237 //@{
1238 CK_i586,
1239 CK_Pentium,
1240 CK_PentiumMMX,
1241 //@}
1242
1243 /// \name i686
1244 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1245 //@{
1246 CK_i686,
1247 CK_PentiumPro,
1248 CK_Pentium2,
1249 CK_Pentium3,
1250 CK_Pentium3M,
1251 CK_PentiumM,
1252 CK_C3_2,
1253
1254 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1255 /// Clang however has some logic to suport this.
1256 // FIXME: Warn, deprecate, and potentially remove this.
1257 CK_Yonah,
1258 //@}
1259
1260 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001261 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001262 //@{
1263 CK_Pentium4,
1264 CK_Pentium4M,
1265 CK_Prescott,
1266 CK_Nocona,
1267 //@}
1268
1269 /// \name Core
1270 /// Core microarchitecture based processors.
1271 //@{
1272 CK_Core2,
1273
1274 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1275 /// codename which GCC no longer accepts as an option to -march, but Clang
1276 /// has some logic for recognizing it.
1277 // FIXME: Warn, deprecate, and potentially remove this.
1278 CK_Penryn,
1279 //@}
1280
1281 /// \name Atom
1282 /// Atom processors
1283 //@{
1284 CK_Atom,
1285 //@}
1286
1287 /// \name Nehalem
1288 /// Nehalem microarchitecture based processors.
1289 //@{
1290 CK_Corei7,
1291 CK_Corei7AVX,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001292 CK_CoreAVXi,
Craig Topper2b03bb02011-12-17 19:55:21 +00001293 CK_CoreAVX2,
Chandler Carruth499d9722011-09-28 08:55:34 +00001294 //@}
1295
1296 /// \name K6
1297 /// K6 architecture processors.
1298 //@{
1299 CK_K6,
1300 CK_K6_2,
1301 CK_K6_3,
1302 //@}
1303
1304 /// \name K7
1305 /// K7 architecture processors.
1306 //@{
1307 CK_Athlon,
1308 CK_AthlonThunderbird,
1309 CK_Athlon4,
1310 CK_AthlonXP,
1311 CK_AthlonMP,
1312 //@}
1313
1314 /// \name K8
1315 /// K8 architecture processors.
1316 //@{
1317 CK_Athlon64,
1318 CK_Athlon64SSE3,
1319 CK_AthlonFX,
1320 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001321 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001322 CK_Opteron,
1323 CK_OpteronSSE3,
Roman Divacky01c770d2011-10-30 07:48:46 +00001324 CK_AMDFAM10,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001325 //@}
Chandler Carruth499d9722011-09-28 08:55:34 +00001326
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001327 /// \name Bobcat
1328 /// Bobcat architecture processors.
1329 //@{
1330 CK_BTVER1,
1331 //@}
1332
1333 /// \name Bulldozer
1334 /// Bulldozer architecture processors.
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001335 //@{
1336 CK_BDVER1,
1337 CK_BDVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001338 //@}
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001339
Chandler Carruth499d9722011-09-28 08:55:34 +00001340 /// This specification is deprecated and will be removed in the future.
1341 /// Users should prefer \see CK_K8.
1342 // FIXME: Warn on this when the CPU is set to it.
1343 CK_x86_64,
1344 //@}
1345
1346 /// \name Geode
1347 /// Geode processors.
1348 //@{
1349 CK_Geode
1350 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001351 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001352
Eli Friedman618234a2008-08-20 02:34:37 +00001353public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001354 X86TargetInfo(const std::string& triple)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001355 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Craig Topper05fe4b52012-01-09 09:19:09 +00001356 HasAES(false), HasLZCNT(false), HasBMI(false), HasBMI2(false),
1357 HasPOPCNT(false), HasFMA4(false), CPU(CK_Generic) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001358 BigEndian = false;
Eli Friedman618234a2008-08-20 02:34:37 +00001359 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001360 }
Benjamin Kramerb4066692011-12-28 15:47:06 +00001361 virtual unsigned getFloatEvalMethod() const {
1362 // X87 evaluates with 80 bits "long double" precision.
1363 return SSELevel == NoSSE ? 2 : 0;
1364 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001365 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1366 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001367 Records = BuiltinInfo;
1368 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001369 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001370 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001371 unsigned &NumNames) const {
1372 Names = GCCRegNames;
1373 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001374 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001375 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001376 unsigned &NumAliases) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001377 Aliases = 0;
1378 NumAliases = 0;
1379 }
1380 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1381 unsigned &NumNames) const {
1382 Names = AddlRegNames;
1383 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001384 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001385 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001386 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings002333f2011-06-07 23:45:05 +00001387 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001388 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001389 return "~{dirflag},~{fpsr},~{flags}";
1390 }
Chris Lattner33328642009-03-20 15:52:06 +00001391 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001392 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001393 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1394 const std::string &Name,
1395 bool Enabled) const;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001396 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001397 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001398 virtual const char* getABI() const {
Craig Topper05fe4b52012-01-09 09:19:09 +00001399 if (PointerWidth == 64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001400 return "avx";
1401 else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow)
1402 return "no-mmx";
1403 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001404 }
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001405 virtual bool setCPU(const std::string &Name) {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001406 CPU = llvm::StringSwitch<CPUKind>(Name)
1407 .Case("i386", CK_i386)
1408 .Case("i486", CK_i486)
1409 .Case("winchip-c6", CK_WinChipC6)
1410 .Case("winchip2", CK_WinChip2)
1411 .Case("c3", CK_C3)
1412 .Case("i586", CK_i586)
1413 .Case("pentium", CK_Pentium)
1414 .Case("pentium-mmx", CK_PentiumMMX)
1415 .Case("i686", CK_i686)
1416 .Case("pentiumpro", CK_PentiumPro)
1417 .Case("pentium2", CK_Pentium2)
1418 .Case("pentium3", CK_Pentium3)
1419 .Case("pentium3m", CK_Pentium3M)
1420 .Case("pentium-m", CK_PentiumM)
1421 .Case("c3-2", CK_C3_2)
1422 .Case("yonah", CK_Yonah)
1423 .Case("pentium4", CK_Pentium4)
1424 .Case("pentium4m", CK_Pentium4M)
1425 .Case("prescott", CK_Prescott)
1426 .Case("nocona", CK_Nocona)
1427 .Case("core2", CK_Core2)
1428 .Case("penryn", CK_Penryn)
1429 .Case("atom", CK_Atom)
1430 .Case("corei7", CK_Corei7)
1431 .Case("corei7-avx", CK_Corei7AVX)
1432 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper2b03bb02011-12-17 19:55:21 +00001433 .Case("core-avx2", CK_CoreAVX2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001434 .Case("k6", CK_K6)
1435 .Case("k6-2", CK_K6_2)
1436 .Case("k6-3", CK_K6_3)
1437 .Case("athlon", CK_Athlon)
1438 .Case("athlon-tbird", CK_AthlonThunderbird)
1439 .Case("athlon-4", CK_Athlon4)
1440 .Case("athlon-xp", CK_AthlonXP)
1441 .Case("athlon-mp", CK_AthlonMP)
1442 .Case("athlon64", CK_Athlon64)
1443 .Case("athlon64-sse3", CK_Athlon64SSE3)
1444 .Case("athlon-fx", CK_AthlonFX)
1445 .Case("k8", CK_K8)
1446 .Case("k8-sse3", CK_K8SSE3)
1447 .Case("opteron", CK_Opteron)
1448 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky01c770d2011-10-30 07:48:46 +00001449 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001450 .Case("btver1", CK_BTVER1)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001451 .Case("bdver1", CK_BDVER1)
1452 .Case("bdver2", CK_BDVER2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001453 .Case("x86-64", CK_x86_64)
1454 .Case("geode", CK_Geode)
1455 .Default(CK_Generic);
1456
Chandler Carruth26a39142011-09-28 09:45:08 +00001457 // Perform any per-CPU checks necessary to determine if this CPU is
1458 // acceptable.
1459 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1460 // invalid without explaining *why*.
1461 switch (CPU) {
1462 case CK_Generic:
1463 // No processor selected!
1464 return false;
1465
1466 case CK_i386:
1467 case CK_i486:
1468 case CK_WinChipC6:
1469 case CK_WinChip2:
1470 case CK_C3:
1471 case CK_i586:
1472 case CK_Pentium:
1473 case CK_PentiumMMX:
1474 case CK_i686:
1475 case CK_PentiumPro:
1476 case CK_Pentium2:
1477 case CK_Pentium3:
1478 case CK_Pentium3M:
1479 case CK_PentiumM:
1480 case CK_Yonah:
1481 case CK_C3_2:
1482 case CK_Pentium4:
1483 case CK_Pentium4M:
1484 case CK_Prescott:
1485 case CK_K6:
1486 case CK_K6_2:
1487 case CK_K6_3:
1488 case CK_Athlon:
1489 case CK_AthlonThunderbird:
1490 case CK_Athlon4:
1491 case CK_AthlonXP:
1492 case CK_AthlonMP:
1493 case CK_Geode:
1494 // Only accept certain architectures when compiling in 32-bit mode.
1495 if (PointerWidth != 32)
1496 return false;
1497
1498 // Fallthrough
1499 case CK_Nocona:
1500 case CK_Core2:
1501 case CK_Penryn:
1502 case CK_Atom:
1503 case CK_Corei7:
1504 case CK_Corei7AVX:
1505 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001506 case CK_CoreAVX2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001507 case CK_Athlon64:
1508 case CK_Athlon64SSE3:
1509 case CK_AthlonFX:
1510 case CK_K8:
1511 case CK_K8SSE3:
1512 case CK_Opteron:
1513 case CK_OpteronSSE3:
Roman Divacky01c770d2011-10-30 07:48:46 +00001514 case CK_AMDFAM10:
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001515 case CK_BTVER1:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001516 case CK_BDVER1:
1517 case CK_BDVER2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001518 case CK_x86_64:
1519 return true;
1520 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00001521 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001522 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001523};
Chris Lattner3daed522009-03-02 22:20:04 +00001524
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001525void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001526 // FIXME: This should not be here.
1527 Features["3dnow"] = false;
1528 Features["3dnowa"] = false;
1529 Features["mmx"] = false;
1530 Features["sse"] = false;
1531 Features["sse2"] = false;
1532 Features["sse3"] = false;
1533 Features["ssse3"] = false;
1534 Features["sse41"] = false;
1535 Features["sse42"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00001536 Features["sse4a"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001537 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001538 Features["avx"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00001539 Features["avx2"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00001540 Features["lzcnt"] = false;
1541 Features["bmi"] = false;
1542 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00001543 Features["popcnt"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00001544 Features["fma4"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001545
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001546 // FIXME: This *really* should not be here.
1547
1548 // X86_64 always has SSE2.
1549 if (PointerWidth == 64)
1550 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1551
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001552 switch (CPU) {
1553 case CK_Generic:
1554 case CK_i386:
1555 case CK_i486:
1556 case CK_i586:
1557 case CK_Pentium:
1558 case CK_i686:
1559 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001560 break;
1561 case CK_PentiumMMX:
1562 case CK_Pentium2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001563 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001564 break;
1565 case CK_Pentium3:
1566 case CK_Pentium3M:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001567 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001568 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001569 break;
1570 case CK_PentiumM:
1571 case CK_Pentium4:
1572 case CK_Pentium4M:
1573 case CK_x86_64:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001574 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001575 setFeatureEnabled(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001576 break;
1577 case CK_Yonah:
1578 case CK_Prescott:
1579 case CK_Nocona:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001580 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001581 setFeatureEnabled(Features, "sse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001582 break;
1583 case CK_Core2:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001584 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001585 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001586 break;
1587 case CK_Penryn:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001588 setFeatureEnabled(Features, "mmx", true);
Benjamin Kramerb3453a82012-01-04 14:36:57 +00001589 setFeatureEnabled(Features, "sse4.1", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001590 break;
1591 case CK_Atom:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001592 setFeatureEnabled(Features, "mmx", true);
Chandler Carruth49defe62011-09-28 10:36:46 +00001593 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001594 break;
1595 case CK_Corei7:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001596 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001597 setFeatureEnabled(Features, "sse4", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001598 setFeatureEnabled(Features, "aes", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001599 break;
1600 case CK_Corei7AVX:
1601 case CK_CoreAVXi:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001602 setFeatureEnabled(Features, "mmx", true);
Roman Divackybcaa3b82011-04-05 20:32:44 +00001603 setFeatureEnabled(Features, "sse4", true);
1604 setFeatureEnabled(Features, "aes", true);
Bruno Cardoso Lopese02d3912011-07-11 23:33:46 +00001605 //setFeatureEnabled(Features, "avx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001606 break;
Craig Topper2b03bb02011-12-17 19:55:21 +00001607 case CK_CoreAVX2:
1608 setFeatureEnabled(Features, "mmx", true);
1609 setFeatureEnabled(Features, "sse4", true);
1610 setFeatureEnabled(Features, "aes", true);
Craig Topper31ceea02011-12-25 05:06:45 +00001611 setFeatureEnabled(Features, "lzcnt", true);
1612 setFeatureEnabled(Features, "bmi", true);
1613 setFeatureEnabled(Features, "bmi2", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00001614 //setFeatureEnabled(Features, "avx2", true);
1615 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001616 case CK_K6:
1617 case CK_WinChipC6:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001618 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001619 break;
1620 case CK_K6_2:
1621 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001622 case CK_WinChip2:
1623 case CK_C3:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001624 setFeatureEnabled(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001625 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00001626 case CK_Athlon:
1627 case CK_AthlonThunderbird:
1628 case CK_Geode:
1629 setFeatureEnabled(Features, "3dnowa", true);
1630 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001631 case CK_Athlon4:
1632 case CK_AthlonXP:
1633 case CK_AthlonMP:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001634 setFeatureEnabled(Features, "sse", true);
1635 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001636 break;
1637 case CK_K8:
1638 case CK_Opteron:
1639 case CK_Athlon64:
1640 case CK_AthlonFX:
Mike Stump1eb44332009-09-09 15:08:12 +00001641 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001642 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001643 break;
1644 case CK_K8SSE3:
1645 case CK_OpteronSSE3:
1646 case CK_Athlon64SSE3:
Roman Divacky80b32b82011-10-30 13:47:56 +00001647 setFeatureEnabled(Features, "sse3", true);
1648 setFeatureEnabled(Features, "3dnowa", true);
1649 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00001650 case CK_AMDFAM10:
Roman Divackyc8b09a12010-12-29 13:28:29 +00001651 setFeatureEnabled(Features, "sse3", true);
Roman Divacky80b32b82011-10-30 13:47:56 +00001652 setFeatureEnabled(Features, "sse4a", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00001653 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001654 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001655 case CK_BTVER1:
1656 setFeatureEnabled(Features, "ssse3", true);
1657 setFeatureEnabled(Features, "sse4a", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001658 case CK_BDVER1:
1659 case CK_BDVER2:
1660 setFeatureEnabled(Features, "sse4", true);
1661 setFeatureEnabled(Features, "sse4a", true);
1662 setFeatureEnabled(Features, "aes", true);
1663 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001664 case CK_C3_2:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001665 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001666 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001667 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001668 }
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001669}
1670
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001671bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump1eb44332009-09-09 15:08:12 +00001672 const std::string &Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001673 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00001674 // FIXME: This *really* should not be here. We need some way of translating
1675 // options into llvm subtarget features.
1676 if (!Features.count(Name) &&
1677 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001678 return false;
1679
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001680 // FIXME: this should probably use a switch with fall through.
1681
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001682 if (Enabled) {
1683 if (Name == "mmx")
1684 Features["mmx"] = true;
1685 else if (Name == "sse")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001686 Features["mmx"] = Features["sse"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001687 else if (Name == "sse2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001688 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001689 else if (Name == "sse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001690 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1691 true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001692 else if (Name == "ssse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001693 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001694 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001695 else if (Name == "sse4" || Name == "sse4.2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001696 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001697 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1698 Features["popcnt"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001699 else if (Name == "sse4.1")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001700 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopherd39ebe22010-03-04 02:26:37 +00001701 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001702 else if (Name == "3dnow")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001703 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001704 else if (Name == "3dnowa")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001705 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00001706 else if (Name == "aes")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001707 Features["aes"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001708 else if (Name == "avx")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001709 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1710 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001711 Features["popcnt"] = Features["avx"] = true;
Craig Topper2b03bb02011-12-17 19:55:21 +00001712 else if (Name == "avx2")
1713 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1714 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001715 Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
Craig Topper6a511e12011-12-30 07:33:42 +00001716 else if (Name == "fma4")
1717 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1718 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1719 Features["popcnt"] = Features["avx"] = Features["fma4"] = true;
Roman Divacky80b32b82011-10-30 13:47:56 +00001720 else if (Name == "sse4a")
Craig Topper6a511e12011-12-30 07:33:42 +00001721 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Benjamin Kramer5c65e4f2012-01-10 11:50:13 +00001722 Features["lzcnt"] = Features["popcnt"] = Features["sse4a"] = true;
Craig Topper31ceea02011-12-25 05:06:45 +00001723 else if (Name == "lzcnt")
1724 Features["lzcnt"] = true;
1725 else if (Name == "bmi")
1726 Features["bmi"] = true;
1727 else if (Name == "bmi2")
1728 Features["bmi2"] = true;
Craig Toppere14e08b2011-12-29 16:10:46 +00001729 else if (Name == "popcnt")
1730 Features["popcnt"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001731 } else {
1732 if (Name == "mmx")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001733 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001734 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00001735 Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00001736 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1737 Features["sse4a"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001738 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00001739 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00001740 Features["sse41"] = Features["sse42"] = Features["sse4a"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001741 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001742 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Craig Topper6a511e12011-12-30 07:33:42 +00001743 Features["sse42"] = Features["sse4a"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001744 else if (Name == "ssse3")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001745 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencerb24bac92011-04-17 19:22:03 +00001746 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001747 Features["sse41"] = Features["sse42"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00001748 else if (Name == "sse4.2")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001749 Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001750 else if (Name == "3dnow")
1751 Features["3dnow"] = Features["3dnowa"] = false;
1752 else if (Name == "3dnowa")
1753 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001754 else if (Name == "aes")
1755 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001756 else if (Name == "avx")
Craig Topper6a511e12011-12-30 07:33:42 +00001757 Features["avx"] = Features["avx2"] = Features["fma4"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00001758 else if (Name == "avx2")
1759 Features["avx2"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00001760 else if (Name == "sse4a")
1761 Features["sse4a"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00001762 else if (Name == "lzcnt")
1763 Features["lzcnt"] = false;
1764 else if (Name == "bmi")
1765 Features["bmi"] = false;
1766 else if (Name == "bmi2")
1767 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00001768 else if (Name == "popcnt")
1769 Features["popcnt"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00001770 else if (Name == "fma4")
1771 Features["fma4"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001772 }
1773
1774 return true;
1775}
1776
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001777/// HandleTargetOptions - Perform initialization based on the user
1778/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001779void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001780 // Remember the maximum enabled sselevel.
1781 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1782 // Ignore disabled features.
1783 if (Features[i][0] == '-')
1784 continue;
1785
Eric Christophereea12d12010-04-02 23:50:19 +00001786 if (Features[i].substr(1) == "aes") {
1787 HasAES = true;
1788 continue;
1789 }
1790
Craig Topper31ceea02011-12-25 05:06:45 +00001791 if (Features[i].substr(1) == "lzcnt") {
1792 HasLZCNT = true;
1793 continue;
1794 }
1795
1796 if (Features[i].substr(1) == "bmi") {
1797 HasBMI = true;
1798 continue;
1799 }
1800
1801 if (Features[i].substr(1) == "bmi2") {
1802 HasBMI2 = true;
1803 continue;
1804 }
1805
Craig Toppere14e08b2011-12-29 16:10:46 +00001806 if (Features[i].substr(1) == "popcnt") {
1807 HasPOPCNT = true;
1808 continue;
1809 }
1810
Craig Topper6a511e12011-12-30 07:33:42 +00001811 if (Features[i].substr(1) == "fma4") {
1812 HasFMA4 = true;
1813 continue;
1814 }
1815
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001816 assert(Features[i][0] == '+' && "Invalid target feature!");
1817 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
Craig Topper05fe4b52012-01-09 09:19:09 +00001818 .Case("avx2", AVX2)
1819 .Case("avx", AVX)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001820 .Case("sse42", SSE42)
1821 .Case("sse41", SSE41)
1822 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00001823 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001824 .Case("sse2", SSE2)
1825 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001826 .Default(NoSSE);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001827 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001828
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001829 MMX3DNowEnum ThreeDNowLevel =
1830 llvm::StringSwitch<MMX3DNowEnum>(Features[i].substr(1))
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001831 .Case("3dnowa", AMD3DNowAthlon)
1832 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001833 .Case("mmx", MMX)
1834 .Default(NoMMX3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001835
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001836 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001837 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001838
1839 // Don't tell the backend if we're turning off mmx; it will end up disabling
1840 // SSE, which we don't want.
1841 std::vector<std::string>::iterator it;
1842 it = std::find(Features.begin(), Features.end(), "-mmx");
1843 if (it != Features.end())
1844 Features.erase(it);
Chris Lattner3daed522009-03-02 22:20:04 +00001845}
Chris Lattnerc0f59212009-03-02 22:27:17 +00001846
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001847/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
1848/// definitions for this particular subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00001849void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001850 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001851 // Target identification.
1852 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001853 Builder.defineMacro("_LP64");
1854 Builder.defineMacro("__LP64__");
1855 Builder.defineMacro("__amd64__");
1856 Builder.defineMacro("__amd64");
1857 Builder.defineMacro("__x86_64");
1858 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00001859 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00001860 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00001861 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001862
Chris Lattnerc0f59212009-03-02 22:27:17 +00001863 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001864 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
1865 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001866 switch (CPU) {
1867 case CK_Generic:
1868 break;
1869 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001870 // The rest are coming from the i386 define above.
1871 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001872 break;
1873 case CK_i486:
1874 case CK_WinChipC6:
1875 case CK_WinChip2:
1876 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001877 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001878 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00001879 case CK_PentiumMMX:
1880 Builder.defineMacro("__pentium_mmx__");
1881 Builder.defineMacro("__tune_pentium_mmx__");
1882 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001883 case CK_i586:
1884 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001885 defineCPUMacros(Builder, "i586");
1886 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001887 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001888 case CK_Pentium3:
1889 case CK_Pentium3M:
1890 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001891 Builder.defineMacro("__tune_pentium3__");
1892 // Fallthrough
1893 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001894 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001895 Builder.defineMacro("__tune_pentium2__");
1896 // Fallthrough
1897 case CK_PentiumPro:
1898 Builder.defineMacro("__tune_i686__");
1899 Builder.defineMacro("__tune_pentiumpro__");
1900 // Fallthrough
1901 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001902 Builder.defineMacro("__i686");
1903 Builder.defineMacro("__i686__");
1904 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
1905 Builder.defineMacro("__pentiumpro");
1906 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001907 break;
1908 case CK_Pentium4:
1909 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001910 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001911 break;
1912 case CK_Yonah:
1913 case CK_Prescott:
1914 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001915 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001916 break;
1917 case CK_Core2:
1918 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001919 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001920 break;
1921 case CK_Atom:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001922 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001923 break;
1924 case CK_Corei7:
1925 case CK_Corei7AVX:
1926 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001927 case CK_CoreAVX2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001928 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001929 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001930 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001931 Builder.defineMacro("__k6_2__");
1932 Builder.defineMacro("__tune_k6_2__");
1933 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001934 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001935 if (CPU != CK_K6_2) { // In case of fallthrough
1936 // FIXME: GCC may be enabling these in cases where some other k6
1937 // architecture is specified but -m3dnow is explicitly provided. The
1938 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001939 Builder.defineMacro("__k6_3__");
1940 Builder.defineMacro("__tune_k6_3__");
1941 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00001942 // Fallthrough
1943 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001944 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001945 break;
1946 case CK_Athlon:
1947 case CK_AthlonThunderbird:
1948 case CK_Athlon4:
1949 case CK_AthlonXP:
1950 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001951 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00001952 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001953 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00001954 Builder.defineMacro("__tune_athlon_sse__");
1955 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001956 break;
1957 case CK_K8:
1958 case CK_K8SSE3:
1959 case CK_x86_64:
1960 case CK_Opteron:
1961 case CK_OpteronSSE3:
1962 case CK_Athlon64:
1963 case CK_Athlon64SSE3:
1964 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001965 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001966 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00001967 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001968 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00001969 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001970 case CK_BTVER1:
1971 defineCPUMacros(Builder, "btver1");
1972 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001973 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001974 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001975 break;
1976 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001977 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001978 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001979 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001980 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001981 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001982 }
Chris Lattner84f0ea82009-03-02 22:40:39 +00001983
Chandler Carruth88c75b02011-09-28 09:54:07 +00001984 // Target properties.
1985 Builder.defineMacro("__LITTLE_ENDIAN__");
1986 Builder.defineMacro("__REGISTER_PREFIX__", "");
1987
Chris Lattner54175442009-04-19 17:32:33 +00001988 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1989 // functions in glibc header files that use FP Stack inline asm which the
1990 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00001991 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001992
Chandler Carruth88c75b02011-09-28 09:54:07 +00001993 if (HasAES)
1994 Builder.defineMacro("__AES__");
1995
Craig Topper31ceea02011-12-25 05:06:45 +00001996 if (HasLZCNT)
1997 Builder.defineMacro("__LZCNT__");
1998
1999 if (HasBMI)
2000 Builder.defineMacro("__BMI__");
2001
2002 if (HasBMI2)
2003 Builder.defineMacro("__BMI2__");
2004
Craig Toppere14e08b2011-12-29 16:10:46 +00002005 if (HasPOPCNT)
2006 Builder.defineMacro("__POPCNT__");
2007
Craig Topper6a511e12011-12-30 07:33:42 +00002008 if (HasFMA4)
2009 Builder.defineMacro("__FMA4__");
2010
Chris Lattner84f0ea82009-03-02 22:40:39 +00002011 // Each case falls through to the previous one here.
2012 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002013 case AVX2:
2014 Builder.defineMacro("__AVX2__");
2015 case AVX:
2016 Builder.defineMacro("__AVX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002017 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00002018 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002019 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00002020 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002021 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002022 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002023 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002024 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002025 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00002026 Builder.defineMacro("__SSE2__");
2027 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00002028 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00002029 Builder.defineMacro("__SSE__");
2030 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002031 case NoSSE:
Chris Lattner84f0ea82009-03-02 22:40:39 +00002032 break;
2033 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002034
Francois Pichet62ec1f22011-09-17 17:15:52 +00002035 if (Opts.MicrosoftExt && PointerWidth == 32) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002036 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002037 case AVX2:
2038 case AVX:
Michael J. Spencera764e832010-10-21 08:22:51 +00002039 case SSE42:
2040 case SSE41:
2041 case SSSE3:
2042 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002043 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002044 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002045 break;
2046 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002047 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002048 break;
2049 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002050 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002051 }
2052 }
2053
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002054 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002055 switch (MMX3DNowLevel) {
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002056 case AMD3DNowAthlon:
2057 Builder.defineMacro("__3dNOW_A__");
2058 case AMD3DNow:
2059 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002060 case MMX:
2061 Builder.defineMacro("__MMX__");
2062 case NoMMX3DNow:
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002063 break;
2064 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00002065}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002066
2067
Eli Friedman618234a2008-08-20 02:34:37 +00002068bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002069X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002070 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002071 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00002072 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00002073 case 'Y': // first letter of a pair:
2074 switch (*(Name+1)) {
2075 default: return false;
2076 case '0': // First SSE register.
2077 case 't': // Any SSE register, when SSE2 is enabled.
2078 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2079 case 'm': // any MMX register, when inter-unit moves enabled.
2080 break; // falls through to setAllowsRegister.
2081 }
Eli Friedman618234a2008-08-20 02:34:37 +00002082 case 'a': // eax.
2083 case 'b': // ebx.
2084 case 'c': // ecx.
2085 case 'd': // edx.
2086 case 'S': // esi.
2087 case 'D': // edi.
2088 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00002089 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00002090 case 't': // top of floating point stack.
2091 case 'u': // second from top of floating point stack.
2092 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00002093 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00002094 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00002095 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00002096 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2097 case 'l': // "Index" registers: any general register that can be used as an
2098 // index in a base+index memory access.
2099 Info.setAllowsRegister();
2100 return true;
2101 case 'C': // SSE floating point constant.
2102 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002103 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002104 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002105 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002106 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00002107 return true;
2108 }
2109}
2110
Dale Johannesenf6e2c202010-10-29 23:12:32 +00002111
Eli Friedman618234a2008-08-20 02:34:37 +00002112std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00002113X86TargetInfo::convertConstraint(const char *&Constraint) const {
2114 switch (*Constraint) {
Eli Friedman618234a2008-08-20 02:34:37 +00002115 case 'a': return std::string("{ax}");
2116 case 'b': return std::string("{bx}");
2117 case 'c': return std::string("{cx}");
2118 case 'd': return std::string("{dx}");
2119 case 'S': return std::string("{si}");
2120 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00002121 case 'p': // address
2122 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00002123 case 't': // top of floating point stack.
2124 return std::string("{st}");
2125 case 'u': // second from top of floating point stack.
2126 return std::string("{st(1)}"); // second from top of floating point stack.
2127 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00002128 return std::string(1, *Constraint);
Eli Friedman618234a2008-08-20 02:34:37 +00002129 }
2130}
Eli Friedman618234a2008-08-20 02:34:37 +00002131} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00002132
2133namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002134// X86-32 generic target
2135class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00002136public:
Eli Friedman618234a2008-08-20 02:34:37 +00002137 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2138 DoubleAlign = LongLongAlign = 32;
2139 LongDoubleWidth = 96;
2140 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00002141 SuitableAlign = 128;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002142 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2143 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames567c6002011-10-11 00:52:51 +00002144 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman1afabd92009-03-29 20:31:09 +00002145 SizeType = UnsignedInt;
2146 PtrDiffType = SignedInt;
2147 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002148 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002149
2150 // Use fpret for all types.
2151 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2152 (1 << TargetInfo::Double) |
2153 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00002154
2155 // x86-32 has atomics up to 8 bytes
2156 // FIXME: Check that we actually have cmpxchg8b before setting
2157 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2158 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman618234a2008-08-20 02:34:37 +00002159 }
2160 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002161 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +00002162 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002163
Chris Lattner21fb98e2009-09-23 06:06:36 +00002164 int getEHDataRegisterNumber(unsigned RegNo) const {
2165 if (RegNo == 0) return 0;
2166 if (RegNo == 1) return 2;
2167 return -1;
2168 }
Eli Friedman618234a2008-08-20 02:34:37 +00002169};
2170} // end anonymous namespace
2171
2172namespace {
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00002173class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2174public:
2175 NetBSDI386TargetInfo(const std::string &triple) :
2176 NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2177 }
2178
2179 virtual unsigned getFloatEvalMethod() const {
2180 // NetBSD defaults to "double" rounding
2181 return 1;
2182 }
2183};
2184} // end anonymous namespace
2185
2186namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00002187class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2188public:
2189 OpenBSDI386TargetInfo(const std::string& triple) :
2190 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2191 SizeType = UnsignedLong;
2192 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00002193 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00002194 }
2195};
2196} // end anonymous namespace
2197
2198namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00002199class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00002200public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002201 DarwinI386TargetInfo(const std::string& triple) :
2202 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00002203 LongDoubleWidth = 128;
2204 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002205 SuitableAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +00002206 SizeType = UnsignedLong;
2207 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002208 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2209 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002210 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbar613fd672010-05-27 00:35:16 +00002211 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00002212 }
2213
Eli Friedman618234a2008-08-20 02:34:37 +00002214};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00002215} // end anonymous namespace
2216
2217namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00002218// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002219class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00002220public:
2221 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002222 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00002223 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00002224 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00002225 DoubleAlign = LongLongAlign = 64;
2226 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 +00002227 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002228 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedman29a30502008-08-21 01:40:19 +00002229 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002230 virtual void getTargetDefines(const LangOptions &Opts,
2231 MacroBuilder &Builder) const {
2232 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2233 }
2234};
2235} // end anonymous namespace
2236
2237namespace {
2238
2239// x86-32 Windows Visual Studio target
2240class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2241public:
2242 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2243 : WindowsX86_32TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002244 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00002245 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2246 }
2247 virtual void getTargetDefines(const LangOptions &Opts,
2248 MacroBuilder &Builder) const {
2249 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2250 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2251 // The value of the following reflects processor type.
2252 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2253 // We lost the original triple, so we use the default.
2254 Builder.defineMacro("_M_IX86", "600");
2255 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002256};
2257} // end anonymous namespace
2258
2259namespace {
2260// x86-32 MinGW target
2261class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2262public:
2263 MinGWX86_32TargetInfo(const std::string& triple)
2264 : WindowsX86_32TargetInfo(triple) {
2265 }
2266 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002267 MacroBuilder &Builder) const {
2268 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002269 DefineStd(Builder, "WIN32", Opts);
2270 DefineStd(Builder, "WINNT", Opts);
2271 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00002272 Builder.defineMacro("__MSVCRT__");
2273 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002274
2275 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2276 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002277 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002278 // Provide "as-is" __declspec.
2279 Builder.defineMacro("__declspec", "__declspec");
2280 else
2281 // Provide alias of __attribute__ like mingw32-gcc.
2282 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002283 }
2284};
2285} // end anonymous namespace
2286
2287namespace {
2288// x86-32 Cygwin target
2289class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2290public:
2291 CygwinX86_32TargetInfo(const std::string& triple)
2292 : X86_32TargetInfo(triple) {
2293 TLSSupported = false;
2294 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002295 DoubleAlign = LongLongAlign = 64;
2296 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2297 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002298 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002299 }
2300 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002301 MacroBuilder &Builder) const {
2302 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2303 Builder.defineMacro("__CYGWIN__");
2304 Builder.defineMacro("__CYGWIN32__");
2305 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00002306 if (Opts.CPlusPlus)
2307 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00002308 }
Eli Friedman29a30502008-08-21 01:40:19 +00002309};
2310} // end anonymous namespace
2311
2312namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00002313// x86-32 Haiku target
2314class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2315public:
2316 HaikuX86_32TargetInfo(const std::string& triple)
2317 : X86_32TargetInfo(triple) {
2318 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00002319 IntPtrType = SignedLong;
2320 PtrDiffType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00002321 this->UserLabelPrefix = "";
Eli Friedmana7e68452010-08-22 01:00:03 +00002322 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00002323 virtual void getTargetDefines(const LangOptions &Opts,
2324 MacroBuilder &Builder) const {
2325 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2326 Builder.defineMacro("__INTEL__");
2327 Builder.defineMacro("__HAIKU__");
2328 }
2329};
2330} // end anonymous namespace
2331
Douglas Gregordca52262011-07-01 22:41:14 +00002332// RTEMS Target
2333template<typename Target>
2334class RTEMSTargetInfo : public OSTargetInfo<Target> {
2335protected:
2336 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2337 MacroBuilder &Builder) const {
2338 // RTEMS defines; list based off of gcc output
2339
Douglas Gregordca52262011-07-01 22:41:14 +00002340 Builder.defineMacro("__rtems__");
2341 Builder.defineMacro("__ELF__");
2342 }
2343public:
2344 RTEMSTargetInfo(const std::string &triple)
2345 : OSTargetInfo<Target>(triple) {
2346 this->UserLabelPrefix = "";
2347
2348 llvm::Triple Triple(triple);
2349 switch (Triple.getArch()) {
2350 default:
2351 case llvm::Triple::x86:
2352 // this->MCountName = ".mcount";
2353 break;
2354 case llvm::Triple::mips:
2355 case llvm::Triple::mipsel:
2356 case llvm::Triple::ppc:
2357 case llvm::Triple::ppc64:
2358 // this->MCountName = "_mcount";
2359 break;
2360 case llvm::Triple::arm:
2361 // this->MCountName = "__mcount";
2362 break;
2363 }
2364
2365 }
2366};
2367
2368namespace {
2369// x86-32 RTEMS target
2370class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
2371public:
2372 RTEMSX86_32TargetInfo(const std::string& triple)
2373 : X86_32TargetInfo(triple) {
2374 SizeType = UnsignedLong;
2375 IntPtrType = SignedLong;
2376 PtrDiffType = SignedLong;
2377 this->UserLabelPrefix = "";
2378 }
2379 virtual void getTargetDefines(const LangOptions &Opts,
2380 MacroBuilder &Builder) const {
2381 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2382 Builder.defineMacro("__INTEL__");
2383 Builder.defineMacro("__rtems__");
2384 }
2385};
2386} // end anonymous namespace
2387
Chris Lattner86ed3a32010-04-11 19:29:39 +00002388namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002389// x86-64 generic target
2390class X86_64TargetInfo : public X86TargetInfo {
2391public:
Chris Lattner33328642009-03-20 15:52:06 +00002392 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00002393 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00002394 LongDoubleWidth = 128;
2395 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00002396 LargeArrayMinWidth = 128;
2397 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002398 SuitableAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00002399 IntMaxType = SignedLong;
2400 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002401 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002402 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00002403
Eli Friedmaned855cb2008-08-21 00:13:15 +00002404 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2405 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002406 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002407
2408 // Use fpret only for long double.
2409 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00002410
Anders Carlssoneea64802011-10-31 16:27:11 +00002411 // Use fp2ret for _Complex long double.
2412 ComplexLongDoubleUsesFP2Ret = true;
2413
Eli Friedman2be46072011-10-14 20:59:01 +00002414 // x86-64 has atomics up to 16 bytes.
2415 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
2416 // on CPUs with cmpxchg16b
2417 MaxAtomicPromoteWidth = 128;
2418 MaxAtomicInlineWidth = 64;
Reid Spencer5f016e22007-07-11 17:01:13 +00002419 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00002420 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002421 return "typedef struct __va_list_tag {"
2422 " unsigned gp_offset;"
2423 " unsigned fp_offset;"
2424 " void* overflow_arg_area;"
2425 " void* reg_save_area;"
John McCall2b7baf02010-05-28 18:25:28 +00002426 "} __va_list_tag;"
Eli Friedmandc043162009-07-03 00:45:06 +00002427 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +00002428 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002429
Chris Lattner21fb98e2009-09-23 06:06:36 +00002430 int getEHDataRegisterNumber(unsigned RegNo) const {
2431 if (RegNo == 0) return 0;
2432 if (RegNo == 1) return 1;
2433 return -1;
2434 }
Eli Friedman618234a2008-08-20 02:34:37 +00002435};
2436} // end anonymous namespace
2437
2438namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002439// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002440class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002441public:
2442 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002443 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002444 TLSSupported = false;
2445 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00002446 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00002447 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00002448 IntMaxType = SignedLongLong;
2449 UIntMaxType = UnsignedLongLong;
2450 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00002451 SizeType = UnsignedLongLong;
2452 PtrDiffType = SignedLongLong;
2453 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00002454 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002455 }
2456 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002457 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002458 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002459 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00002460 }
NAKAMURA Takumi79521992011-01-17 22:56:23 +00002461 virtual const char *getVAListDeclaration() const {
2462 return "typedef char* __builtin_va_list;";
2463 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002464};
2465} // end anonymous namespace
2466
2467namespace {
2468// x86-64 Windows Visual Studio target
2469class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
2470public:
2471 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
2472 : WindowsX86_64TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002473 LongDoubleWidth = LongDoubleAlign = 64;
2474 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00002475 }
2476 virtual void getTargetDefines(const LangOptions &Opts,
2477 MacroBuilder &Builder) const {
2478 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2479 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00002480 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002481 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002482 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002483};
2484} // end anonymous namespace
2485
2486namespace {
2487// x86-64 MinGW target
2488class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
2489public:
2490 MinGWX86_64TargetInfo(const std::string& triple)
2491 : WindowsX86_64TargetInfo(triple) {
2492 }
2493 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002494 MacroBuilder &Builder) const {
2495 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002496 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00002497 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00002498 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00002499 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002500
2501 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2502 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002503 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002504 // Provide "as-is" __declspec.
2505 Builder.defineMacro("__declspec", "__declspec");
2506 else
2507 // Provide alias of __attribute__ like mingw32-gcc.
2508 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002509 }
2510};
2511} // end anonymous namespace
2512
2513namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002514class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
2515public:
Mike Stump1eb44332009-09-09 15:08:12 +00002516 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002517 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
2518 Int64Type = SignedLongLong;
2519 }
2520};
2521} // end anonymous namespace
2522
2523namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00002524class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
2525public:
Mike Stump1eb44332009-09-09 15:08:12 +00002526 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00002527 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
2528 IntMaxType = SignedLongLong;
2529 UIntMaxType = UnsignedLongLong;
2530 Int64Type = SignedLongLong;
2531 }
2532};
2533} // end anonymous namespace
2534
2535namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00002536class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002537 // Possible FPU choices.
2538 enum FPUMode {
2539 NoFPU,
2540 VFP2FPU,
2541 VFP3FPU,
2542 NeonFPU
2543 };
2544
2545 static bool FPUModeIsVFP(FPUMode Mode) {
2546 return Mode >= VFP2FPU && Mode <= NeonFPU;
2547 }
2548
2549 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2550 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002551
Daniel Dunbareac7c532009-12-18 18:42:37 +00002552 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00002553
2554 unsigned FPU : 3;
2555
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002556 unsigned IsThumb : 1;
2557
2558 // Initialized via features.
2559 unsigned SoftFloat : 1;
2560 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002561
Chris Lattner2752c012010-03-03 19:03:45 +00002562 static const Builtin::Info BuiltinInfo[];
2563
Chris Lattner393ff042008-04-21 18:56:49 +00002564public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002565 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbareac7c532009-12-18 18:42:37 +00002566 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002567 {
Eli Friedmane6a24e82011-12-22 03:51:45 +00002568 BigEndian = false;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002569 SizeType = UnsignedInt;
2570 PtrDiffType = SignedInt;
James Molloya6d81f92011-11-23 13:35:08 +00002571 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
2572 WCharType = UnsignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002573
Chris Lattner9bffb072010-04-23 16:29:58 +00002574 // {} in inline assembly are neon specifiers, not assembly variant
2575 // specifiers.
2576 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00002577
Daniel Dunbareac7c532009-12-18 18:42:37 +00002578 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00002579 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002580 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00002581 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2582 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002583 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2584 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002585 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002586 } else {
2587 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2588 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002589 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002590 }
John McCallee79a4c2010-08-21 22:46:04 +00002591
2592 // ARM targets default to using the ARM C++ ABI.
2593 CXXABI = CXXABI_ARM;
Eli Friedman2be46072011-10-14 20:59:01 +00002594
2595 // ARM has atomics up to 8 bytes
2596 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
2597 MaxAtomicPromoteWidth = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00002598 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002599 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00002600 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002601 ABI = Name;
2602
Daniel Dunbara2a41612009-09-14 00:02:24 +00002603 // The defaults (above) are for AAPCS, check if we need to change them.
2604 //
2605 // FIXME: We need support for -meabi... we could just mangle it into the
2606 // name.
2607 if (Name == "apcs-gnu") {
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002608 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002609 SizeType = UnsignedLong;
2610
James Molloya6d81f92011-11-23 13:35:08 +00002611 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
2612 WCharType = SignedInt;
2613
Daniel Dunbar684de632010-04-22 16:14:54 +00002614 // Do not respect the alignment of bit-field types when laying out
2615 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
2616 UseBitFieldTypeAlignment = false;
2617
Chad Rosier61a62212011-08-04 01:21:14 +00002618 /// Do force alignment of members that follow zero length bitfields. If
2619 /// the alignment of the zero-length bitfield is greater than the member
2620 /// that follows it, `bar', `bar' will be aligned as the type of the
2621 /// zero length bitfield.
2622 UseZeroLengthBitfieldAlignment = true;
2623
2624 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosier6e43f3f2011-08-04 17:52:43 +00002625 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
2626 /// gcc.
Chad Rosier61a62212011-08-04 01:21:14 +00002627 ZeroLengthBitfieldBoundary = 32;
2628
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002629 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00002630 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2631 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002632 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 +00002633 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002634 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002635 } else {
2636 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 +00002637 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002638 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002639 }
2640
Chad Rosier9f1210c2011-07-26 07:03:04 +00002641 // FIXME: Override "preferred align" for double and long long.
Daniel Dunbara2a41612009-09-14 00:02:24 +00002642 } else if (Name == "aapcs") {
2643 // FIXME: Enumerated types are variable width in straight AAPCS.
2644 } else if (Name == "aapcs-linux") {
Chad Rosier9f1210c2011-07-26 07:03:04 +00002645 ;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002646 } else
2647 return false;
2648
2649 return true;
2650 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002651
Chandler Carruthc3a2e652011-09-28 05:56:05 +00002652 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002653 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
2654 Features["vfp2"] = true;
2655 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
2656 Features["neon"] = true;
2657 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002658
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002659 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2660 const std::string &Name,
2661 bool Enabled) const {
Evan Chengf972b262011-07-08 06:40:11 +00002662 if (Name == "soft-float" || Name == "soft-float-abi" ||
Evgeniy Stepanov35dd7322012-01-11 11:21:31 +00002663 Name == "vfp2" || Name == "vfp3" || Name == "neon" || Name == "d16") {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002664 Features[Name] = Enabled;
2665 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002666 return false;
2667
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002668 return true;
2669 }
2670
2671 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002672 FPU = NoFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002673 SoftFloat = SoftFloatABI = false;
2674 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2675 if (Features[i] == "+soft-float")
2676 SoftFloat = true;
2677 else if (Features[i] == "+soft-float-abi")
2678 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00002679 else if (Features[i] == "+vfp2")
2680 FPU = VFP2FPU;
2681 else if (Features[i] == "+vfp3")
2682 FPU = VFP3FPU;
2683 else if (Features[i] == "+neon")
2684 FPU = NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002685 }
2686
2687 // Remove front-end specific options which the backend handles differently.
2688 std::vector<std::string>::iterator it;
2689 it = std::find(Features.begin(), Features.end(), "+soft-float");
2690 if (it != Features.end())
2691 Features.erase(it);
2692 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2693 if (it != Features.end())
2694 Features.erase(it);
2695 }
2696
Chris Lattner5f9e2722011-07-23 10:55:15 +00002697 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbareac7c532009-12-18 18:42:37 +00002698 return llvm::StringSwitch<const char*>(Name)
2699 .Cases("arm8", "arm810", "4")
2700 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2701 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2702 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2703 .Case("ep9312", "4T")
2704 .Cases("arm10tdmi", "arm1020t", "5T")
2705 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2706 .Case("arm926ej-s", "5TEJ")
2707 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2708 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002709 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002710 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002711 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002712 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2713 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson06f45632011-01-06 16:57:20 +00002714 .Case("cortex-m3", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00002715 .Case("cortex-m0", "6M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002716 .Default(0);
2717 }
2718 virtual bool setCPU(const std::string &Name) {
2719 if (!getCPUDefineSuffix(Name))
2720 return false;
2721
2722 CPU = Name;
2723 return true;
2724 }
Chris Lattner33328642009-03-20 15:52:06 +00002725 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002726 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00002727 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00002728 Builder.defineMacro("__arm");
2729 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002730
Chris Lattnerc0f59212009-03-02 22:27:17 +00002731 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00002732 Builder.defineMacro("__ARMEL__");
2733 Builder.defineMacro("__LITTLE_ENDIAN__");
2734 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002735
Chris Lattner5f9e2722011-07-23 10:55:15 +00002736 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00002737 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002738
Mike Stump437bb4b2009-04-08 02:07:04 +00002739 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002740
Daniel Dunbareac7c532009-12-18 18:42:37 +00002741 // FIXME: It's more complicated than this and we don't really support
2742 // interworking.
2743 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00002744 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002745
Daniel Dunbareac7c532009-12-18 18:42:37 +00002746 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramera9992772010-01-09 17:55:51 +00002747 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002748
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002749 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00002750 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002751
2752 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00002753 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002754
Bob Wilson84f95cf2011-05-13 18:56:03 +00002755 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002756 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00002757 Builder.defineMacro("__THUMBEL__");
2758 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00002759 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002760 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002761 }
2762
2763 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00002764 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002765
2766 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramera9992772010-01-09 17:55:51 +00002767 Builder.defineMacro("__VFP_FP__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002768
2769 // This only gets set when Neon instructions are actually available, unlike
2770 // the VFP define, hence the soft float and arch check. This is subtly
2771 // different from gcc, we follow the intent which was that it should be set
2772 // when Neon instructions are actually available.
Bob Wilson84f95cf2011-05-13 18:56:03 +00002773 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002774 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00002775 }
2776 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2777 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00002778 Records = BuiltinInfo;
2779 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00002780 }
2781 virtual const char *getVAListDeclaration() const {
John McCall0e9972c2011-05-09 02:19:37 +00002782 return "typedef void* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +00002783 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002784 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002785 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002786 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002787 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002788 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002789 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002790 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002791 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00002792 default:
Nate Begemanad487f42008-04-22 05:03:19 +00002793 case 'l': // r0-r7
2794 case 'h': // r8-r15
2795 case 'w': // VFP Floating point register single precision
2796 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00002797 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00002798 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00002799 case 'Q': // A memory address that is a single base register.
2800 Info.setAllowsMemory();
2801 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00002802 case 'U': // a memory reference...
2803 switch (Name[1]) {
2804 case 'q': // ...ARMV4 ldrsb
2805 case 'v': // ...VFP load/store (reg+constant offset)
2806 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00002807 case 't': // address valid for load/store opaque types wider
2808 // than 128-bits
2809 case 'n': // valid address for Neon doubleword vector load/store
2810 case 'm': // valid address for Neon element and structure load/store
2811 case 's': // valid address for non-offset loads/stores of quad-word
2812 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00002813 Info.setAllowsMemory();
2814 Name++;
2815 return true;
2816 }
Nate Begemanad487f42008-04-22 05:03:19 +00002817 }
Chris Lattner393ff042008-04-21 18:56:49 +00002818 return false;
2819 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00002820 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00002821 std::string R;
2822 switch (*Constraint) {
2823 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00002824 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00002825 Constraint++;
2826 break;
Eric Christopher283f4472011-06-17 00:40:18 +00002827 case 'p': // 'p' should be translated to 'r' by default.
2828 R = std::string("r");
2829 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00002830 default:
2831 return std::string(1, *Constraint);
2832 }
2833 return R;
2834 }
Chris Lattner393ff042008-04-21 18:56:49 +00002835 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002836 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00002837 return "";
2838 }
2839};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002840
2841const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002842 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002843 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002844 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2845
2846 // Float registers
2847 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2848 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2849 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002850 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002851
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002852 // Double registers
2853 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2854 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00002855 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2856 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002857
2858 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00002859 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2860 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002861};
2862
2863void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002864 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002865 Names = GCCRegNames;
2866 NumNames = llvm::array_lengthof(GCCRegNames);
2867}
2868
2869const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002870 { { "a1" }, "r0" },
2871 { { "a2" }, "r1" },
2872 { { "a3" }, "r2" },
2873 { { "a4" }, "r3" },
2874 { { "v1" }, "r4" },
2875 { { "v2" }, "r5" },
2876 { { "v3" }, "r6" },
2877 { { "v4" }, "r7" },
2878 { { "v5" }, "r8" },
2879 { { "v6", "rfp" }, "r9" },
2880 { { "sl" }, "r10" },
2881 { { "fp" }, "r11" },
2882 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002883 { { "r13" }, "sp" },
2884 { { "r14" }, "lr" },
2885 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002886 // The S, D and Q registers overlap, but aren't really aliases; we
2887 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002888};
2889
2890void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2891 unsigned &NumAliases) const {
2892 Aliases = GCCRegAliases;
2893 NumAliases = llvm::array_lengthof(GCCRegAliases);
2894}
Chris Lattner2752c012010-03-03 19:03:45 +00002895
2896const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00002897#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00002898#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00002899 ALL_LANGUAGES },
Chris Lattner2752c012010-03-03 19:03:45 +00002900#include "clang/Basic/BuiltinsARM.def"
2901};
Chris Lattner393ff042008-04-21 18:56:49 +00002902} // end anonymous namespace.
2903
Eli Friedmana9f54962008-08-20 07:44:10 +00002904namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00002905class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002906 public DarwinTargetInfo<ARMTargetInfo> {
2907protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00002908 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00002909 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00002910 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00002911 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002912
Torok Edwin5f6c1942009-06-30 17:10:35 +00002913public:
Mike Stump1eb44332009-09-09 15:08:12 +00002914 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002915 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2916 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00002917 // iOS always has 64-bit atomic instructions.
2918 // FIXME: This should be based off of the target features in ARMTargetInfo.
2919 MaxAtomicInlineWidth = 64;
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002920 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002921};
2922} // end anonymous namespace.
2923
Tony Linthicum96319392011-12-12 21:14:55 +00002924
2925namespace {
2926// Hexagon abstract base class
2927class HexagonTargetInfo : public TargetInfo {
2928 static const Builtin::Info BuiltinInfo[];
2929 static const char * const GCCRegNames[];
2930 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2931 std::string CPU;
2932public:
2933 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00002934 BigEndian = false;
Tony Linthicum96319392011-12-12 21:14:55 +00002935 DescriptionString = ("e-p:32:32:32-"
2936 "i64:64:64-i32:32:32-"
2937 "i16:16:16-i1:32:32-a:0:0");
2938
2939 // {} in inline assembly are packet specifiers, not assembly variant
2940 // specifiers.
2941 NoAsmVariants = true;
2942 }
2943
2944 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2945 unsigned &NumRecords) const {
2946 Records = BuiltinInfo;
2947 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
2948 }
2949
2950 virtual bool validateAsmConstraint(const char *&Name,
2951 TargetInfo::ConstraintInfo &Info) const {
2952 return true;
2953 }
2954
2955 virtual void getTargetDefines(const LangOptions &Opts,
2956 MacroBuilder &Builder) const;
2957
2958 virtual const char *getVAListDeclaration() const {
2959 return "typedef char* __builtin_va_list;";
2960 }
2961 virtual void getGCCRegNames(const char * const *&Names,
2962 unsigned &NumNames) const;
2963 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2964 unsigned &NumAliases) const;
2965 virtual const char *getClobbers() const {
2966 return "";
2967 }
Sebastian Pop43115d42012-01-13 20:37:10 +00002968
2969 static const char *getHexagonCPUSuffix(StringRef Name) {
2970 return llvm::StringSwitch<const char*>(Name)
2971 .Case("hexagonv2", "2")
2972 .Case("hexagonv3", "3")
2973 .Case("hexagonv4", "4")
2974 .Default(0);
2975 }
2976
Tony Linthicum96319392011-12-12 21:14:55 +00002977 virtual bool setCPU(const std::string &Name) {
Sebastian Pop43115d42012-01-13 20:37:10 +00002978 if (!getHexagonCPUSuffix(Name))
2979 return false;
2980
Tony Linthicum96319392011-12-12 21:14:55 +00002981 CPU = Name;
2982 return true;
2983 }
2984};
2985
2986void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
2987 MacroBuilder &Builder) const {
2988 Builder.defineMacro("qdsp6");
2989 Builder.defineMacro("__qdsp6", "1");
2990 Builder.defineMacro("__qdsp6__", "1");
2991
2992 Builder.defineMacro("hexagon");
2993 Builder.defineMacro("__hexagon", "1");
2994 Builder.defineMacro("__hexagon__", "1");
2995
2996 if(CPU == "hexagonv1") {
2997 Builder.defineMacro("__HEXAGON_V1__");
2998 Builder.defineMacro("__HEXAGON_ARCH__", "1");
2999 if(Opts.HexagonQdsp6Compat) {
3000 Builder.defineMacro("__QDSP6_V1__");
3001 Builder.defineMacro("__QDSP6_ARCH__", "1");
3002 }
3003 }
3004 else if(CPU == "hexagonv2") {
3005 Builder.defineMacro("__HEXAGON_V2__");
3006 Builder.defineMacro("__HEXAGON_ARCH__", "2");
3007 if(Opts.HexagonQdsp6Compat) {
3008 Builder.defineMacro("__QDSP6_V2__");
3009 Builder.defineMacro("__QDSP6_ARCH__", "2");
3010 }
3011 }
3012 else if(CPU == "hexagonv3") {
3013 Builder.defineMacro("__HEXAGON_V3__");
3014 Builder.defineMacro("__HEXAGON_ARCH__", "3");
3015 if(Opts.HexagonQdsp6Compat) {
3016 Builder.defineMacro("__QDSP6_V3__");
3017 Builder.defineMacro("__QDSP6_ARCH__", "3");
3018 }
3019 }
3020 else if(CPU == "hexagonv4") {
3021 Builder.defineMacro("__HEXAGON_V4__");
3022 Builder.defineMacro("__HEXAGON_ARCH__", "4");
3023 if(Opts.HexagonQdsp6Compat) {
3024 Builder.defineMacro("__QDSP6_V4__");
3025 Builder.defineMacro("__QDSP6_ARCH__", "4");
3026 }
3027 }
3028}
3029
3030const char * const HexagonTargetInfo::GCCRegNames[] = {
3031 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3032 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3033 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3034 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3035 "p0", "p1", "p2", "p3",
3036 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
3037};
3038
3039void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
3040 unsigned &NumNames) const {
3041 Names = GCCRegNames;
3042 NumNames = llvm::array_lengthof(GCCRegNames);
3043}
3044
3045
3046const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
3047 { { "sp" }, "r29" },
3048 { { "fp" }, "r30" },
3049 { { "lr" }, "r31" },
3050 };
3051
3052void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3053 unsigned &NumAliases) const {
3054 Aliases = GCCRegAliases;
3055 NumAliases = llvm::array_lengthof(GCCRegAliases);
3056}
3057
3058
3059const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
3060#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3061#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3062 ALL_LANGUAGES },
3063#include "clang/Basic/BuiltinsHexagon.def"
3064};
3065}
3066
3067
Reid Spencer5f016e22007-07-11 17:01:13 +00003068namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00003069class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00003070 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3071 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003072 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00003073public:
Eli Friedman01b86682008-08-20 07:28:14 +00003074 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
3075 // FIXME: Support Sparc quad-precision long double?
Eli Friedmane6a24e82011-12-22 03:51:45 +00003076 BigEndian = false;
Eli Friedmaned855cb2008-08-21 00:13:15 +00003077 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 +00003078 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00003079 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003080 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3081 const std::string &Name,
3082 bool Enabled) const {
3083 if (Name == "soft-float")
3084 Features[Name] = Enabled;
3085 else
3086 return false;
3087
3088 return true;
3089 }
3090 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3091 SoftFloat = false;
3092 for (unsigned i = 0, e = Features.size(); i != e; ++i)
3093 if (Features[i] == "+soft-float")
3094 SoftFloat = true;
3095 }
Chris Lattner33328642009-03-20 15:52:06 +00003096 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003097 MacroBuilder &Builder) const {
3098 DefineStd(Builder, "sparc", Opts);
3099 Builder.defineMacro("__sparcv8");
3100 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003101
3102 if (SoftFloat)
3103 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00003104 }
3105 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3106 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00003107 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00003108 }
3109 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00003110 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00003111 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003112 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00003113 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003114 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00003115 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003116 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00003117 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00003118 // FIXME: Implement!
3119 return false;
Gabor Greif26658672008-02-21 16:29:08 +00003120 }
3121 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00003122 // FIXME: Implement!
3123 return "";
Gabor Greif26658672008-02-21 16:29:08 +00003124 }
3125};
3126
Chris Lattnere957f532009-01-27 01:58:38 +00003127const char * const SparcV8TargetInfo::GCCRegNames[] = {
3128 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3129 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3130 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3131 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
3132};
3133
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003134void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00003135 unsigned &NumNames) const {
3136 Names = GCCRegNames;
3137 NumNames = llvm::array_lengthof(GCCRegNames);
3138}
3139
3140const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003141 { { "g0" }, "r0" },
3142 { { "g1" }, "r1" },
3143 { { "g2" }, "r2" },
3144 { { "g3" }, "r3" },
3145 { { "g4" }, "r4" },
3146 { { "g5" }, "r5" },
3147 { { "g6" }, "r6" },
3148 { { "g7" }, "r7" },
3149 { { "o0" }, "r8" },
3150 { { "o1" }, "r9" },
3151 { { "o2" }, "r10" },
3152 { { "o3" }, "r11" },
3153 { { "o4" }, "r12" },
3154 { { "o5" }, "r13" },
3155 { { "o6", "sp" }, "r14" },
3156 { { "o7" }, "r15" },
3157 { { "l0" }, "r16" },
3158 { { "l1" }, "r17" },
3159 { { "l2" }, "r18" },
3160 { { "l3" }, "r19" },
3161 { { "l4" }, "r20" },
3162 { { "l5" }, "r21" },
3163 { { "l6" }, "r22" },
3164 { { "l7" }, "r23" },
3165 { { "i0" }, "r24" },
3166 { { "i1" }, "r25" },
3167 { { "i2" }, "r26" },
3168 { { "i3" }, "r27" },
3169 { { "i4" }, "r28" },
3170 { { "i5" }, "r29" },
3171 { { "i6", "fp" }, "r30" },
3172 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00003173};
3174
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003175void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00003176 unsigned &NumAliases) const {
3177 Aliases = GCCRegAliases;
3178 NumAliases = llvm::array_lengthof(GCCRegAliases);
3179}
Gabor Greif26658672008-02-21 16:29:08 +00003180} // end anonymous namespace.
3181
Eli Friedman01b86682008-08-20 07:28:14 +00003182namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003183class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
3184public:
3185 AuroraUXSparcV8TargetInfo(const std::string& triple) :
3186 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
3187 SizeType = UnsignedInt;
3188 PtrDiffType = SignedInt;
3189 }
3190};
Torok Edwin5f6c1942009-06-30 17:10:35 +00003191class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00003192public:
3193 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00003194 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00003195 SizeType = UnsignedInt;
3196 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00003197 }
3198};
3199} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00003200
Chris Lattner2621fd12008-05-08 05:58:21 +00003201namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003202 class MSP430TargetInfo : public TargetInfo {
3203 static const char * const GCCRegNames[];
3204 public:
3205 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003206 BigEndian = false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003207 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00003208 IntWidth = 16; IntAlign = 16;
3209 LongWidth = 32; LongLongWidth = 64;
3210 LongAlign = LongLongAlign = 16;
3211 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003212 SuitableAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003213 SizeType = UnsignedInt;
3214 IntMaxType = SignedLong;
3215 UIntMaxType = UnsignedLong;
3216 IntPtrType = SignedShort;
3217 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00003218 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00003219 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003220 }
3221 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003222 MacroBuilder &Builder) const {
3223 Builder.defineMacro("MSP430");
3224 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003225 // FIXME: defines for different 'flavours' of MCU
3226 }
3227 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3228 unsigned &NumRecords) const {
3229 // FIXME: Implement.
3230 Records = 0;
3231 NumRecords = 0;
3232 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003233 virtual void getGCCRegNames(const char * const *&Names,
3234 unsigned &NumNames) const;
3235 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3236 unsigned &NumAliases) const {
3237 // No aliases.
3238 Aliases = 0;
3239 NumAliases = 0;
3240 }
3241 virtual bool validateAsmConstraint(const char *&Name,
3242 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00003243 // No target constraints for now.
3244 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003245 }
3246 virtual const char *getClobbers() const {
3247 // FIXME: Is this really right?
3248 return "";
3249 }
3250 virtual const char *getVAListDeclaration() const {
3251 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00003252 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003253 }
3254 };
3255
3256 const char * const MSP430TargetInfo::GCCRegNames[] = {
3257 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3258 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3259 };
3260
3261 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
3262 unsigned &NumNames) const {
3263 Names = GCCRegNames;
3264 NumNames = llvm::array_lengthof(GCCRegNames);
3265 }
3266}
3267
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00003268namespace {
Eli Friedmanb63decf2009-08-19 20:47:07 +00003269
Mike Stump1eb44332009-09-09 15:08:12 +00003270 // LLVM and Clang cannot be used directly to output native binaries for
3271 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00003272 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00003273 //
3274 // TCE uses the llvm bitcode as input and uses it for generating customized
3275 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00003276 // publicly available in http://tce.cs.tut.fi
3277
Eli Friedman209f5bb2011-10-07 19:51:42 +00003278 static const unsigned TCEOpenCLAddrSpaceMap[] = {
3279 3, // opencl_global
3280 4, // opencl_local
3281 5 // opencl_constant
3282 };
3283
Eli Friedmanb63decf2009-08-19 20:47:07 +00003284 class TCETargetInfo : public TargetInfo{
3285 public:
3286 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
3287 TLSSupported = false;
3288 IntWidth = 32;
3289 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003290 PointerWidth = 32;
3291 IntAlign = 32;
3292 LongAlign = LongLongAlign = 32;
3293 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003294 SuitableAlign = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003295 SizeType = UnsignedInt;
3296 IntMaxType = SignedLong;
3297 UIntMaxType = UnsignedLong;
3298 IntPtrType = SignedInt;
3299 PtrDiffType = SignedInt;
3300 FloatWidth = 32;
3301 FloatAlign = 32;
3302 DoubleWidth = 32;
3303 DoubleAlign = 32;
3304 LongDoubleWidth = 32;
3305 LongDoubleAlign = 32;
3306 FloatFormat = &llvm::APFloat::IEEEsingle;
3307 DoubleFormat = &llvm::APFloat::IEEEsingle;
3308 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00003309 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
3310 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00003311 "f32:32:32-f64:32:32-v64:32:32-"
3312 "v128:32:32-a0:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00003313 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003314 }
3315
3316 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003317 MacroBuilder &Builder) const {
3318 DefineStd(Builder, "tce", Opts);
3319 Builder.defineMacro("__TCE__");
3320 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00003321 }
3322 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3323 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00003324 virtual const char *getClobbers() const {
3325 return "";
3326 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00003327 virtual const char *getVAListDeclaration() const {
3328 return "typedef void* __builtin_va_list;";
3329 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00003330 virtual void getGCCRegNames(const char * const *&Names,
3331 unsigned &NumNames) const {}
3332 virtual bool validateAsmConstraint(const char *&Name,
3333 TargetInfo::ConstraintInfo &info) const {
3334 return true;
3335 }
3336 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3337 unsigned &NumAliases) const {}
3338 };
3339}
3340
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003341namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003342class MipsTargetInfoBase : public TargetInfo {
3343 std::string CPU;
3344protected:
3345 std::string ABI;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003346public:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003347 MipsTargetInfoBase(const std::string& triple, const std::string& ABIStr)
Akira Hatanaka148735e2011-11-05 01:48:34 +00003348 : TargetInfo(triple), ABI(ABIStr) {}
Eric Christophered734732010-03-02 02:41:08 +00003349 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003350 virtual bool setABI(const std::string &Name) = 0;
Eric Christophered734732010-03-02 02:41:08 +00003351 virtual bool setCPU(const std::string &Name) {
3352 CPU = Name;
3353 return true;
3354 }
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003355 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christophered734732010-03-02 02:41:08 +00003356 Features[ABI] = true;
3357 Features[CPU] = true;
3358 }
3359 virtual void getArchDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003360 MacroBuilder &Builder) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003361 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003362 MacroBuilder &Builder) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003363 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3364 unsigned &NumRecords) const {
3365 // FIXME: Implement!
3366 }
3367 virtual const char *getVAListDeclaration() const {
3368 return "typedef void* __builtin_va_list;";
3369 }
3370 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003371 unsigned &NumNames) const {
3372 static const char * const GCCRegNames[] = {
3373 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
3374 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
3375 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
3376 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
3377 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
3378 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
3379 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
3380 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
3381 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
3382 "$fcc5","$fcc6","$fcc7"
3383 };
3384 Names = GCCRegNames;
3385 NumNames = llvm::array_lengthof(GCCRegNames);
3386 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003387 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003388 unsigned &NumAliases) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003389 virtual bool validateAsmConstraint(const char *&Name,
3390 TargetInfo::ConstraintInfo &Info) const {
3391 switch (*Name) {
3392 default:
Douglas Gregor21a25162011-11-02 20:52:01 +00003393 return false;
3394
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003395 case 'r': // CPU registers.
3396 case 'd': // Equivalent to "r" unless generating MIPS16 code.
3397 case 'y': // Equivalent to "r", backwards compatibility only.
3398 case 'f': // floating-point registers.
3399 Info.setAllowsRegister();
3400 return true;
3401 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003402 }
3403
3404 virtual const char *getClobbers() const {
3405 // FIXME: Implement!
3406 return "";
3407 }
3408};
3409
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003410class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003411public:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003412 Mips32TargetInfoBase(const std::string& triple) :
Akira Hatanaka148735e2011-11-05 01:48:34 +00003413 MipsTargetInfoBase(triple, "o32") {
3414 SizeType = UnsignedInt;
3415 PtrDiffType = SignedInt;
3416 }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003417 virtual bool setABI(const std::string &Name) {
3418 if ((Name == "o32") || (Name == "eabi")) {
3419 ABI = Name;
3420 return true;
3421 } else
3422 return false;
3423 }
3424 virtual void getArchDefines(const LangOptions &Opts,
3425 MacroBuilder &Builder) const {
Douglas Gregorc9a23712011-11-09 15:17:16 +00003426 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
3427 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
3428 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
3429
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003430 if (ABI == "o32") {
3431 Builder.defineMacro("__mips_o32");
3432 Builder.defineMacro("_ABIO32", "1");
3433 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
3434 }
3435 else if (ABI == "eabi")
3436 Builder.defineMacro("__mips_eabi");
3437 else
David Blaikieb219cfc2011-09-23 05:06:16 +00003438 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003439 }
3440 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3441 unsigned &NumAliases) const {
3442 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3443 { { "at" }, "$1" },
3444 { { "v0" }, "$2" },
3445 { { "v1" }, "$3" },
3446 { { "a0" }, "$4" },
3447 { { "a1" }, "$5" },
3448 { { "a2" }, "$6" },
3449 { { "a3" }, "$7" },
3450 { { "t0" }, "$8" },
3451 { { "t1" }, "$9" },
3452 { { "t2" }, "$10" },
3453 { { "t3" }, "$11" },
3454 { { "t4" }, "$12" },
3455 { { "t5" }, "$13" },
3456 { { "t6" }, "$14" },
3457 { { "t7" }, "$15" },
3458 { { "s0" }, "$16" },
3459 { { "s1" }, "$17" },
3460 { { "s2" }, "$18" },
3461 { { "s3" }, "$19" },
3462 { { "s4" }, "$20" },
3463 { { "s5" }, "$21" },
3464 { { "s6" }, "$22" },
3465 { { "s7" }, "$23" },
3466 { { "t8" }, "$24" },
3467 { { "t9" }, "$25" },
3468 { { "k0" }, "$26" },
3469 { { "k1" }, "$27" },
3470 { { "gp" }, "$28" },
3471 { { "sp" }, "$29" },
3472 { { "fp" }, "$30" },
3473 { { "ra" }, "$31" }
3474 };
3475 Aliases = GCCRegAliases;
3476 NumAliases = llvm::array_lengthof(GCCRegAliases);
3477 }
3478};
3479
3480class Mips32EBTargetInfo : public Mips32TargetInfoBase {
3481public:
3482 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3483 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3484 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3485 }
3486 virtual void getTargetDefines(const LangOptions &Opts,
3487 MacroBuilder &Builder) const {
3488 DefineStd(Builder, "mips", Opts);
3489 Builder.defineMacro("_mips");
3490 DefineStd(Builder, "MIPSEB", Opts);
3491 Builder.defineMacro("_MIPSEB");
3492 Builder.defineMacro("__REGISTER_PREFIX__", "");
3493 getArchDefines(Opts, Builder);
3494 }
3495};
3496
3497class Mips32ELTargetInfo : public Mips32TargetInfoBase {
3498public:
3499 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003500 BigEndian = false;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003501 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 +00003502 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003503 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003504 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003505 MacroBuilder &Builder) const {
3506 DefineStd(Builder, "mips", Opts);
3507 Builder.defineMacro("_mips");
3508 DefineStd(Builder, "MIPSEL", Opts);
3509 Builder.defineMacro("_MIPSEL");
3510 Builder.defineMacro("__REGISTER_PREFIX__", "");
3511 getArchDefines(Opts, Builder);
3512 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003513};
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003514
3515class Mips64TargetInfoBase : public MipsTargetInfoBase {
3516 virtual void SetDescriptionString(const std::string &Name) = 0;
3517public:
3518 Mips64TargetInfoBase(const std::string& triple) :
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003519 MipsTargetInfoBase(triple, "n64") {
3520 LongWidth = LongAlign = 64;
3521 PointerWidth = PointerAlign = 64;
3522 LongDoubleWidth = LongDoubleAlign = 128;
3523 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003524 SuitableAlign = 128;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003525 }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003526 virtual bool setABI(const std::string &Name) {
3527 SetDescriptionString(Name);
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003528
3529 if (Name != "n32" && Name != "n64")
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003530 return false;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003531
3532 ABI = Name;
3533
3534 if (Name == "n32") {
3535 LongWidth = LongAlign = 32;
3536 PointerWidth = PointerAlign = 32;
3537 }
3538
3539 return true;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003540 }
3541 virtual void getArchDefines(const LangOptions &Opts,
3542 MacroBuilder &Builder) const {
3543 if (ABI == "n32") {
3544 Builder.defineMacro("__mips_n32");
3545 Builder.defineMacro("_ABIN32", "2");
3546 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
3547 }
3548 else if (ABI == "n64") {
3549 Builder.defineMacro("__mips_n64");
3550 Builder.defineMacro("_ABI64", "3");
3551 Builder.defineMacro("_MIPS_SIM", "_ABI64");
3552 }
3553 else
David Blaikieb219cfc2011-09-23 05:06:16 +00003554 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003555 }
3556 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3557 unsigned &NumAliases) const {
3558 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3559 { { "at" }, "$1" },
3560 { { "v0" }, "$2" },
3561 { { "v1" }, "$3" },
3562 { { "a0" }, "$4" },
3563 { { "a1" }, "$5" },
3564 { { "a2" }, "$6" },
3565 { { "a3" }, "$7" },
3566 { { "a4" }, "$8" },
3567 { { "a5" }, "$9" },
3568 { { "a6" }, "$10" },
3569 { { "a7" }, "$11" },
3570 { { "t0" }, "$12" },
3571 { { "t1" }, "$13" },
3572 { { "t2" }, "$14" },
3573 { { "t3" }, "$15" },
3574 { { "s0" }, "$16" },
3575 { { "s1" }, "$17" },
3576 { { "s2" }, "$18" },
3577 { { "s3" }, "$19" },
3578 { { "s4" }, "$20" },
3579 { { "s5" }, "$21" },
3580 { { "s6" }, "$22" },
3581 { { "s7" }, "$23" },
3582 { { "t8" }, "$24" },
3583 { { "t9" }, "$25" },
3584 { { "k0" }, "$26" },
3585 { { "k1" }, "$27" },
3586 { { "gp" }, "$28" },
3587 { { "sp" }, "$29" },
3588 { { "fp" }, "$30" },
3589 { { "ra" }, "$31" }
3590 };
3591 Aliases = GCCRegAliases;
3592 NumAliases = llvm::array_lengthof(GCCRegAliases);
3593 }
3594};
3595
3596class Mips64EBTargetInfo : public Mips64TargetInfoBase {
3597 virtual void SetDescriptionString(const std::string &Name) {
3598 // Change DescriptionString only if ABI is n32.
3599 if (Name == "n32")
3600 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 +00003601 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3602 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003603 }
3604public:
3605 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
3606 // Default ABI is n64.
3607 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 +00003608 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3609 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003610 }
3611 virtual void getTargetDefines(const LangOptions &Opts,
3612 MacroBuilder &Builder) const {
3613 DefineStd(Builder, "mips", Opts);
3614 Builder.defineMacro("_mips");
3615 DefineStd(Builder, "MIPSEB", Opts);
3616 Builder.defineMacro("_MIPSEB");
3617 Builder.defineMacro("__REGISTER_PREFIX__", "");
3618 getArchDefines(Opts, Builder);
3619 }
3620};
3621
3622class Mips64ELTargetInfo : public Mips64TargetInfoBase {
3623 virtual void SetDescriptionString(const std::string &Name) {
3624 // Change DescriptionString only if ABI is n32.
3625 if (Name == "n32")
3626 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 +00003627 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
3628 "-v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003629 }
3630public:
3631 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003632 // Default ABI is n64.
3633 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003634 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 +00003635 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3636 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003637 }
3638 virtual void getTargetDefines(const LangOptions &Opts,
3639 MacroBuilder &Builder) const {
3640 DefineStd(Builder, "mips", Opts);
3641 Builder.defineMacro("_mips");
3642 DefineStd(Builder, "MIPSEL", Opts);
3643 Builder.defineMacro("_MIPSEL");
3644 Builder.defineMacro("__REGISTER_PREFIX__", "");
3645 getArchDefines(Opts, Builder);
3646 }
3647};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003648} // end anonymous namespace.
3649
Ivan Krasinef05abd2011-08-24 20:22:22 +00003650namespace {
3651class PNaClTargetInfo : public TargetInfo {
3652public:
3653 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003654 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00003655 this->UserLabelPrefix = "";
3656 this->LongAlign = 32;
3657 this->LongWidth = 32;
3658 this->PointerAlign = 32;
3659 this->PointerWidth = 32;
3660 this->IntMaxType = TargetInfo::SignedLongLong;
3661 this->UIntMaxType = TargetInfo::UnsignedLongLong;
3662 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00003663 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00003664 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00003665 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00003666 this->SizeType = TargetInfo::UnsignedInt;
3667 this->PtrDiffType = TargetInfo::SignedInt;
3668 this->IntPtrType = TargetInfo::SignedInt;
David Meyerdd4a8892011-10-11 03:12:01 +00003669 this->RegParmMax = 2;
Ivan Krasinef05abd2011-08-24 20:22:22 +00003670 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
3671 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
3672 }
3673
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003674 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00003675 }
3676 virtual void getArchDefines(const LangOptions &Opts,
3677 MacroBuilder &Builder) const {
3678 Builder.defineMacro("__le32__");
3679 Builder.defineMacro("__pnacl__");
3680 }
3681 virtual void getTargetDefines(const LangOptions &Opts,
3682 MacroBuilder &Builder) const {
Ivan Krasin089ee112011-08-25 23:49:20 +00003683 DefineStd(Builder, "unix", Opts);
3684 Builder.defineMacro("__ELF__");
3685 if (Opts.POSIXThreads)
3686 Builder.defineMacro("_REENTRANT");
3687 if (Opts.CPlusPlus)
3688 Builder.defineMacro("_GNU_SOURCE");
3689
Ivan Krasinef05abd2011-08-24 20:22:22 +00003690 Builder.defineMacro("__native_client__");
3691 getArchDefines(Opts, Builder);
3692 }
3693 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3694 unsigned &NumRecords) const {
3695 }
3696 virtual const char *getVAListDeclaration() const {
Ivan Krasin68018db2011-09-20 14:56:54 +00003697 return "typedef int __builtin_va_list[4];";
Ivan Krasinef05abd2011-08-24 20:22:22 +00003698 }
3699 virtual void getGCCRegNames(const char * const *&Names,
3700 unsigned &NumNames) const;
3701 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3702 unsigned &NumAliases) const;
3703 virtual bool validateAsmConstraint(const char *&Name,
3704 TargetInfo::ConstraintInfo &Info) const {
3705 return false;
3706 }
3707
3708 virtual const char *getClobbers() const {
3709 return "";
3710 }
3711};
3712
3713void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
3714 unsigned &NumNames) const {
3715 Names = NULL;
3716 NumNames = 0;
3717}
3718
3719void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3720 unsigned &NumAliases) const {
3721 Aliases = NULL;
3722 NumAliases = 0;
3723}
3724} // end anonymous namespace.
3725
3726
Reid Spencer5f016e22007-07-11 17:01:13 +00003727//===----------------------------------------------------------------------===//
3728// Driver code
3729//===----------------------------------------------------------------------===//
3730
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003731static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003732 llvm::Triple Triple(T);
3733 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00003734
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003735 switch (Triple.getArch()) {
3736 default:
3737 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00003738
Tony Linthicum96319392011-12-12 21:14:55 +00003739 case llvm::Triple::hexagon:
3740 return new HexagonTargetInfo(T);
3741
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003742 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00003743 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003744 if (Triple.isOSDarwin())
3745 return new DarwinARMTargetInfo(T);
3746
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003747 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00003748 case llvm::Triple::Linux:
3749 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003750 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00003751 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003752 case llvm::Triple::NetBSD:
3753 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Douglas Gregordca52262011-07-01 22:41:14 +00003754 case llvm::Triple::RTEMS:
3755 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003756 default:
3757 return new ARMTargetInfo(T);
3758 }
Eli Friedman61538a72008-05-20 14:21:01 +00003759
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003760 case llvm::Triple::msp430:
3761 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00003762
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003763 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003764 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003765 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003766 return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003767 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003768 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003769 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003770 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003771 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003772 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003773 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003774 return new Mips32EBTargetInfo(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003775 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003776
3777 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003778 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003779 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003780 return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003781 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003782 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003783 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003784 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003785 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003786 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003787 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003788 return new Mips32ELTargetInfo(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003789 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003790
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003791 case llvm::Triple::mips64:
3792 switch (os) {
3793 case llvm::Triple::Linux:
3794 return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
3795 case llvm::Triple::RTEMS:
3796 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
3797 case llvm::Triple::FreeBSD:
3798 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
3799 case llvm::Triple::NetBSD:
3800 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
3801 default:
3802 return new Mips64EBTargetInfo(T);
3803 }
3804
3805 case llvm::Triple::mips64el:
3806 switch (os) {
3807 case llvm::Triple::Linux:
3808 return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
3809 case llvm::Triple::RTEMS:
3810 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
3811 case llvm::Triple::FreeBSD:
3812 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
3813 case llvm::Triple::NetBSD:
3814 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
3815 default:
3816 return new Mips64ELTargetInfo(T);
3817 }
3818
Ivan Krasinef05abd2011-08-24 20:22:22 +00003819 case llvm::Triple::le32:
3820 switch (os) {
3821 case llvm::Triple::NativeClient:
3822 return new PNaClTargetInfo(T);
3823 default:
3824 return NULL;
3825 }
3826
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003827 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003828 if (Triple.isOSDarwin())
Roman Divackyc81f2a22011-01-06 08:27:10 +00003829 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003830 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003831 case llvm::Triple::Linux:
3832 return new LinuxTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003833 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00003834 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003835 case llvm::Triple::NetBSD:
3836 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
3837 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00003838 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003839 default:
3840 return new PPC32TargetInfo(T);
3841 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003842
3843 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003844 if (Triple.isOSDarwin())
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00003845 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003846 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003847 case llvm::Triple::Linux:
3848 return new LinuxTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003849 case llvm::Triple::Lv2:
John Thompson3f6918a2009-11-19 17:18:50 +00003850 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003851 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00003852 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003853 case llvm::Triple::NetBSD:
3854 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
3855 default:
3856 return new PPC64TargetInfo(T);
3857 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003858
Justin Holewinski285dc652011-04-20 19:34:15 +00003859 case llvm::Triple::ptx32:
3860 return new PTX32TargetInfo(T);
3861 case llvm::Triple::ptx64:
3862 return new PTX64TargetInfo(T);
3863
Chris Lattner9cbeb632010-03-06 21:21:27 +00003864 case llvm::Triple::mblaze:
3865 return new MBlazeTargetInfo(T);
3866
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003867 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003868 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003869 case llvm::Triple::Linux:
3870 return new LinuxTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003871 case llvm::Triple::AuroraUX:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003872 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003873 case llvm::Triple::Solaris:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003874 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003875 case llvm::Triple::NetBSD:
3876 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
3877 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00003878 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003879 default:
3880 return new SparcV8TargetInfo(T);
3881 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003882
John Thompson3f6918a2009-11-19 17:18:50 +00003883 // FIXME: Need a real SPU target.
3884 case llvm::Triple::cellspu:
3885 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
3886
Eli Friedmanb63decf2009-08-19 20:47:07 +00003887 case llvm::Triple::tce:
3888 return new TCETargetInfo(T);
3889
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003890 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003891 if (Triple.isOSDarwin())
3892 return new DarwinI386TargetInfo(T);
3893
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003894 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003895 case llvm::Triple::AuroraUX:
3896 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003897 case llvm::Triple::Linux:
3898 return new LinuxTargetInfo<X86_32TargetInfo>(T);
3899 case llvm::Triple::DragonFly:
3900 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
3901 case llvm::Triple::NetBSD:
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003902 return new NetBSDI386TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003903 case llvm::Triple::OpenBSD:
3904 return new OpenBSDI386TargetInfo(T);
3905 case llvm::Triple::FreeBSD:
3906 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00003907 case llvm::Triple::Minix:
3908 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003909 case llvm::Triple::Solaris:
3910 return new SolarisTargetInfo<X86_32TargetInfo>(T);
3911 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003912 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003913 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003914 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003915 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00003916 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00003917 case llvm::Triple::Haiku:
3918 return new HaikuX86_32TargetInfo(T);
Douglas Gregordca52262011-07-01 22:41:14 +00003919 case llvm::Triple::RTEMS:
3920 return new RTEMSX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003921 default:
3922 return new X86_32TargetInfo(T);
3923 }
3924
3925 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003926 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
3927 return new DarwinX86_64TargetInfo(T);
3928
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003929 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003930 case llvm::Triple::AuroraUX:
3931 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003932 case llvm::Triple::Linux:
3933 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00003934 case llvm::Triple::DragonFly:
3935 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003936 case llvm::Triple::NetBSD:
3937 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
3938 case llvm::Triple::OpenBSD:
3939 return new OpenBSDX86_64TargetInfo(T);
3940 case llvm::Triple::FreeBSD:
3941 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
3942 case llvm::Triple::Solaris:
3943 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00003944 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003945 return new MinGWX86_64TargetInfo(T);
3946 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003947 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003948 default:
3949 return new X86_64TargetInfo(T);
3950 }
3951 }
Reid Spencer5f016e22007-07-11 17:01:13 +00003952}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003953
3954/// CreateTargetInfo - Return the target info object for the specified target
3955/// triple.
David Blaikied6471f72011-09-25 23:23:43 +00003956TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00003957 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003958 llvm::Triple Triple(Opts.Triple);
3959
3960 // Construct the target
3961 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
3962 if (!Target) {
3963 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
3964 return 0;
3965 }
3966
Daniel Dunbareac7c532009-12-18 18:42:37 +00003967 // Set the target CPU if specified.
3968 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
3969 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
3970 return 0;
3971 }
3972
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003973 // Set the target ABI if specified.
3974 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
3975 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
3976 return 0;
3977 }
3978
Charles Davis98b7c5c2010-06-11 01:06:47 +00003979 // Set the target C++ ABI.
John McCallee79a4c2010-08-21 22:46:04 +00003980 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis98b7c5c2010-06-11 01:06:47 +00003981 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
3982 return 0;
3983 }
3984
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003985 // Compute the default target features, we need the target to handle this
3986 // because features may have dependencies on one another.
3987 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003988 Target->getDefaultFeatures(Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003989
3990 // Apply the user specified deltas.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00003991 // First the enables.
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003992 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
3993 ie = Opts.Features.end(); it != ie; ++it) {
3994 const char *Name = it->c_str();
3995
Rafael Espindola53ac3d82011-11-27 20:00:43 +00003996 if (Name[0] != '+')
3997 continue;
3998
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003999 // Apply the feature via the target.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00004000 if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
4001 Diags.Report(diag::err_target_invalid_feature) << Name;
4002 return 0;
4003 }
4004 }
4005
4006 // Then the disables.
4007 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
4008 ie = Opts.Features.end(); it != ie; ++it) {
4009 const char *Name = it->c_str();
4010
4011 if (Name[0] == '+')
4012 continue;
4013
4014 // Apply the feature via the target.
4015 if (Name[0] != '-' ||
4016 !Target->setFeatureEnabled(Features, Name + 1, false)) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004017 Diags.Report(diag::err_target_invalid_feature) << Name;
4018 return 0;
4019 }
4020 }
4021
4022 // Add the features to the compile options.
4023 //
4024 // FIXME: If we are completely confident that we have the right set, we only
4025 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00004026 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004027 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
4028 ie = Features.end(); it != ie; ++it)
Chris Lattner1e5f83b2011-07-14 18:24:21 +00004029 Opts.Features.push_back(std::string(it->second ? "+" : "-") +
Chris Lattner48b78bd2011-07-14 18:45:41 +00004030 it->first().str());
Daniel Dunbarb93292a2009-12-19 03:30:57 +00004031 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004032
4033 return Target.take();
4034}