blob: 9ba743c31f1263ded92d8cb090fe0e4a7d6a3451 [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?
Nick Lewycky9bddf432011-12-21 04:25:47 +0000891 SuitableAlign = 128;
Roman Divackyc81f2a22011-01-06 08:27:10 +0000892 }
893 virtual const char *getVAListDeclaration() const {
894 return "typedef char* __builtin_va_list;";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000895 }
896};
897
898class DarwinPPC64TargetInfo :
899 public DarwinTargetInfo<PPC64TargetInfo> {
900public:
901 DarwinPPC64TargetInfo(const std::string& triple)
902 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
903 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +0000904 SuitableAlign = 128;
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000905 }
906};
907} // end anonymous namespace.
908
Reid Spencer5f016e22007-07-11 17:01:13 +0000909namespace {
Justin Holewinski25bedca2011-10-03 17:28:37 +0000910 static const unsigned PTXAddrSpaceMap[] = {
911 0, // opencl_global
912 4, // opencl_local
913 1 // opencl_constant
914 };
Justin Holewinski285dc652011-04-20 19:34:15 +0000915 class PTXTargetInfo : public TargetInfo {
916 static const char * const GCCRegNames[];
917 static const Builtin::Info BuiltinInfo[];
Justin Holewinskid8e0fe62011-09-22 17:57:40 +0000918 std::vector<llvm::StringRef> AvailableFeatures;
Justin Holewinski285dc652011-04-20 19:34:15 +0000919 public:
920 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +0000921 BigEndian = false;
Justin Holewinski285dc652011-04-20 19:34:15 +0000922 TLSSupported = false;
923 LongWidth = LongAlign = 64;
Justin Holewinski25bedca2011-10-03 17:28:37 +0000924 AddrSpaceMap = &PTXAddrSpaceMap;
Justin Holewinskid8e0fe62011-09-22 17:57:40 +0000925 // Define available target features
926 // These must be defined in sorted order!
927 AvailableFeatures.push_back("compute10");
928 AvailableFeatures.push_back("compute11");
929 AvailableFeatures.push_back("compute12");
930 AvailableFeatures.push_back("compute13");
931 AvailableFeatures.push_back("compute20");
932 AvailableFeatures.push_back("double");
933 AvailableFeatures.push_back("no-fma");
934 AvailableFeatures.push_back("ptx20");
935 AvailableFeatures.push_back("ptx21");
936 AvailableFeatures.push_back("ptx22");
937 AvailableFeatures.push_back("ptx23");
938 AvailableFeatures.push_back("sm10");
939 AvailableFeatures.push_back("sm11");
940 AvailableFeatures.push_back("sm12");
941 AvailableFeatures.push_back("sm13");
942 AvailableFeatures.push_back("sm20");
943 AvailableFeatures.push_back("sm21");
944 AvailableFeatures.push_back("sm22");
945 AvailableFeatures.push_back("sm23");
Justin Holewinski285dc652011-04-20 19:34:15 +0000946 }
947 virtual void getTargetDefines(const LangOptions &Opts,
948 MacroBuilder &Builder) const {
949 Builder.defineMacro("__PTX__");
950 }
951 virtual void getTargetBuiltins(const Builtin::Info *&Records,
952 unsigned &NumRecords) const {
953 Records = BuiltinInfo;
954 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
955 }
956
957 virtual void getGCCRegNames(const char * const *&Names,
958 unsigned &NumNames) const;
959 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
960 unsigned &NumAliases) const {
961 // No aliases.
962 Aliases = 0;
963 NumAliases = 0;
964 }
965 virtual bool validateAsmConstraint(const char *&Name,
966 TargetInfo::ConstraintInfo &info) const {
967 // FIXME: implement
968 return true;
969 }
970 virtual const char *getClobbers() const {
971 // FIXME: Is this really right?
972 return "";
973 }
974 virtual const char *getVAListDeclaration() const {
975 // FIXME: implement
976 return "typedef char* __builtin_va_list;";
977 }
Justin Holewinski808ef662011-09-15 12:13:38 +0000978
979 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
980 const std::string &Name,
981 bool Enabled) const;
Justin Holewinski285dc652011-04-20 19:34:15 +0000982 };
983
984 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000985#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +0000986#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000987 ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +0000988#include "clang/Basic/BuiltinsPTX.def"
989 };
990
991 const char * const PTXTargetInfo::GCCRegNames[] = {
992 "r0"
993 };
994
995 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
996 unsigned &NumNames) const {
997 Names = GCCRegNames;
998 NumNames = llvm::array_lengthof(GCCRegNames);
999 }
1000
Justin Holewinski808ef662011-09-15 12:13:38 +00001001 bool PTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1002 const std::string &Name,
1003 bool Enabled) const {
Justin Holewinskid8e0fe62011-09-22 17:57:40 +00001004 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1005 Name)) {
1006 Features[Name] = Enabled;
1007 return true;
Justin Holewinski808ef662011-09-15 12:13:38 +00001008 } else {
Justin Holewinskid8e0fe62011-09-22 17:57:40 +00001009 return false;
Justin Holewinski808ef662011-09-15 12:13:38 +00001010 }
Justin Holewinski808ef662011-09-15 12:13:38 +00001011 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001012
1013 class PTX32TargetInfo : public PTXTargetInfo {
1014 public:
1015 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1016 PointerWidth = PointerAlign = 32;
1017 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
1018 DescriptionString
1019 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
1020 }
1021 };
1022
1023 class PTX64TargetInfo : public PTXTargetInfo {
1024 public:
1025 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1026 PointerWidth = PointerAlign = 64;
1027 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
1028 DescriptionString
1029 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
1030 }
1031 };
1032}
1033
1034namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +00001035// MBlaze abstract base class
1036class MBlazeTargetInfo : public TargetInfo {
1037 static const char * const GCCRegNames[];
1038 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1039
1040public:
1041 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +00001042 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +00001043 }
1044
1045 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1046 unsigned &NumRecords) const {
1047 // FIXME: Implement.
1048 Records = 0;
1049 NumRecords = 0;
1050 }
1051
1052 virtual void getTargetDefines(const LangOptions &Opts,
1053 MacroBuilder &Builder) const;
1054
1055 virtual const char *getVAListDeclaration() const {
1056 return "typedef char* __builtin_va_list;";
1057 }
1058 virtual const char *getTargetPrefix() const {
1059 return "mblaze";
1060 }
1061 virtual void getGCCRegNames(const char * const *&Names,
1062 unsigned &NumNames) const;
1063 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1064 unsigned &NumAliases) const;
1065 virtual bool validateAsmConstraint(const char *&Name,
1066 TargetInfo::ConstraintInfo &Info) const {
1067 switch (*Name) {
1068 default: return false;
1069 case 'O': // Zero
1070 return true;
1071 case 'b': // Base register
1072 case 'f': // Floating point register
1073 Info.setAllowsRegister();
1074 return true;
1075 }
1076 }
1077 virtual const char *getClobbers() const {
1078 return "";
1079 }
1080};
1081
1082/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1083/// #defines that are not tied to a specific subtarget.
1084void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1085 MacroBuilder &Builder) const {
1086 // Target identification.
1087 Builder.defineMacro("__microblaze__");
1088 Builder.defineMacro("_ARCH_MICROBLAZE");
1089 Builder.defineMacro("__MICROBLAZE__");
1090
1091 // Target properties.
1092 Builder.defineMacro("_BIG_ENDIAN");
1093 Builder.defineMacro("__BIG_ENDIAN__");
1094
1095 // Subtarget options.
1096 Builder.defineMacro("__REGISTER_PREFIX__", "");
1097}
1098
1099
1100const char * const MBlazeTargetInfo::GCCRegNames[] = {
1101 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1102 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1103 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1104 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1105 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1106 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1107 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1108 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1109 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1110 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1111};
1112
1113void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1114 unsigned &NumNames) const {
1115 Names = GCCRegNames;
1116 NumNames = llvm::array_lengthof(GCCRegNames);
1117}
1118
1119const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1120 { {"f0"}, "r0" },
1121 { {"f1"}, "r1" },
1122 { {"f2"}, "r2" },
1123 { {"f3"}, "r3" },
1124 { {"f4"}, "r4" },
1125 { {"f5"}, "r5" },
1126 { {"f6"}, "r6" },
1127 { {"f7"}, "r7" },
1128 { {"f8"}, "r8" },
1129 { {"f9"}, "r9" },
1130 { {"f10"}, "r10" },
1131 { {"f11"}, "r11" },
1132 { {"f12"}, "r12" },
1133 { {"f13"}, "r13" },
1134 { {"f14"}, "r14" },
1135 { {"f15"}, "r15" },
1136 { {"f16"}, "r16" },
1137 { {"f17"}, "r17" },
1138 { {"f18"}, "r18" },
1139 { {"f19"}, "r19" },
1140 { {"f20"}, "r20" },
1141 { {"f21"}, "r21" },
1142 { {"f22"}, "r22" },
1143 { {"f23"}, "r23" },
1144 { {"f24"}, "r24" },
1145 { {"f25"}, "r25" },
1146 { {"f26"}, "r26" },
1147 { {"f27"}, "r27" },
1148 { {"f28"}, "r28" },
1149 { {"f29"}, "r29" },
1150 { {"f30"}, "r30" },
1151 { {"f31"}, "r31" },
1152};
1153
1154void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1155 unsigned &NumAliases) const {
1156 Aliases = GCCRegAliases;
1157 NumAliases = llvm::array_lengthof(GCCRegAliases);
1158}
1159} // end anonymous namespace.
1160
1161namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001162// Namespace for x86 abstract base class
1163const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001164#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001165#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001166 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +00001167#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +00001168};
Eli Friedman61538a72008-05-20 14:21:01 +00001169
Nuno Lopes2550d702009-12-23 17:49:57 +00001170static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +00001171 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1172 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001173 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman618234a2008-08-20 02:34:37 +00001174 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1175 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1176 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001177 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001178 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1179 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman618234a2008-08-20 02:34:37 +00001180};
1181
Eric Christophercfd323d2011-06-21 00:05:20 +00001182const TargetInfo::AddlRegName AddlRegNames[] = {
1183 { { "al", "ah", "eax", "rax" }, 0 },
1184 { { "bl", "bh", "ebx", "rbx" }, 3 },
1185 { { "cl", "ch", "ecx", "rcx" }, 2 },
1186 { { "dl", "dh", "edx", "rdx" }, 1 },
1187 { { "esi", "rsi" }, 4 },
1188 { { "edi", "rdi" }, 5 },
1189 { { "esp", "rsp" }, 7 },
1190 { { "ebp", "rbp" }, 6 },
Eli Friedman618234a2008-08-20 02:34:37 +00001191};
1192
1193// X86 target abstract base class; x86-32 and x86-64 are very close, so
1194// most of the implementation can be shared.
1195class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001196 enum X86SSEEnum {
Craig Topper05fe4b52012-01-09 09:19:09 +00001197 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
Chris Lattner84f0ea82009-03-02 22:40:39 +00001198 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001199 enum MMX3DNowEnum {
1200 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1201 } MMX3DNowLevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001202
Eric Christophereea12d12010-04-02 23:50:19 +00001203 bool HasAES;
Craig Topper31ceea02011-12-25 05:06:45 +00001204 bool HasLZCNT;
1205 bool HasBMI;
1206 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001207 bool HasPOPCNT;
Craig Topper6a511e12011-12-30 07:33:42 +00001208 bool HasFMA4;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001209
Chandler Carruth499d9722011-09-28 08:55:34 +00001210 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1211 ///
1212 /// Each enumeration represents a particular CPU supported by Clang. These
1213 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1214 enum CPUKind {
1215 CK_Generic,
1216
1217 /// \name i386
1218 /// i386-generation processors.
1219 //@{
1220 CK_i386,
1221 //@}
1222
1223 /// \name i486
1224 /// i486-generation processors.
1225 //@{
1226 CK_i486,
1227 CK_WinChipC6,
1228 CK_WinChip2,
1229 CK_C3,
1230 //@}
1231
1232 /// \name i586
1233 /// i586-generation processors, P5 microarchitecture based.
1234 //@{
1235 CK_i586,
1236 CK_Pentium,
1237 CK_PentiumMMX,
1238 //@}
1239
1240 /// \name i686
1241 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1242 //@{
1243 CK_i686,
1244 CK_PentiumPro,
1245 CK_Pentium2,
1246 CK_Pentium3,
1247 CK_Pentium3M,
1248 CK_PentiumM,
1249 CK_C3_2,
1250
1251 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1252 /// Clang however has some logic to suport this.
1253 // FIXME: Warn, deprecate, and potentially remove this.
1254 CK_Yonah,
1255 //@}
1256
1257 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001258 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001259 //@{
1260 CK_Pentium4,
1261 CK_Pentium4M,
1262 CK_Prescott,
1263 CK_Nocona,
1264 //@}
1265
1266 /// \name Core
1267 /// Core microarchitecture based processors.
1268 //@{
1269 CK_Core2,
1270
1271 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1272 /// codename which GCC no longer accepts as an option to -march, but Clang
1273 /// has some logic for recognizing it.
1274 // FIXME: Warn, deprecate, and potentially remove this.
1275 CK_Penryn,
1276 //@}
1277
1278 /// \name Atom
1279 /// Atom processors
1280 //@{
1281 CK_Atom,
1282 //@}
1283
1284 /// \name Nehalem
1285 /// Nehalem microarchitecture based processors.
1286 //@{
1287 CK_Corei7,
1288 CK_Corei7AVX,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001289 CK_CoreAVXi,
Craig Topper2b03bb02011-12-17 19:55:21 +00001290 CK_CoreAVX2,
Chandler Carruth499d9722011-09-28 08:55:34 +00001291 //@}
1292
1293 /// \name K6
1294 /// K6 architecture processors.
1295 //@{
1296 CK_K6,
1297 CK_K6_2,
1298 CK_K6_3,
1299 //@}
1300
1301 /// \name K7
1302 /// K7 architecture processors.
1303 //@{
1304 CK_Athlon,
1305 CK_AthlonThunderbird,
1306 CK_Athlon4,
1307 CK_AthlonXP,
1308 CK_AthlonMP,
1309 //@}
1310
1311 /// \name K8
1312 /// K8 architecture processors.
1313 //@{
1314 CK_Athlon64,
1315 CK_Athlon64SSE3,
1316 CK_AthlonFX,
1317 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001318 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001319 CK_Opteron,
1320 CK_OpteronSSE3,
Roman Divacky01c770d2011-10-30 07:48:46 +00001321 CK_AMDFAM10,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001322 //@}
Chandler Carruth499d9722011-09-28 08:55:34 +00001323
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001324 /// \name Bobcat
1325 /// Bobcat architecture processors.
1326 //@{
1327 CK_BTVER1,
1328 //@}
1329
1330 /// \name Bulldozer
1331 /// Bulldozer architecture processors.
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001332 //@{
1333 CK_BDVER1,
1334 CK_BDVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001335 //@}
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001336
Chandler Carruth499d9722011-09-28 08:55:34 +00001337 /// This specification is deprecated and will be removed in the future.
1338 /// Users should prefer \see CK_K8.
1339 // FIXME: Warn on this when the CPU is set to it.
1340 CK_x86_64,
1341 //@}
1342
1343 /// \name Geode
1344 /// Geode processors.
1345 //@{
1346 CK_Geode
1347 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001348 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001349
Eli Friedman618234a2008-08-20 02:34:37 +00001350public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001351 X86TargetInfo(const std::string& triple)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001352 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Craig Topper05fe4b52012-01-09 09:19:09 +00001353 HasAES(false), HasLZCNT(false), HasBMI(false), HasBMI2(false),
1354 HasPOPCNT(false), HasFMA4(false), CPU(CK_Generic) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001355 BigEndian = false;
Eli Friedman618234a2008-08-20 02:34:37 +00001356 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001357 }
Benjamin Kramerb4066692011-12-28 15:47:06 +00001358 virtual unsigned getFloatEvalMethod() const {
1359 // X87 evaluates with 80 bits "long double" precision.
1360 return SSELevel == NoSSE ? 2 : 0;
1361 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001362 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1363 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001364 Records = BuiltinInfo;
1365 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001366 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001367 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001368 unsigned &NumNames) const {
1369 Names = GCCRegNames;
1370 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001371 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001372 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001373 unsigned &NumAliases) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001374 Aliases = 0;
1375 NumAliases = 0;
1376 }
1377 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1378 unsigned &NumNames) const {
1379 Names = AddlRegNames;
1380 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001381 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001382 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001383 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings002333f2011-06-07 23:45:05 +00001384 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001385 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001386 return "~{dirflag},~{fpsr},~{flags}";
1387 }
Chris Lattner33328642009-03-20 15:52:06 +00001388 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001389 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001390 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1391 const std::string &Name,
1392 bool Enabled) const;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001393 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001394 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001395 virtual const char* getABI() const {
Craig Topper05fe4b52012-01-09 09:19:09 +00001396 if (PointerWidth == 64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001397 return "avx";
1398 else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow)
1399 return "no-mmx";
1400 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001401 }
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001402 virtual bool setCPU(const std::string &Name) {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001403 CPU = llvm::StringSwitch<CPUKind>(Name)
1404 .Case("i386", CK_i386)
1405 .Case("i486", CK_i486)
1406 .Case("winchip-c6", CK_WinChipC6)
1407 .Case("winchip2", CK_WinChip2)
1408 .Case("c3", CK_C3)
1409 .Case("i586", CK_i586)
1410 .Case("pentium", CK_Pentium)
1411 .Case("pentium-mmx", CK_PentiumMMX)
1412 .Case("i686", CK_i686)
1413 .Case("pentiumpro", CK_PentiumPro)
1414 .Case("pentium2", CK_Pentium2)
1415 .Case("pentium3", CK_Pentium3)
1416 .Case("pentium3m", CK_Pentium3M)
1417 .Case("pentium-m", CK_PentiumM)
1418 .Case("c3-2", CK_C3_2)
1419 .Case("yonah", CK_Yonah)
1420 .Case("pentium4", CK_Pentium4)
1421 .Case("pentium4m", CK_Pentium4M)
1422 .Case("prescott", CK_Prescott)
1423 .Case("nocona", CK_Nocona)
1424 .Case("core2", CK_Core2)
1425 .Case("penryn", CK_Penryn)
1426 .Case("atom", CK_Atom)
1427 .Case("corei7", CK_Corei7)
1428 .Case("corei7-avx", CK_Corei7AVX)
1429 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper2b03bb02011-12-17 19:55:21 +00001430 .Case("core-avx2", CK_CoreAVX2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001431 .Case("k6", CK_K6)
1432 .Case("k6-2", CK_K6_2)
1433 .Case("k6-3", CK_K6_3)
1434 .Case("athlon", CK_Athlon)
1435 .Case("athlon-tbird", CK_AthlonThunderbird)
1436 .Case("athlon-4", CK_Athlon4)
1437 .Case("athlon-xp", CK_AthlonXP)
1438 .Case("athlon-mp", CK_AthlonMP)
1439 .Case("athlon64", CK_Athlon64)
1440 .Case("athlon64-sse3", CK_Athlon64SSE3)
1441 .Case("athlon-fx", CK_AthlonFX)
1442 .Case("k8", CK_K8)
1443 .Case("k8-sse3", CK_K8SSE3)
1444 .Case("opteron", CK_Opteron)
1445 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky01c770d2011-10-30 07:48:46 +00001446 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001447 .Case("btver1", CK_BTVER1)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001448 .Case("bdver1", CK_BDVER1)
1449 .Case("bdver2", CK_BDVER2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001450 .Case("x86-64", CK_x86_64)
1451 .Case("geode", CK_Geode)
1452 .Default(CK_Generic);
1453
Chandler Carruth26a39142011-09-28 09:45:08 +00001454 // Perform any per-CPU checks necessary to determine if this CPU is
1455 // acceptable.
1456 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1457 // invalid without explaining *why*.
1458 switch (CPU) {
1459 case CK_Generic:
1460 // No processor selected!
1461 return false;
1462
1463 case CK_i386:
1464 case CK_i486:
1465 case CK_WinChipC6:
1466 case CK_WinChip2:
1467 case CK_C3:
1468 case CK_i586:
1469 case CK_Pentium:
1470 case CK_PentiumMMX:
1471 case CK_i686:
1472 case CK_PentiumPro:
1473 case CK_Pentium2:
1474 case CK_Pentium3:
1475 case CK_Pentium3M:
1476 case CK_PentiumM:
1477 case CK_Yonah:
1478 case CK_C3_2:
1479 case CK_Pentium4:
1480 case CK_Pentium4M:
1481 case CK_Prescott:
1482 case CK_K6:
1483 case CK_K6_2:
1484 case CK_K6_3:
1485 case CK_Athlon:
1486 case CK_AthlonThunderbird:
1487 case CK_Athlon4:
1488 case CK_AthlonXP:
1489 case CK_AthlonMP:
1490 case CK_Geode:
1491 // Only accept certain architectures when compiling in 32-bit mode.
1492 if (PointerWidth != 32)
1493 return false;
1494
1495 // Fallthrough
1496 case CK_Nocona:
1497 case CK_Core2:
1498 case CK_Penryn:
1499 case CK_Atom:
1500 case CK_Corei7:
1501 case CK_Corei7AVX:
1502 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001503 case CK_CoreAVX2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001504 case CK_Athlon64:
1505 case CK_Athlon64SSE3:
1506 case CK_AthlonFX:
1507 case CK_K8:
1508 case CK_K8SSE3:
1509 case CK_Opteron:
1510 case CK_OpteronSSE3:
Roman Divacky01c770d2011-10-30 07:48:46 +00001511 case CK_AMDFAM10:
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001512 case CK_BTVER1:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001513 case CK_BDVER1:
1514 case CK_BDVER2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001515 case CK_x86_64:
1516 return true;
1517 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00001518 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001519 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001520};
Chris Lattner3daed522009-03-02 22:20:04 +00001521
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001522void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001523 // FIXME: This should not be here.
1524 Features["3dnow"] = false;
1525 Features["3dnowa"] = false;
1526 Features["mmx"] = false;
1527 Features["sse"] = false;
1528 Features["sse2"] = false;
1529 Features["sse3"] = false;
1530 Features["ssse3"] = false;
1531 Features["sse41"] = false;
1532 Features["sse42"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00001533 Features["sse4a"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001534 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001535 Features["avx"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00001536 Features["avx2"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00001537 Features["lzcnt"] = false;
1538 Features["bmi"] = false;
1539 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00001540 Features["popcnt"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00001541 Features["fma4"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001542
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001543 // FIXME: This *really* should not be here.
1544
1545 // X86_64 always has SSE2.
1546 if (PointerWidth == 64)
1547 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1548
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001549 switch (CPU) {
1550 case CK_Generic:
1551 case CK_i386:
1552 case CK_i486:
1553 case CK_i586:
1554 case CK_Pentium:
1555 case CK_i686:
1556 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001557 break;
1558 case CK_PentiumMMX:
1559 case CK_Pentium2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001560 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001561 break;
1562 case CK_Pentium3:
1563 case CK_Pentium3M:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001564 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001565 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001566 break;
1567 case CK_PentiumM:
1568 case CK_Pentium4:
1569 case CK_Pentium4M:
1570 case CK_x86_64:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001571 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001572 setFeatureEnabled(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001573 break;
1574 case CK_Yonah:
1575 case CK_Prescott:
1576 case CK_Nocona:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001577 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001578 setFeatureEnabled(Features, "sse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001579 break;
1580 case CK_Core2:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001581 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001582 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001583 break;
1584 case CK_Penryn:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001585 setFeatureEnabled(Features, "mmx", true);
Benjamin Kramerb3453a82012-01-04 14:36:57 +00001586 setFeatureEnabled(Features, "sse4.1", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001587 break;
1588 case CK_Atom:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001589 setFeatureEnabled(Features, "mmx", true);
Chandler Carruth49defe62011-09-28 10:36:46 +00001590 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001591 break;
1592 case CK_Corei7:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001593 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001594 setFeatureEnabled(Features, "sse4", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001595 setFeatureEnabled(Features, "aes", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001596 break;
1597 case CK_Corei7AVX:
1598 case CK_CoreAVXi:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001599 setFeatureEnabled(Features, "mmx", true);
Roman Divackybcaa3b82011-04-05 20:32:44 +00001600 setFeatureEnabled(Features, "sse4", true);
1601 setFeatureEnabled(Features, "aes", true);
Bruno Cardoso Lopese02d3912011-07-11 23:33:46 +00001602 //setFeatureEnabled(Features, "avx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001603 break;
Craig Topper2b03bb02011-12-17 19:55:21 +00001604 case CK_CoreAVX2:
1605 setFeatureEnabled(Features, "mmx", true);
1606 setFeatureEnabled(Features, "sse4", true);
1607 setFeatureEnabled(Features, "aes", true);
Craig Topper31ceea02011-12-25 05:06:45 +00001608 setFeatureEnabled(Features, "lzcnt", true);
1609 setFeatureEnabled(Features, "bmi", true);
1610 setFeatureEnabled(Features, "bmi2", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00001611 //setFeatureEnabled(Features, "avx2", true);
1612 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001613 case CK_K6:
1614 case CK_WinChipC6:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001615 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001616 break;
1617 case CK_K6_2:
1618 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001619 case CK_WinChip2:
1620 case CK_C3:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001621 setFeatureEnabled(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001622 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00001623 case CK_Athlon:
1624 case CK_AthlonThunderbird:
1625 case CK_Geode:
1626 setFeatureEnabled(Features, "3dnowa", true);
1627 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001628 case CK_Athlon4:
1629 case CK_AthlonXP:
1630 case CK_AthlonMP:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001631 setFeatureEnabled(Features, "sse", true);
1632 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001633 break;
1634 case CK_K8:
1635 case CK_Opteron:
1636 case CK_Athlon64:
1637 case CK_AthlonFX:
Mike Stump1eb44332009-09-09 15:08:12 +00001638 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001639 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001640 break;
1641 case CK_K8SSE3:
1642 case CK_OpteronSSE3:
1643 case CK_Athlon64SSE3:
Roman Divacky80b32b82011-10-30 13:47:56 +00001644 setFeatureEnabled(Features, "sse3", true);
1645 setFeatureEnabled(Features, "3dnowa", true);
1646 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00001647 case CK_AMDFAM10:
Roman Divackyc8b09a12010-12-29 13:28:29 +00001648 setFeatureEnabled(Features, "sse3", true);
Roman Divacky80b32b82011-10-30 13:47:56 +00001649 setFeatureEnabled(Features, "sse4a", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00001650 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001651 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001652 case CK_BTVER1:
1653 setFeatureEnabled(Features, "ssse3", true);
1654 setFeatureEnabled(Features, "sse4a", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001655 case CK_BDVER1:
1656 case CK_BDVER2:
1657 setFeatureEnabled(Features, "sse4", true);
1658 setFeatureEnabled(Features, "sse4a", true);
1659 setFeatureEnabled(Features, "aes", true);
1660 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001661 case CK_C3_2:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001662 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001663 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001664 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001665 }
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001666}
1667
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001668bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump1eb44332009-09-09 15:08:12 +00001669 const std::string &Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001670 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00001671 // FIXME: This *really* should not be here. We need some way of translating
1672 // options into llvm subtarget features.
1673 if (!Features.count(Name) &&
1674 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001675 return false;
1676
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001677 // FIXME: this should probably use a switch with fall through.
1678
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001679 if (Enabled) {
1680 if (Name == "mmx")
1681 Features["mmx"] = true;
1682 else if (Name == "sse")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001683 Features["mmx"] = Features["sse"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001684 else if (Name == "sse2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001685 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001686 else if (Name == "sse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001687 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1688 true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001689 else if (Name == "ssse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001690 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001691 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001692 else if (Name == "sse4" || Name == "sse4.2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001693 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001694 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1695 Features["popcnt"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001696 else if (Name == "sse4.1")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001697 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopherd39ebe22010-03-04 02:26:37 +00001698 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001699 else if (Name == "3dnow")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001700 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001701 else if (Name == "3dnowa")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001702 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00001703 else if (Name == "aes")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001704 Features["aes"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001705 else if (Name == "avx")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001706 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1707 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001708 Features["popcnt"] = Features["avx"] = true;
Craig Topper2b03bb02011-12-17 19:55:21 +00001709 else if (Name == "avx2")
1710 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1711 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001712 Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
Craig Topper6a511e12011-12-30 07:33:42 +00001713 else if (Name == "fma4")
1714 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1715 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1716 Features["popcnt"] = Features["avx"] = Features["fma4"] = true;
Roman Divacky80b32b82011-10-30 13:47:56 +00001717 else if (Name == "sse4a")
Craig Topper6a511e12011-12-30 07:33:42 +00001718 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Benjamin Kramer5c65e4f2012-01-10 11:50:13 +00001719 Features["lzcnt"] = Features["popcnt"] = Features["sse4a"] = true;
Craig Topper31ceea02011-12-25 05:06:45 +00001720 else if (Name == "lzcnt")
1721 Features["lzcnt"] = true;
1722 else if (Name == "bmi")
1723 Features["bmi"] = true;
1724 else if (Name == "bmi2")
1725 Features["bmi2"] = true;
Craig Toppere14e08b2011-12-29 16:10:46 +00001726 else if (Name == "popcnt")
1727 Features["popcnt"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001728 } else {
1729 if (Name == "mmx")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001730 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001731 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00001732 Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00001733 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1734 Features["sse4a"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001735 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00001736 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00001737 Features["sse41"] = Features["sse42"] = Features["sse4a"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001738 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001739 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Craig Topper6a511e12011-12-30 07:33:42 +00001740 Features["sse42"] = Features["sse4a"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001741 else if (Name == "ssse3")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001742 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencerb24bac92011-04-17 19:22:03 +00001743 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001744 Features["sse41"] = Features["sse42"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00001745 else if (Name == "sse4.2")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001746 Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001747 else if (Name == "3dnow")
1748 Features["3dnow"] = Features["3dnowa"] = false;
1749 else if (Name == "3dnowa")
1750 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001751 else if (Name == "aes")
1752 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001753 else if (Name == "avx")
Craig Topper6a511e12011-12-30 07:33:42 +00001754 Features["avx"] = Features["avx2"] = Features["fma4"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00001755 else if (Name == "avx2")
1756 Features["avx2"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00001757 else if (Name == "sse4a")
1758 Features["sse4a"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00001759 else if (Name == "lzcnt")
1760 Features["lzcnt"] = false;
1761 else if (Name == "bmi")
1762 Features["bmi"] = false;
1763 else if (Name == "bmi2")
1764 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00001765 else if (Name == "popcnt")
1766 Features["popcnt"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00001767 else if (Name == "fma4")
1768 Features["fma4"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001769 }
1770
1771 return true;
1772}
1773
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001774/// HandleTargetOptions - Perform initialization based on the user
1775/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001776void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001777 // Remember the maximum enabled sselevel.
1778 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1779 // Ignore disabled features.
1780 if (Features[i][0] == '-')
1781 continue;
1782
Eric Christophereea12d12010-04-02 23:50:19 +00001783 if (Features[i].substr(1) == "aes") {
1784 HasAES = true;
1785 continue;
1786 }
1787
Craig Topper31ceea02011-12-25 05:06:45 +00001788 if (Features[i].substr(1) == "lzcnt") {
1789 HasLZCNT = true;
1790 continue;
1791 }
1792
1793 if (Features[i].substr(1) == "bmi") {
1794 HasBMI = true;
1795 continue;
1796 }
1797
1798 if (Features[i].substr(1) == "bmi2") {
1799 HasBMI2 = true;
1800 continue;
1801 }
1802
Craig Toppere14e08b2011-12-29 16:10:46 +00001803 if (Features[i].substr(1) == "popcnt") {
1804 HasPOPCNT = true;
1805 continue;
1806 }
1807
Craig Topper6a511e12011-12-30 07:33:42 +00001808 if (Features[i].substr(1) == "fma4") {
1809 HasFMA4 = true;
1810 continue;
1811 }
1812
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001813 assert(Features[i][0] == '+' && "Invalid target feature!");
1814 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
Craig Topper05fe4b52012-01-09 09:19:09 +00001815 .Case("avx2", AVX2)
1816 .Case("avx", AVX)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001817 .Case("sse42", SSE42)
1818 .Case("sse41", SSE41)
1819 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00001820 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001821 .Case("sse2", SSE2)
1822 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001823 .Default(NoSSE);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001824 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001825
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001826 MMX3DNowEnum ThreeDNowLevel =
1827 llvm::StringSwitch<MMX3DNowEnum>(Features[i].substr(1))
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001828 .Case("3dnowa", AMD3DNowAthlon)
1829 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001830 .Case("mmx", MMX)
1831 .Default(NoMMX3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001832
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001833 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001834 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001835
1836 // Don't tell the backend if we're turning off mmx; it will end up disabling
1837 // SSE, which we don't want.
1838 std::vector<std::string>::iterator it;
1839 it = std::find(Features.begin(), Features.end(), "-mmx");
1840 if (it != Features.end())
1841 Features.erase(it);
Chris Lattner3daed522009-03-02 22:20:04 +00001842}
Chris Lattnerc0f59212009-03-02 22:27:17 +00001843
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001844/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
1845/// definitions for this particular subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00001846void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001847 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001848 // Target identification.
1849 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001850 Builder.defineMacro("_LP64");
1851 Builder.defineMacro("__LP64__");
1852 Builder.defineMacro("__amd64__");
1853 Builder.defineMacro("__amd64");
1854 Builder.defineMacro("__x86_64");
1855 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00001856 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00001857 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00001858 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001859
Chris Lattnerc0f59212009-03-02 22:27:17 +00001860 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001861 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
1862 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001863 switch (CPU) {
1864 case CK_Generic:
1865 break;
1866 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001867 // The rest are coming from the i386 define above.
1868 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001869 break;
1870 case CK_i486:
1871 case CK_WinChipC6:
1872 case CK_WinChip2:
1873 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001874 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001875 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00001876 case CK_PentiumMMX:
1877 Builder.defineMacro("__pentium_mmx__");
1878 Builder.defineMacro("__tune_pentium_mmx__");
1879 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001880 case CK_i586:
1881 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001882 defineCPUMacros(Builder, "i586");
1883 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001884 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001885 case CK_Pentium3:
1886 case CK_Pentium3M:
1887 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001888 Builder.defineMacro("__tune_pentium3__");
1889 // Fallthrough
1890 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001891 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001892 Builder.defineMacro("__tune_pentium2__");
1893 // Fallthrough
1894 case CK_PentiumPro:
1895 Builder.defineMacro("__tune_i686__");
1896 Builder.defineMacro("__tune_pentiumpro__");
1897 // Fallthrough
1898 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001899 Builder.defineMacro("__i686");
1900 Builder.defineMacro("__i686__");
1901 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
1902 Builder.defineMacro("__pentiumpro");
1903 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001904 break;
1905 case CK_Pentium4:
1906 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001907 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001908 break;
1909 case CK_Yonah:
1910 case CK_Prescott:
1911 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001912 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001913 break;
1914 case CK_Core2:
1915 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001916 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001917 break;
1918 case CK_Atom:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001919 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001920 break;
1921 case CK_Corei7:
1922 case CK_Corei7AVX:
1923 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001924 case CK_CoreAVX2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001925 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001926 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001927 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001928 Builder.defineMacro("__k6_2__");
1929 Builder.defineMacro("__tune_k6_2__");
1930 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001931 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001932 if (CPU != CK_K6_2) { // In case of fallthrough
1933 // FIXME: GCC may be enabling these in cases where some other k6
1934 // architecture is specified but -m3dnow is explicitly provided. The
1935 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001936 Builder.defineMacro("__k6_3__");
1937 Builder.defineMacro("__tune_k6_3__");
1938 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00001939 // Fallthrough
1940 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001941 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001942 break;
1943 case CK_Athlon:
1944 case CK_AthlonThunderbird:
1945 case CK_Athlon4:
1946 case CK_AthlonXP:
1947 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001948 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00001949 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001950 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00001951 Builder.defineMacro("__tune_athlon_sse__");
1952 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001953 break;
1954 case CK_K8:
1955 case CK_K8SSE3:
1956 case CK_x86_64:
1957 case CK_Opteron:
1958 case CK_OpteronSSE3:
1959 case CK_Athlon64:
1960 case CK_Athlon64SSE3:
1961 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001962 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001963 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00001964 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001965 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00001966 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001967 case CK_BTVER1:
1968 defineCPUMacros(Builder, "btver1");
1969 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001970 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001971 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001972 break;
1973 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001974 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001975 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001976 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001977 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001978 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001979 }
Chris Lattner84f0ea82009-03-02 22:40:39 +00001980
Chandler Carruth88c75b02011-09-28 09:54:07 +00001981 // Target properties.
1982 Builder.defineMacro("__LITTLE_ENDIAN__");
1983 Builder.defineMacro("__REGISTER_PREFIX__", "");
1984
Chris Lattner54175442009-04-19 17:32:33 +00001985 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1986 // functions in glibc header files that use FP Stack inline asm which the
1987 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00001988 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001989
Chandler Carruth88c75b02011-09-28 09:54:07 +00001990 if (HasAES)
1991 Builder.defineMacro("__AES__");
1992
Craig Topper31ceea02011-12-25 05:06:45 +00001993 if (HasLZCNT)
1994 Builder.defineMacro("__LZCNT__");
1995
1996 if (HasBMI)
1997 Builder.defineMacro("__BMI__");
1998
1999 if (HasBMI2)
2000 Builder.defineMacro("__BMI2__");
2001
Craig Toppere14e08b2011-12-29 16:10:46 +00002002 if (HasPOPCNT)
2003 Builder.defineMacro("__POPCNT__");
2004
Craig Topper6a511e12011-12-30 07:33:42 +00002005 if (HasFMA4)
2006 Builder.defineMacro("__FMA4__");
2007
Chris Lattner84f0ea82009-03-02 22:40:39 +00002008 // Each case falls through to the previous one here.
2009 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002010 case AVX2:
2011 Builder.defineMacro("__AVX2__");
2012 case AVX:
2013 Builder.defineMacro("__AVX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002014 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00002015 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002016 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00002017 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002018 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002019 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002020 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002021 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002022 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00002023 Builder.defineMacro("__SSE2__");
2024 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00002025 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00002026 Builder.defineMacro("__SSE__");
2027 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002028 case NoSSE:
Chris Lattner84f0ea82009-03-02 22:40:39 +00002029 break;
2030 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002031
Francois Pichet62ec1f22011-09-17 17:15:52 +00002032 if (Opts.MicrosoftExt && PointerWidth == 32) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002033 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002034 case AVX2:
2035 case AVX:
Michael J. Spencera764e832010-10-21 08:22:51 +00002036 case SSE42:
2037 case SSE41:
2038 case SSSE3:
2039 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002040 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002041 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002042 break;
2043 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002044 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002045 break;
2046 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002047 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002048 }
2049 }
2050
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002051 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002052 switch (MMX3DNowLevel) {
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002053 case AMD3DNowAthlon:
2054 Builder.defineMacro("__3dNOW_A__");
2055 case AMD3DNow:
2056 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002057 case MMX:
2058 Builder.defineMacro("__MMX__");
2059 case NoMMX3DNow:
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002060 break;
2061 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00002062}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002063
2064
Eli Friedman618234a2008-08-20 02:34:37 +00002065bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002066X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002067 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002068 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00002069 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00002070 case 'Y': // first letter of a pair:
2071 switch (*(Name+1)) {
2072 default: return false;
2073 case '0': // First SSE register.
2074 case 't': // Any SSE register, when SSE2 is enabled.
2075 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2076 case 'm': // any MMX register, when inter-unit moves enabled.
2077 break; // falls through to setAllowsRegister.
2078 }
Eli Friedman618234a2008-08-20 02:34:37 +00002079 case 'a': // eax.
2080 case 'b': // ebx.
2081 case 'c': // ecx.
2082 case 'd': // edx.
2083 case 'S': // esi.
2084 case 'D': // edi.
2085 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00002086 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00002087 case 't': // top of floating point stack.
2088 case 'u': // second from top of floating point stack.
2089 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00002090 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00002091 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00002092 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00002093 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2094 case 'l': // "Index" registers: any general register that can be used as an
2095 // index in a base+index memory access.
2096 Info.setAllowsRegister();
2097 return true;
2098 case 'C': // SSE floating point constant.
2099 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002100 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002101 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002102 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002103 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00002104 return true;
2105 }
2106}
2107
Dale Johannesenf6e2c202010-10-29 23:12:32 +00002108
Eli Friedman618234a2008-08-20 02:34:37 +00002109std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00002110X86TargetInfo::convertConstraint(const char *&Constraint) const {
2111 switch (*Constraint) {
Eli Friedman618234a2008-08-20 02:34:37 +00002112 case 'a': return std::string("{ax}");
2113 case 'b': return std::string("{bx}");
2114 case 'c': return std::string("{cx}");
2115 case 'd': return std::string("{dx}");
2116 case 'S': return std::string("{si}");
2117 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00002118 case 'p': // address
2119 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00002120 case 't': // top of floating point stack.
2121 return std::string("{st}");
2122 case 'u': // second from top of floating point stack.
2123 return std::string("{st(1)}"); // second from top of floating point stack.
2124 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00002125 return std::string(1, *Constraint);
Eli Friedman618234a2008-08-20 02:34:37 +00002126 }
2127}
Eli Friedman618234a2008-08-20 02:34:37 +00002128} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00002129
2130namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002131// X86-32 generic target
2132class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00002133public:
Eli Friedman618234a2008-08-20 02:34:37 +00002134 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2135 DoubleAlign = LongLongAlign = 32;
2136 LongDoubleWidth = 96;
2137 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00002138 SuitableAlign = 128;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002139 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2140 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames567c6002011-10-11 00:52:51 +00002141 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman1afabd92009-03-29 20:31:09 +00002142 SizeType = UnsignedInt;
2143 PtrDiffType = SignedInt;
2144 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002145 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002146
2147 // Use fpret for all types.
2148 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2149 (1 << TargetInfo::Double) |
2150 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00002151
2152 // x86-32 has atomics up to 8 bytes
2153 // FIXME: Check that we actually have cmpxchg8b before setting
2154 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2155 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman618234a2008-08-20 02:34:37 +00002156 }
2157 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002158 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +00002159 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002160
Chris Lattner21fb98e2009-09-23 06:06:36 +00002161 int getEHDataRegisterNumber(unsigned RegNo) const {
2162 if (RegNo == 0) return 0;
2163 if (RegNo == 1) return 2;
2164 return -1;
2165 }
Eli Friedman618234a2008-08-20 02:34:37 +00002166};
2167} // end anonymous namespace
2168
2169namespace {
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00002170class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2171public:
2172 NetBSDI386TargetInfo(const std::string &triple) :
2173 NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2174 }
2175
2176 virtual unsigned getFloatEvalMethod() const {
2177 // NetBSD defaults to "double" rounding
2178 return 1;
2179 }
2180};
2181} // end anonymous namespace
2182
2183namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00002184class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2185public:
2186 OpenBSDI386TargetInfo(const std::string& triple) :
2187 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2188 SizeType = UnsignedLong;
2189 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00002190 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00002191 }
2192};
2193} // end anonymous namespace
2194
2195namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00002196class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00002197public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002198 DarwinI386TargetInfo(const std::string& triple) :
2199 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00002200 LongDoubleWidth = 128;
2201 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002202 SuitableAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +00002203 SizeType = UnsignedLong;
2204 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002205 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2206 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002207 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbar613fd672010-05-27 00:35:16 +00002208 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00002209 }
2210
Eli Friedman618234a2008-08-20 02:34:37 +00002211};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00002212} // end anonymous namespace
2213
2214namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00002215// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002216class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00002217public:
2218 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002219 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00002220 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00002221 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00002222 DoubleAlign = LongLongAlign = 64;
2223 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 +00002224 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002225 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedman29a30502008-08-21 01:40:19 +00002226 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002227 virtual void getTargetDefines(const LangOptions &Opts,
2228 MacroBuilder &Builder) const {
2229 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2230 }
2231};
2232} // end anonymous namespace
2233
2234namespace {
2235
2236// x86-32 Windows Visual Studio target
2237class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2238public:
2239 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2240 : WindowsX86_32TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002241 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00002242 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2243 }
2244 virtual void getTargetDefines(const LangOptions &Opts,
2245 MacroBuilder &Builder) const {
2246 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2247 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2248 // The value of the following reflects processor type.
2249 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2250 // We lost the original triple, so we use the default.
2251 Builder.defineMacro("_M_IX86", "600");
2252 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002253};
2254} // end anonymous namespace
2255
2256namespace {
2257// x86-32 MinGW target
2258class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2259public:
2260 MinGWX86_32TargetInfo(const std::string& triple)
2261 : WindowsX86_32TargetInfo(triple) {
2262 }
2263 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002264 MacroBuilder &Builder) const {
2265 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002266 DefineStd(Builder, "WIN32", Opts);
2267 DefineStd(Builder, "WINNT", Opts);
2268 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00002269 Builder.defineMacro("__MSVCRT__");
2270 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002271
2272 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2273 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002274 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002275 // Provide "as-is" __declspec.
2276 Builder.defineMacro("__declspec", "__declspec");
2277 else
2278 // Provide alias of __attribute__ like mingw32-gcc.
2279 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002280 }
2281};
2282} // end anonymous namespace
2283
2284namespace {
2285// x86-32 Cygwin target
2286class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2287public:
2288 CygwinX86_32TargetInfo(const std::string& triple)
2289 : X86_32TargetInfo(triple) {
2290 TLSSupported = false;
2291 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002292 DoubleAlign = LongLongAlign = 64;
2293 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2294 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002295 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002296 }
2297 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002298 MacroBuilder &Builder) const {
2299 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2300 Builder.defineMacro("__CYGWIN__");
2301 Builder.defineMacro("__CYGWIN32__");
2302 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00002303 if (Opts.CPlusPlus)
2304 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00002305 }
Eli Friedman29a30502008-08-21 01:40:19 +00002306};
2307} // end anonymous namespace
2308
2309namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00002310// x86-32 Haiku target
2311class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2312public:
2313 HaikuX86_32TargetInfo(const std::string& triple)
2314 : X86_32TargetInfo(triple) {
2315 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00002316 IntPtrType = SignedLong;
2317 PtrDiffType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00002318 this->UserLabelPrefix = "";
Eli Friedmana7e68452010-08-22 01:00:03 +00002319 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00002320 virtual void getTargetDefines(const LangOptions &Opts,
2321 MacroBuilder &Builder) const {
2322 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2323 Builder.defineMacro("__INTEL__");
2324 Builder.defineMacro("__HAIKU__");
2325 }
2326};
2327} // end anonymous namespace
2328
Douglas Gregordca52262011-07-01 22:41:14 +00002329// RTEMS Target
2330template<typename Target>
2331class RTEMSTargetInfo : public OSTargetInfo<Target> {
2332protected:
2333 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2334 MacroBuilder &Builder) const {
2335 // RTEMS defines; list based off of gcc output
2336
Douglas Gregordca52262011-07-01 22:41:14 +00002337 Builder.defineMacro("__rtems__");
2338 Builder.defineMacro("__ELF__");
2339 }
2340public:
2341 RTEMSTargetInfo(const std::string &triple)
2342 : OSTargetInfo<Target>(triple) {
2343 this->UserLabelPrefix = "";
2344
2345 llvm::Triple Triple(triple);
2346 switch (Triple.getArch()) {
2347 default:
2348 case llvm::Triple::x86:
2349 // this->MCountName = ".mcount";
2350 break;
2351 case llvm::Triple::mips:
2352 case llvm::Triple::mipsel:
2353 case llvm::Triple::ppc:
2354 case llvm::Triple::ppc64:
2355 // this->MCountName = "_mcount";
2356 break;
2357 case llvm::Triple::arm:
2358 // this->MCountName = "__mcount";
2359 break;
2360 }
2361
2362 }
2363};
2364
2365namespace {
2366// x86-32 RTEMS target
2367class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
2368public:
2369 RTEMSX86_32TargetInfo(const std::string& triple)
2370 : X86_32TargetInfo(triple) {
2371 SizeType = UnsignedLong;
2372 IntPtrType = SignedLong;
2373 PtrDiffType = SignedLong;
2374 this->UserLabelPrefix = "";
2375 }
2376 virtual void getTargetDefines(const LangOptions &Opts,
2377 MacroBuilder &Builder) const {
2378 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2379 Builder.defineMacro("__INTEL__");
2380 Builder.defineMacro("__rtems__");
2381 }
2382};
2383} // end anonymous namespace
2384
Chris Lattner86ed3a32010-04-11 19:29:39 +00002385namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002386// x86-64 generic target
2387class X86_64TargetInfo : public X86TargetInfo {
2388public:
Chris Lattner33328642009-03-20 15:52:06 +00002389 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00002390 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00002391 LongDoubleWidth = 128;
2392 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00002393 LargeArrayMinWidth = 128;
2394 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002395 SuitableAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00002396 IntMaxType = SignedLong;
2397 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002398 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002399 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00002400
Eli Friedmaned855cb2008-08-21 00:13:15 +00002401 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2402 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002403 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002404
2405 // Use fpret only for long double.
2406 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00002407
Anders Carlssoneea64802011-10-31 16:27:11 +00002408 // Use fp2ret for _Complex long double.
2409 ComplexLongDoubleUsesFP2Ret = true;
2410
Eli Friedman2be46072011-10-14 20:59:01 +00002411 // x86-64 has atomics up to 16 bytes.
2412 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
2413 // on CPUs with cmpxchg16b
2414 MaxAtomicPromoteWidth = 128;
2415 MaxAtomicInlineWidth = 64;
Reid Spencer5f016e22007-07-11 17:01:13 +00002416 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00002417 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002418 return "typedef struct __va_list_tag {"
2419 " unsigned gp_offset;"
2420 " unsigned fp_offset;"
2421 " void* overflow_arg_area;"
2422 " void* reg_save_area;"
John McCall2b7baf02010-05-28 18:25:28 +00002423 "} __va_list_tag;"
Eli Friedmandc043162009-07-03 00:45:06 +00002424 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +00002425 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002426
Chris Lattner21fb98e2009-09-23 06:06:36 +00002427 int getEHDataRegisterNumber(unsigned RegNo) const {
2428 if (RegNo == 0) return 0;
2429 if (RegNo == 1) return 1;
2430 return -1;
2431 }
Eli Friedman618234a2008-08-20 02:34:37 +00002432};
2433} // end anonymous namespace
2434
2435namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002436// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002437class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002438public:
2439 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002440 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002441 TLSSupported = false;
2442 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00002443 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00002444 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00002445 IntMaxType = SignedLongLong;
2446 UIntMaxType = UnsignedLongLong;
2447 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00002448 SizeType = UnsignedLongLong;
2449 PtrDiffType = SignedLongLong;
2450 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00002451 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002452 }
2453 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002454 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002455 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002456 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00002457 }
NAKAMURA Takumi79521992011-01-17 22:56:23 +00002458 virtual const char *getVAListDeclaration() const {
2459 return "typedef char* __builtin_va_list;";
2460 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002461};
2462} // end anonymous namespace
2463
2464namespace {
2465// x86-64 Windows Visual Studio target
2466class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
2467public:
2468 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
2469 : WindowsX86_64TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002470 LongDoubleWidth = LongDoubleAlign = 64;
2471 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00002472 }
2473 virtual void getTargetDefines(const LangOptions &Opts,
2474 MacroBuilder &Builder) const {
2475 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2476 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00002477 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002478 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002479 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002480};
2481} // end anonymous namespace
2482
2483namespace {
2484// x86-64 MinGW target
2485class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
2486public:
2487 MinGWX86_64TargetInfo(const std::string& triple)
2488 : WindowsX86_64TargetInfo(triple) {
2489 }
2490 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002491 MacroBuilder &Builder) const {
2492 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002493 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00002494 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00002495 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00002496 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002497
2498 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2499 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002500 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002501 // Provide "as-is" __declspec.
2502 Builder.defineMacro("__declspec", "__declspec");
2503 else
2504 // Provide alias of __attribute__ like mingw32-gcc.
2505 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002506 }
2507};
2508} // end anonymous namespace
2509
2510namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002511class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
2512public:
Mike Stump1eb44332009-09-09 15:08:12 +00002513 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002514 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
2515 Int64Type = SignedLongLong;
2516 }
2517};
2518} // end anonymous namespace
2519
2520namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00002521class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
2522public:
Mike Stump1eb44332009-09-09 15:08:12 +00002523 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00002524 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
2525 IntMaxType = SignedLongLong;
2526 UIntMaxType = UnsignedLongLong;
2527 Int64Type = SignedLongLong;
2528 }
2529};
2530} // end anonymous namespace
2531
2532namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00002533class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002534 // Possible FPU choices.
2535 enum FPUMode {
2536 NoFPU,
2537 VFP2FPU,
2538 VFP3FPU,
2539 NeonFPU
2540 };
2541
2542 static bool FPUModeIsVFP(FPUMode Mode) {
2543 return Mode >= VFP2FPU && Mode <= NeonFPU;
2544 }
2545
2546 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2547 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002548
Daniel Dunbareac7c532009-12-18 18:42:37 +00002549 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00002550
2551 unsigned FPU : 3;
2552
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002553 unsigned IsThumb : 1;
2554
2555 // Initialized via features.
2556 unsigned SoftFloat : 1;
2557 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002558
Chris Lattner2752c012010-03-03 19:03:45 +00002559 static const Builtin::Info BuiltinInfo[];
2560
Chris Lattner393ff042008-04-21 18:56:49 +00002561public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002562 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbareac7c532009-12-18 18:42:37 +00002563 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002564 {
Eli Friedmane6a24e82011-12-22 03:51:45 +00002565 BigEndian = false;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002566 SizeType = UnsignedInt;
2567 PtrDiffType = SignedInt;
James Molloya6d81f92011-11-23 13:35:08 +00002568 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
2569 WCharType = UnsignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002570
Chris Lattner9bffb072010-04-23 16:29:58 +00002571 // {} in inline assembly are neon specifiers, not assembly variant
2572 // specifiers.
2573 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00002574
Daniel Dunbareac7c532009-12-18 18:42:37 +00002575 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00002576 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002577 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00002578 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2579 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002580 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2581 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002582 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002583 } else {
2584 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2585 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002586 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002587 }
John McCallee79a4c2010-08-21 22:46:04 +00002588
2589 // ARM targets default to using the ARM C++ ABI.
2590 CXXABI = CXXABI_ARM;
Eli Friedman2be46072011-10-14 20:59:01 +00002591
2592 // ARM has atomics up to 8 bytes
2593 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
2594 MaxAtomicPromoteWidth = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00002595 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002596 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00002597 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002598 ABI = Name;
2599
Daniel Dunbara2a41612009-09-14 00:02:24 +00002600 // The defaults (above) are for AAPCS, check if we need to change them.
2601 //
2602 // FIXME: We need support for -meabi... we could just mangle it into the
2603 // name.
2604 if (Name == "apcs-gnu") {
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002605 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002606 SizeType = UnsignedLong;
2607
James Molloya6d81f92011-11-23 13:35:08 +00002608 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
2609 WCharType = SignedInt;
2610
Daniel Dunbar684de632010-04-22 16:14:54 +00002611 // Do not respect the alignment of bit-field types when laying out
2612 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
2613 UseBitFieldTypeAlignment = false;
2614
Chad Rosier61a62212011-08-04 01:21:14 +00002615 /// Do force alignment of members that follow zero length bitfields. If
2616 /// the alignment of the zero-length bitfield is greater than the member
2617 /// that follows it, `bar', `bar' will be aligned as the type of the
2618 /// zero length bitfield.
2619 UseZeroLengthBitfieldAlignment = true;
2620
2621 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosier6e43f3f2011-08-04 17:52:43 +00002622 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
2623 /// gcc.
Chad Rosier61a62212011-08-04 01:21:14 +00002624 ZeroLengthBitfieldBoundary = 32;
2625
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002626 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00002627 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2628 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002629 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 +00002630 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002631 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002632 } else {
2633 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 +00002634 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002635 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002636 }
2637
Chad Rosier9f1210c2011-07-26 07:03:04 +00002638 // FIXME: Override "preferred align" for double and long long.
Daniel Dunbara2a41612009-09-14 00:02:24 +00002639 } else if (Name == "aapcs") {
2640 // FIXME: Enumerated types are variable width in straight AAPCS.
2641 } else if (Name == "aapcs-linux") {
Chad Rosier9f1210c2011-07-26 07:03:04 +00002642 ;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002643 } else
2644 return false;
2645
2646 return true;
2647 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002648
Chandler Carruthc3a2e652011-09-28 05:56:05 +00002649 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002650 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
2651 Features["vfp2"] = true;
2652 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
2653 Features["neon"] = true;
2654 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002655
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002656 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2657 const std::string &Name,
2658 bool Enabled) const {
Evan Chengf972b262011-07-08 06:40:11 +00002659 if (Name == "soft-float" || Name == "soft-float-abi" ||
Evgeniy Stepanov35dd7322012-01-11 11:21:31 +00002660 Name == "vfp2" || Name == "vfp3" || Name == "neon" || Name == "d16") {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002661 Features[Name] = Enabled;
2662 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002663 return false;
2664
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002665 return true;
2666 }
2667
2668 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002669 FPU = NoFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002670 SoftFloat = SoftFloatABI = false;
2671 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2672 if (Features[i] == "+soft-float")
2673 SoftFloat = true;
2674 else if (Features[i] == "+soft-float-abi")
2675 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00002676 else if (Features[i] == "+vfp2")
2677 FPU = VFP2FPU;
2678 else if (Features[i] == "+vfp3")
2679 FPU = VFP3FPU;
2680 else if (Features[i] == "+neon")
2681 FPU = NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002682 }
2683
2684 // Remove front-end specific options which the backend handles differently.
2685 std::vector<std::string>::iterator it;
2686 it = std::find(Features.begin(), Features.end(), "+soft-float");
2687 if (it != Features.end())
2688 Features.erase(it);
2689 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2690 if (it != Features.end())
2691 Features.erase(it);
2692 }
2693
Chris Lattner5f9e2722011-07-23 10:55:15 +00002694 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbareac7c532009-12-18 18:42:37 +00002695 return llvm::StringSwitch<const char*>(Name)
2696 .Cases("arm8", "arm810", "4")
2697 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2698 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2699 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2700 .Case("ep9312", "4T")
2701 .Cases("arm10tdmi", "arm1020t", "5T")
2702 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2703 .Case("arm926ej-s", "5TEJ")
2704 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2705 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002706 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002707 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002708 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002709 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2710 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson06f45632011-01-06 16:57:20 +00002711 .Case("cortex-m3", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00002712 .Case("cortex-m0", "6M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002713 .Default(0);
2714 }
2715 virtual bool setCPU(const std::string &Name) {
2716 if (!getCPUDefineSuffix(Name))
2717 return false;
2718
2719 CPU = Name;
2720 return true;
2721 }
Chris Lattner33328642009-03-20 15:52:06 +00002722 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002723 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00002724 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00002725 Builder.defineMacro("__arm");
2726 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002727
Chris Lattnerc0f59212009-03-02 22:27:17 +00002728 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00002729 Builder.defineMacro("__ARMEL__");
2730 Builder.defineMacro("__LITTLE_ENDIAN__");
2731 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002732
Chris Lattner5f9e2722011-07-23 10:55:15 +00002733 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00002734 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002735
Mike Stump437bb4b2009-04-08 02:07:04 +00002736 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002737
Daniel Dunbareac7c532009-12-18 18:42:37 +00002738 // FIXME: It's more complicated than this and we don't really support
2739 // interworking.
2740 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00002741 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002742
Daniel Dunbareac7c532009-12-18 18:42:37 +00002743 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramera9992772010-01-09 17:55:51 +00002744 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002745
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002746 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00002747 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002748
2749 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00002750 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002751
Bob Wilson84f95cf2011-05-13 18:56:03 +00002752 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002753 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00002754 Builder.defineMacro("__THUMBEL__");
2755 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00002756 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002757 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002758 }
2759
2760 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00002761 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002762
2763 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramera9992772010-01-09 17:55:51 +00002764 Builder.defineMacro("__VFP_FP__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002765
2766 // This only gets set when Neon instructions are actually available, unlike
2767 // the VFP define, hence the soft float and arch check. This is subtly
2768 // different from gcc, we follow the intent which was that it should be set
2769 // when Neon instructions are actually available.
Bob Wilson84f95cf2011-05-13 18:56:03 +00002770 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002771 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00002772 }
2773 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2774 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00002775 Records = BuiltinInfo;
2776 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00002777 }
2778 virtual const char *getVAListDeclaration() const {
John McCall0e9972c2011-05-09 02:19:37 +00002779 return "typedef void* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +00002780 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002781 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002782 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002783 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002784 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002785 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002786 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002787 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002788 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00002789 default:
Nate Begemanad487f42008-04-22 05:03:19 +00002790 case 'l': // r0-r7
2791 case 'h': // r8-r15
2792 case 'w': // VFP Floating point register single precision
2793 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00002794 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00002795 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00002796 case 'Q': // A memory address that is a single base register.
2797 Info.setAllowsMemory();
2798 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00002799 case 'U': // a memory reference...
2800 switch (Name[1]) {
2801 case 'q': // ...ARMV4 ldrsb
2802 case 'v': // ...VFP load/store (reg+constant offset)
2803 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00002804 case 't': // address valid for load/store opaque types wider
2805 // than 128-bits
2806 case 'n': // valid address for Neon doubleword vector load/store
2807 case 'm': // valid address for Neon element and structure load/store
2808 case 's': // valid address for non-offset loads/stores of quad-word
2809 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00002810 Info.setAllowsMemory();
2811 Name++;
2812 return true;
2813 }
Nate Begemanad487f42008-04-22 05:03:19 +00002814 }
Chris Lattner393ff042008-04-21 18:56:49 +00002815 return false;
2816 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00002817 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00002818 std::string R;
2819 switch (*Constraint) {
2820 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00002821 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00002822 Constraint++;
2823 break;
Eric Christopher283f4472011-06-17 00:40:18 +00002824 case 'p': // 'p' should be translated to 'r' by default.
2825 R = std::string("r");
2826 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00002827 default:
2828 return std::string(1, *Constraint);
2829 }
2830 return R;
2831 }
Chris Lattner393ff042008-04-21 18:56:49 +00002832 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002833 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00002834 return "";
2835 }
2836};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002837
2838const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002839 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002840 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002841 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2842
2843 // Float registers
2844 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2845 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2846 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002847 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002848
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002849 // Double registers
2850 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2851 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00002852 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2853 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002854
2855 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00002856 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2857 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002858};
2859
2860void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002861 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002862 Names = GCCRegNames;
2863 NumNames = llvm::array_lengthof(GCCRegNames);
2864}
2865
2866const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002867 { { "a1" }, "r0" },
2868 { { "a2" }, "r1" },
2869 { { "a3" }, "r2" },
2870 { { "a4" }, "r3" },
2871 { { "v1" }, "r4" },
2872 { { "v2" }, "r5" },
2873 { { "v3" }, "r6" },
2874 { { "v4" }, "r7" },
2875 { { "v5" }, "r8" },
2876 { { "v6", "rfp" }, "r9" },
2877 { { "sl" }, "r10" },
2878 { { "fp" }, "r11" },
2879 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002880 { { "r13" }, "sp" },
2881 { { "r14" }, "lr" },
2882 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002883 // The S, D and Q registers overlap, but aren't really aliases; we
2884 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002885};
2886
2887void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2888 unsigned &NumAliases) const {
2889 Aliases = GCCRegAliases;
2890 NumAliases = llvm::array_lengthof(GCCRegAliases);
2891}
Chris Lattner2752c012010-03-03 19:03:45 +00002892
2893const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00002894#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00002895#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00002896 ALL_LANGUAGES },
Chris Lattner2752c012010-03-03 19:03:45 +00002897#include "clang/Basic/BuiltinsARM.def"
2898};
Chris Lattner393ff042008-04-21 18:56:49 +00002899} // end anonymous namespace.
2900
Eli Friedmana9f54962008-08-20 07:44:10 +00002901namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00002902class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002903 public DarwinTargetInfo<ARMTargetInfo> {
2904protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00002905 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00002906 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00002907 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00002908 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002909
Torok Edwin5f6c1942009-06-30 17:10:35 +00002910public:
Mike Stump1eb44332009-09-09 15:08:12 +00002911 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002912 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2913 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00002914 // iOS always has 64-bit atomic instructions.
2915 // FIXME: This should be based off of the target features in ARMTargetInfo.
2916 MaxAtomicInlineWidth = 64;
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002917 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002918};
2919} // end anonymous namespace.
2920
Tony Linthicum96319392011-12-12 21:14:55 +00002921
2922namespace {
2923// Hexagon abstract base class
2924class HexagonTargetInfo : public TargetInfo {
2925 static const Builtin::Info BuiltinInfo[];
2926 static const char * const GCCRegNames[];
2927 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2928 std::string CPU;
2929public:
2930 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00002931 BigEndian = false;
Tony Linthicum96319392011-12-12 21:14:55 +00002932 DescriptionString = ("e-p:32:32:32-"
2933 "i64:64:64-i32:32:32-"
2934 "i16:16:16-i1:32:32-a:0:0");
2935
2936 // {} in inline assembly are packet specifiers, not assembly variant
2937 // specifiers.
2938 NoAsmVariants = true;
2939 }
2940
2941 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2942 unsigned &NumRecords) const {
2943 Records = BuiltinInfo;
2944 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
2945 }
2946
2947 virtual bool validateAsmConstraint(const char *&Name,
2948 TargetInfo::ConstraintInfo &Info) const {
2949 return true;
2950 }
2951
2952 virtual void getTargetDefines(const LangOptions &Opts,
2953 MacroBuilder &Builder) const;
2954
2955 virtual const char *getVAListDeclaration() const {
2956 return "typedef char* __builtin_va_list;";
2957 }
2958 virtual void getGCCRegNames(const char * const *&Names,
2959 unsigned &NumNames) const;
2960 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2961 unsigned &NumAliases) const;
2962 virtual const char *getClobbers() const {
2963 return "";
2964 }
Sebastian Pop43115d42012-01-13 20:37:10 +00002965
2966 static const char *getHexagonCPUSuffix(StringRef Name) {
2967 return llvm::StringSwitch<const char*>(Name)
2968 .Case("hexagonv2", "2")
2969 .Case("hexagonv3", "3")
2970 .Case("hexagonv4", "4")
2971 .Default(0);
2972 }
2973
Tony Linthicum96319392011-12-12 21:14:55 +00002974 virtual bool setCPU(const std::string &Name) {
Sebastian Pop43115d42012-01-13 20:37:10 +00002975 if (!getHexagonCPUSuffix(Name))
2976 return false;
2977
Tony Linthicum96319392011-12-12 21:14:55 +00002978 CPU = Name;
2979 return true;
2980 }
2981};
2982
2983void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
2984 MacroBuilder &Builder) const {
2985 Builder.defineMacro("qdsp6");
2986 Builder.defineMacro("__qdsp6", "1");
2987 Builder.defineMacro("__qdsp6__", "1");
2988
2989 Builder.defineMacro("hexagon");
2990 Builder.defineMacro("__hexagon", "1");
2991 Builder.defineMacro("__hexagon__", "1");
2992
2993 if(CPU == "hexagonv1") {
2994 Builder.defineMacro("__HEXAGON_V1__");
2995 Builder.defineMacro("__HEXAGON_ARCH__", "1");
2996 if(Opts.HexagonQdsp6Compat) {
2997 Builder.defineMacro("__QDSP6_V1__");
2998 Builder.defineMacro("__QDSP6_ARCH__", "1");
2999 }
3000 }
3001 else if(CPU == "hexagonv2") {
3002 Builder.defineMacro("__HEXAGON_V2__");
3003 Builder.defineMacro("__HEXAGON_ARCH__", "2");
3004 if(Opts.HexagonQdsp6Compat) {
3005 Builder.defineMacro("__QDSP6_V2__");
3006 Builder.defineMacro("__QDSP6_ARCH__", "2");
3007 }
3008 }
3009 else if(CPU == "hexagonv3") {
3010 Builder.defineMacro("__HEXAGON_V3__");
3011 Builder.defineMacro("__HEXAGON_ARCH__", "3");
3012 if(Opts.HexagonQdsp6Compat) {
3013 Builder.defineMacro("__QDSP6_V3__");
3014 Builder.defineMacro("__QDSP6_ARCH__", "3");
3015 }
3016 }
3017 else if(CPU == "hexagonv4") {
3018 Builder.defineMacro("__HEXAGON_V4__");
3019 Builder.defineMacro("__HEXAGON_ARCH__", "4");
3020 if(Opts.HexagonQdsp6Compat) {
3021 Builder.defineMacro("__QDSP6_V4__");
3022 Builder.defineMacro("__QDSP6_ARCH__", "4");
3023 }
3024 }
3025}
3026
3027const char * const HexagonTargetInfo::GCCRegNames[] = {
3028 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3029 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3030 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3031 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3032 "p0", "p1", "p2", "p3",
3033 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
3034};
3035
3036void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
3037 unsigned &NumNames) const {
3038 Names = GCCRegNames;
3039 NumNames = llvm::array_lengthof(GCCRegNames);
3040}
3041
3042
3043const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
3044 { { "sp" }, "r29" },
3045 { { "fp" }, "r30" },
3046 { { "lr" }, "r31" },
3047 };
3048
3049void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3050 unsigned &NumAliases) const {
3051 Aliases = GCCRegAliases;
3052 NumAliases = llvm::array_lengthof(GCCRegAliases);
3053}
3054
3055
3056const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
3057#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3058#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3059 ALL_LANGUAGES },
3060#include "clang/Basic/BuiltinsHexagon.def"
3061};
3062}
3063
3064
Reid Spencer5f016e22007-07-11 17:01:13 +00003065namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00003066class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00003067 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3068 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003069 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00003070public:
Eli Friedman01b86682008-08-20 07:28:14 +00003071 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
3072 // FIXME: Support Sparc quad-precision long double?
Eli Friedmane6a24e82011-12-22 03:51:45 +00003073 BigEndian = false;
Eli Friedmaned855cb2008-08-21 00:13:15 +00003074 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 +00003075 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00003076 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003077 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3078 const std::string &Name,
3079 bool Enabled) const {
3080 if (Name == "soft-float")
3081 Features[Name] = Enabled;
3082 else
3083 return false;
3084
3085 return true;
3086 }
3087 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3088 SoftFloat = false;
3089 for (unsigned i = 0, e = Features.size(); i != e; ++i)
3090 if (Features[i] == "+soft-float")
3091 SoftFloat = true;
3092 }
Chris Lattner33328642009-03-20 15:52:06 +00003093 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003094 MacroBuilder &Builder) const {
3095 DefineStd(Builder, "sparc", Opts);
3096 Builder.defineMacro("__sparcv8");
3097 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003098
3099 if (SoftFloat)
3100 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00003101 }
3102 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3103 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00003104 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00003105 }
3106 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00003107 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00003108 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003109 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00003110 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003111 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00003112 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003113 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00003114 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00003115 // FIXME: Implement!
3116 return false;
Gabor Greif26658672008-02-21 16:29:08 +00003117 }
3118 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00003119 // FIXME: Implement!
3120 return "";
Gabor Greif26658672008-02-21 16:29:08 +00003121 }
3122};
3123
Chris Lattnere957f532009-01-27 01:58:38 +00003124const char * const SparcV8TargetInfo::GCCRegNames[] = {
3125 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3126 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3127 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3128 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
3129};
3130
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003131void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00003132 unsigned &NumNames) const {
3133 Names = GCCRegNames;
3134 NumNames = llvm::array_lengthof(GCCRegNames);
3135}
3136
3137const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003138 { { "g0" }, "r0" },
3139 { { "g1" }, "r1" },
3140 { { "g2" }, "r2" },
3141 { { "g3" }, "r3" },
3142 { { "g4" }, "r4" },
3143 { { "g5" }, "r5" },
3144 { { "g6" }, "r6" },
3145 { { "g7" }, "r7" },
3146 { { "o0" }, "r8" },
3147 { { "o1" }, "r9" },
3148 { { "o2" }, "r10" },
3149 { { "o3" }, "r11" },
3150 { { "o4" }, "r12" },
3151 { { "o5" }, "r13" },
3152 { { "o6", "sp" }, "r14" },
3153 { { "o7" }, "r15" },
3154 { { "l0" }, "r16" },
3155 { { "l1" }, "r17" },
3156 { { "l2" }, "r18" },
3157 { { "l3" }, "r19" },
3158 { { "l4" }, "r20" },
3159 { { "l5" }, "r21" },
3160 { { "l6" }, "r22" },
3161 { { "l7" }, "r23" },
3162 { { "i0" }, "r24" },
3163 { { "i1" }, "r25" },
3164 { { "i2" }, "r26" },
3165 { { "i3" }, "r27" },
3166 { { "i4" }, "r28" },
3167 { { "i5" }, "r29" },
3168 { { "i6", "fp" }, "r30" },
3169 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00003170};
3171
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003172void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00003173 unsigned &NumAliases) const {
3174 Aliases = GCCRegAliases;
3175 NumAliases = llvm::array_lengthof(GCCRegAliases);
3176}
Gabor Greif26658672008-02-21 16:29:08 +00003177} // end anonymous namespace.
3178
Eli Friedman01b86682008-08-20 07:28:14 +00003179namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003180class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
3181public:
3182 AuroraUXSparcV8TargetInfo(const std::string& triple) :
3183 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
3184 SizeType = UnsignedInt;
3185 PtrDiffType = SignedInt;
3186 }
3187};
Torok Edwin5f6c1942009-06-30 17:10:35 +00003188class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00003189public:
3190 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00003191 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00003192 SizeType = UnsignedInt;
3193 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00003194 }
3195};
3196} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00003197
Chris Lattner2621fd12008-05-08 05:58:21 +00003198namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003199 class MSP430TargetInfo : public TargetInfo {
3200 static const char * const GCCRegNames[];
3201 public:
3202 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003203 BigEndian = false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003204 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00003205 IntWidth = 16; IntAlign = 16;
3206 LongWidth = 32; LongLongWidth = 64;
3207 LongAlign = LongLongAlign = 16;
3208 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003209 SuitableAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003210 SizeType = UnsignedInt;
3211 IntMaxType = SignedLong;
3212 UIntMaxType = UnsignedLong;
3213 IntPtrType = SignedShort;
3214 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00003215 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00003216 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003217 }
3218 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003219 MacroBuilder &Builder) const {
3220 Builder.defineMacro("MSP430");
3221 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003222 // FIXME: defines for different 'flavours' of MCU
3223 }
3224 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3225 unsigned &NumRecords) const {
3226 // FIXME: Implement.
3227 Records = 0;
3228 NumRecords = 0;
3229 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003230 virtual void getGCCRegNames(const char * const *&Names,
3231 unsigned &NumNames) const;
3232 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3233 unsigned &NumAliases) const {
3234 // No aliases.
3235 Aliases = 0;
3236 NumAliases = 0;
3237 }
3238 virtual bool validateAsmConstraint(const char *&Name,
3239 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00003240 // No target constraints for now.
3241 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003242 }
3243 virtual const char *getClobbers() const {
3244 // FIXME: Is this really right?
3245 return "";
3246 }
3247 virtual const char *getVAListDeclaration() const {
3248 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00003249 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003250 }
3251 };
3252
3253 const char * const MSP430TargetInfo::GCCRegNames[] = {
3254 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3255 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3256 };
3257
3258 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
3259 unsigned &NumNames) const {
3260 Names = GCCRegNames;
3261 NumNames = llvm::array_lengthof(GCCRegNames);
3262 }
3263}
3264
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00003265namespace {
Eli Friedmanb63decf2009-08-19 20:47:07 +00003266
Mike Stump1eb44332009-09-09 15:08:12 +00003267 // LLVM and Clang cannot be used directly to output native binaries for
3268 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00003269 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00003270 //
3271 // TCE uses the llvm bitcode as input and uses it for generating customized
3272 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00003273 // publicly available in http://tce.cs.tut.fi
3274
Eli Friedman209f5bb2011-10-07 19:51:42 +00003275 static const unsigned TCEOpenCLAddrSpaceMap[] = {
3276 3, // opencl_global
3277 4, // opencl_local
3278 5 // opencl_constant
3279 };
3280
Eli Friedmanb63decf2009-08-19 20:47:07 +00003281 class TCETargetInfo : public TargetInfo{
3282 public:
3283 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
3284 TLSSupported = false;
3285 IntWidth = 32;
3286 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003287 PointerWidth = 32;
3288 IntAlign = 32;
3289 LongAlign = LongLongAlign = 32;
3290 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003291 SuitableAlign = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003292 SizeType = UnsignedInt;
3293 IntMaxType = SignedLong;
3294 UIntMaxType = UnsignedLong;
3295 IntPtrType = SignedInt;
3296 PtrDiffType = SignedInt;
3297 FloatWidth = 32;
3298 FloatAlign = 32;
3299 DoubleWidth = 32;
3300 DoubleAlign = 32;
3301 LongDoubleWidth = 32;
3302 LongDoubleAlign = 32;
3303 FloatFormat = &llvm::APFloat::IEEEsingle;
3304 DoubleFormat = &llvm::APFloat::IEEEsingle;
3305 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00003306 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
3307 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00003308 "f32:32:32-f64:32:32-v64:32:32-"
3309 "v128:32:32-a0:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00003310 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003311 }
3312
3313 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003314 MacroBuilder &Builder) const {
3315 DefineStd(Builder, "tce", Opts);
3316 Builder.defineMacro("__TCE__");
3317 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00003318 }
3319 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3320 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00003321 virtual const char *getClobbers() const {
3322 return "";
3323 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00003324 virtual const char *getVAListDeclaration() const {
3325 return "typedef void* __builtin_va_list;";
3326 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00003327 virtual void getGCCRegNames(const char * const *&Names,
3328 unsigned &NumNames) const {}
3329 virtual bool validateAsmConstraint(const char *&Name,
3330 TargetInfo::ConstraintInfo &info) const {
3331 return true;
3332 }
3333 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3334 unsigned &NumAliases) const {}
3335 };
3336}
3337
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003338namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003339class MipsTargetInfoBase : public TargetInfo {
3340 std::string CPU;
3341protected:
3342 std::string ABI;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003343public:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003344 MipsTargetInfoBase(const std::string& triple, const std::string& ABIStr)
Akira Hatanaka148735e2011-11-05 01:48:34 +00003345 : TargetInfo(triple), ABI(ABIStr) {}
Eric Christophered734732010-03-02 02:41:08 +00003346 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003347 virtual bool setABI(const std::string &Name) = 0;
Eric Christophered734732010-03-02 02:41:08 +00003348 virtual bool setCPU(const std::string &Name) {
3349 CPU = Name;
3350 return true;
3351 }
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003352 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christophered734732010-03-02 02:41:08 +00003353 Features[ABI] = true;
3354 Features[CPU] = true;
3355 }
3356 virtual void getArchDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003357 MacroBuilder &Builder) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003358 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003359 MacroBuilder &Builder) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003360 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3361 unsigned &NumRecords) const {
3362 // FIXME: Implement!
3363 }
3364 virtual const char *getVAListDeclaration() const {
3365 return "typedef void* __builtin_va_list;";
3366 }
3367 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003368 unsigned &NumNames) const {
3369 static const char * const GCCRegNames[] = {
3370 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
3371 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
3372 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
3373 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
3374 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
3375 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
3376 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
3377 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
3378 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
3379 "$fcc5","$fcc6","$fcc7"
3380 };
3381 Names = GCCRegNames;
3382 NumNames = llvm::array_lengthof(GCCRegNames);
3383 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003384 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003385 unsigned &NumAliases) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003386 virtual bool validateAsmConstraint(const char *&Name,
3387 TargetInfo::ConstraintInfo &Info) const {
3388 switch (*Name) {
3389 default:
Douglas Gregor21a25162011-11-02 20:52:01 +00003390 return false;
3391
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003392 case 'r': // CPU registers.
3393 case 'd': // Equivalent to "r" unless generating MIPS16 code.
3394 case 'y': // Equivalent to "r", backwards compatibility only.
3395 case 'f': // floating-point registers.
3396 Info.setAllowsRegister();
3397 return true;
3398 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003399 }
3400
3401 virtual const char *getClobbers() const {
3402 // FIXME: Implement!
3403 return "";
3404 }
3405};
3406
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003407class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003408public:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003409 Mips32TargetInfoBase(const std::string& triple) :
Akira Hatanaka148735e2011-11-05 01:48:34 +00003410 MipsTargetInfoBase(triple, "o32") {
3411 SizeType = UnsignedInt;
3412 PtrDiffType = SignedInt;
3413 }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003414 virtual bool setABI(const std::string &Name) {
3415 if ((Name == "o32") || (Name == "eabi")) {
3416 ABI = Name;
3417 return true;
3418 } else
3419 return false;
3420 }
3421 virtual void getArchDefines(const LangOptions &Opts,
3422 MacroBuilder &Builder) const {
Douglas Gregorc9a23712011-11-09 15:17:16 +00003423 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
3424 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
3425 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
3426
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003427 if (ABI == "o32") {
3428 Builder.defineMacro("__mips_o32");
3429 Builder.defineMacro("_ABIO32", "1");
3430 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
3431 }
3432 else if (ABI == "eabi")
3433 Builder.defineMacro("__mips_eabi");
3434 else
David Blaikieb219cfc2011-09-23 05:06:16 +00003435 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003436 }
3437 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3438 unsigned &NumAliases) const {
3439 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3440 { { "at" }, "$1" },
3441 { { "v0" }, "$2" },
3442 { { "v1" }, "$3" },
3443 { { "a0" }, "$4" },
3444 { { "a1" }, "$5" },
3445 { { "a2" }, "$6" },
3446 { { "a3" }, "$7" },
3447 { { "t0" }, "$8" },
3448 { { "t1" }, "$9" },
3449 { { "t2" }, "$10" },
3450 { { "t3" }, "$11" },
3451 { { "t4" }, "$12" },
3452 { { "t5" }, "$13" },
3453 { { "t6" }, "$14" },
3454 { { "t7" }, "$15" },
3455 { { "s0" }, "$16" },
3456 { { "s1" }, "$17" },
3457 { { "s2" }, "$18" },
3458 { { "s3" }, "$19" },
3459 { { "s4" }, "$20" },
3460 { { "s5" }, "$21" },
3461 { { "s6" }, "$22" },
3462 { { "s7" }, "$23" },
3463 { { "t8" }, "$24" },
3464 { { "t9" }, "$25" },
3465 { { "k0" }, "$26" },
3466 { { "k1" }, "$27" },
3467 { { "gp" }, "$28" },
3468 { { "sp" }, "$29" },
3469 { { "fp" }, "$30" },
3470 { { "ra" }, "$31" }
3471 };
3472 Aliases = GCCRegAliases;
3473 NumAliases = llvm::array_lengthof(GCCRegAliases);
3474 }
3475};
3476
3477class Mips32EBTargetInfo : public Mips32TargetInfoBase {
3478public:
3479 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3480 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3481 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3482 }
3483 virtual void getTargetDefines(const LangOptions &Opts,
3484 MacroBuilder &Builder) const {
3485 DefineStd(Builder, "mips", Opts);
3486 Builder.defineMacro("_mips");
3487 DefineStd(Builder, "MIPSEB", Opts);
3488 Builder.defineMacro("_MIPSEB");
3489 Builder.defineMacro("__REGISTER_PREFIX__", "");
3490 getArchDefines(Opts, Builder);
3491 }
3492};
3493
3494class Mips32ELTargetInfo : public Mips32TargetInfoBase {
3495public:
3496 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003497 BigEndian = false;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003498 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 +00003499 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003500 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003501 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003502 MacroBuilder &Builder) const {
3503 DefineStd(Builder, "mips", Opts);
3504 Builder.defineMacro("_mips");
3505 DefineStd(Builder, "MIPSEL", Opts);
3506 Builder.defineMacro("_MIPSEL");
3507 Builder.defineMacro("__REGISTER_PREFIX__", "");
3508 getArchDefines(Opts, Builder);
3509 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003510};
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003511
3512class Mips64TargetInfoBase : public MipsTargetInfoBase {
3513 virtual void SetDescriptionString(const std::string &Name) = 0;
3514public:
3515 Mips64TargetInfoBase(const std::string& triple) :
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003516 MipsTargetInfoBase(triple, "n64") {
3517 LongWidth = LongAlign = 64;
3518 PointerWidth = PointerAlign = 64;
3519 LongDoubleWidth = LongDoubleAlign = 128;
3520 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003521 SuitableAlign = 128;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003522 }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003523 virtual bool setABI(const std::string &Name) {
3524 SetDescriptionString(Name);
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003525
3526 if (Name != "n32" && Name != "n64")
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003527 return false;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003528
3529 ABI = Name;
3530
3531 if (Name == "n32") {
3532 LongWidth = LongAlign = 32;
3533 PointerWidth = PointerAlign = 32;
3534 }
3535
3536 return true;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003537 }
3538 virtual void getArchDefines(const LangOptions &Opts,
3539 MacroBuilder &Builder) const {
3540 if (ABI == "n32") {
3541 Builder.defineMacro("__mips_n32");
3542 Builder.defineMacro("_ABIN32", "2");
3543 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
3544 }
3545 else if (ABI == "n64") {
3546 Builder.defineMacro("__mips_n64");
3547 Builder.defineMacro("_ABI64", "3");
3548 Builder.defineMacro("_MIPS_SIM", "_ABI64");
3549 }
3550 else
David Blaikieb219cfc2011-09-23 05:06:16 +00003551 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003552 }
3553 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3554 unsigned &NumAliases) const {
3555 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3556 { { "at" }, "$1" },
3557 { { "v0" }, "$2" },
3558 { { "v1" }, "$3" },
3559 { { "a0" }, "$4" },
3560 { { "a1" }, "$5" },
3561 { { "a2" }, "$6" },
3562 { { "a3" }, "$7" },
3563 { { "a4" }, "$8" },
3564 { { "a5" }, "$9" },
3565 { { "a6" }, "$10" },
3566 { { "a7" }, "$11" },
3567 { { "t0" }, "$12" },
3568 { { "t1" }, "$13" },
3569 { { "t2" }, "$14" },
3570 { { "t3" }, "$15" },
3571 { { "s0" }, "$16" },
3572 { { "s1" }, "$17" },
3573 { { "s2" }, "$18" },
3574 { { "s3" }, "$19" },
3575 { { "s4" }, "$20" },
3576 { { "s5" }, "$21" },
3577 { { "s6" }, "$22" },
3578 { { "s7" }, "$23" },
3579 { { "t8" }, "$24" },
3580 { { "t9" }, "$25" },
3581 { { "k0" }, "$26" },
3582 { { "k1" }, "$27" },
3583 { { "gp" }, "$28" },
3584 { { "sp" }, "$29" },
3585 { { "fp" }, "$30" },
3586 { { "ra" }, "$31" }
3587 };
3588 Aliases = GCCRegAliases;
3589 NumAliases = llvm::array_lengthof(GCCRegAliases);
3590 }
3591};
3592
3593class Mips64EBTargetInfo : public Mips64TargetInfoBase {
3594 virtual void SetDescriptionString(const std::string &Name) {
3595 // Change DescriptionString only if ABI is n32.
3596 if (Name == "n32")
3597 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003598 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3599 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003600 }
3601public:
3602 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
3603 // Default ABI is n64.
3604 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 +00003605 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3606 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003607 }
3608 virtual void getTargetDefines(const LangOptions &Opts,
3609 MacroBuilder &Builder) const {
3610 DefineStd(Builder, "mips", Opts);
3611 Builder.defineMacro("_mips");
3612 DefineStd(Builder, "MIPSEB", Opts);
3613 Builder.defineMacro("_MIPSEB");
3614 Builder.defineMacro("__REGISTER_PREFIX__", "");
3615 getArchDefines(Opts, Builder);
3616 }
3617};
3618
3619class Mips64ELTargetInfo : public Mips64TargetInfoBase {
3620 virtual void SetDescriptionString(const std::string &Name) {
3621 // Change DescriptionString only if ABI is n32.
3622 if (Name == "n32")
3623 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 +00003624 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
3625 "-v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003626 }
3627public:
3628 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003629 // Default ABI is n64.
3630 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003631 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 +00003632 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3633 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003634 }
3635 virtual void getTargetDefines(const LangOptions &Opts,
3636 MacroBuilder &Builder) const {
3637 DefineStd(Builder, "mips", Opts);
3638 Builder.defineMacro("_mips");
3639 DefineStd(Builder, "MIPSEL", Opts);
3640 Builder.defineMacro("_MIPSEL");
3641 Builder.defineMacro("__REGISTER_PREFIX__", "");
3642 getArchDefines(Opts, Builder);
3643 }
3644};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003645} // end anonymous namespace.
3646
Ivan Krasinef05abd2011-08-24 20:22:22 +00003647namespace {
3648class PNaClTargetInfo : public TargetInfo {
3649public:
3650 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003651 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00003652 this->UserLabelPrefix = "";
3653 this->LongAlign = 32;
3654 this->LongWidth = 32;
3655 this->PointerAlign = 32;
3656 this->PointerWidth = 32;
3657 this->IntMaxType = TargetInfo::SignedLongLong;
3658 this->UIntMaxType = TargetInfo::UnsignedLongLong;
3659 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00003660 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00003661 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00003662 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00003663 this->SizeType = TargetInfo::UnsignedInt;
3664 this->PtrDiffType = TargetInfo::SignedInt;
3665 this->IntPtrType = TargetInfo::SignedInt;
David Meyerdd4a8892011-10-11 03:12:01 +00003666 this->RegParmMax = 2;
Ivan Krasinef05abd2011-08-24 20:22:22 +00003667 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
3668 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
3669 }
3670
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003671 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00003672 }
3673 virtual void getArchDefines(const LangOptions &Opts,
3674 MacroBuilder &Builder) const {
3675 Builder.defineMacro("__le32__");
3676 Builder.defineMacro("__pnacl__");
3677 }
3678 virtual void getTargetDefines(const LangOptions &Opts,
3679 MacroBuilder &Builder) const {
Ivan Krasin089ee112011-08-25 23:49:20 +00003680 DefineStd(Builder, "unix", Opts);
3681 Builder.defineMacro("__ELF__");
3682 if (Opts.POSIXThreads)
3683 Builder.defineMacro("_REENTRANT");
3684 if (Opts.CPlusPlus)
3685 Builder.defineMacro("_GNU_SOURCE");
3686
Ivan Krasinef05abd2011-08-24 20:22:22 +00003687 Builder.defineMacro("__native_client__");
3688 getArchDefines(Opts, Builder);
3689 }
3690 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3691 unsigned &NumRecords) const {
3692 }
3693 virtual const char *getVAListDeclaration() const {
Ivan Krasin68018db2011-09-20 14:56:54 +00003694 return "typedef int __builtin_va_list[4];";
Ivan Krasinef05abd2011-08-24 20:22:22 +00003695 }
3696 virtual void getGCCRegNames(const char * const *&Names,
3697 unsigned &NumNames) const;
3698 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3699 unsigned &NumAliases) const;
3700 virtual bool validateAsmConstraint(const char *&Name,
3701 TargetInfo::ConstraintInfo &Info) const {
3702 return false;
3703 }
3704
3705 virtual const char *getClobbers() const {
3706 return "";
3707 }
3708};
3709
3710void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
3711 unsigned &NumNames) const {
3712 Names = NULL;
3713 NumNames = 0;
3714}
3715
3716void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3717 unsigned &NumAliases) const {
3718 Aliases = NULL;
3719 NumAliases = 0;
3720}
3721} // end anonymous namespace.
3722
3723
Reid Spencer5f016e22007-07-11 17:01:13 +00003724//===----------------------------------------------------------------------===//
3725// Driver code
3726//===----------------------------------------------------------------------===//
3727
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003728static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003729 llvm::Triple Triple(T);
3730 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00003731
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003732 switch (Triple.getArch()) {
3733 default:
3734 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00003735
Tony Linthicum96319392011-12-12 21:14:55 +00003736 case llvm::Triple::hexagon:
3737 return new HexagonTargetInfo(T);
3738
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003739 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00003740 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003741 if (Triple.isOSDarwin())
3742 return new DarwinARMTargetInfo(T);
3743
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003744 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00003745 case llvm::Triple::Linux:
3746 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003747 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00003748 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003749 case llvm::Triple::NetBSD:
3750 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Douglas Gregordca52262011-07-01 22:41:14 +00003751 case llvm::Triple::RTEMS:
3752 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003753 default:
3754 return new ARMTargetInfo(T);
3755 }
Eli Friedman61538a72008-05-20 14:21:01 +00003756
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003757 case llvm::Triple::msp430:
3758 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00003759
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003760 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003761 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003762 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003763 return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003764 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003765 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003766 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003767 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003768 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003769 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003770 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003771 return new Mips32EBTargetInfo(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003772 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003773
3774 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003775 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003776 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003777 return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003778 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003779 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003780 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003781 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003782 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003783 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003784 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003785 return new Mips32ELTargetInfo(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003786 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003787
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003788 case llvm::Triple::mips64:
3789 switch (os) {
3790 case llvm::Triple::Linux:
3791 return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
3792 case llvm::Triple::RTEMS:
3793 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
3794 case llvm::Triple::FreeBSD:
3795 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
3796 case llvm::Triple::NetBSD:
3797 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
3798 default:
3799 return new Mips64EBTargetInfo(T);
3800 }
3801
3802 case llvm::Triple::mips64el:
3803 switch (os) {
3804 case llvm::Triple::Linux:
3805 return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
3806 case llvm::Triple::RTEMS:
3807 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
3808 case llvm::Triple::FreeBSD:
3809 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
3810 case llvm::Triple::NetBSD:
3811 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
3812 default:
3813 return new Mips64ELTargetInfo(T);
3814 }
3815
Ivan Krasinef05abd2011-08-24 20:22:22 +00003816 case llvm::Triple::le32:
3817 switch (os) {
3818 case llvm::Triple::NativeClient:
3819 return new PNaClTargetInfo(T);
3820 default:
3821 return NULL;
3822 }
3823
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003824 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003825 if (Triple.isOSDarwin())
Roman Divackyc81f2a22011-01-06 08:27:10 +00003826 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003827 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003828 case llvm::Triple::Linux:
3829 return new LinuxTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003830 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00003831 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003832 case llvm::Triple::NetBSD:
3833 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
3834 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00003835 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003836 default:
3837 return new PPC32TargetInfo(T);
3838 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003839
3840 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003841 if (Triple.isOSDarwin())
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00003842 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003843 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003844 case llvm::Triple::Linux:
3845 return new LinuxTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003846 case llvm::Triple::Lv2:
John Thompson3f6918a2009-11-19 17:18:50 +00003847 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003848 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00003849 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003850 case llvm::Triple::NetBSD:
3851 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
3852 default:
3853 return new PPC64TargetInfo(T);
3854 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003855
Justin Holewinski285dc652011-04-20 19:34:15 +00003856 case llvm::Triple::ptx32:
3857 return new PTX32TargetInfo(T);
3858 case llvm::Triple::ptx64:
3859 return new PTX64TargetInfo(T);
3860
Chris Lattner9cbeb632010-03-06 21:21:27 +00003861 case llvm::Triple::mblaze:
3862 return new MBlazeTargetInfo(T);
3863
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003864 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003865 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003866 case llvm::Triple::Linux:
3867 return new LinuxTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003868 case llvm::Triple::AuroraUX:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003869 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003870 case llvm::Triple::Solaris:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003871 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003872 case llvm::Triple::NetBSD:
3873 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
3874 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00003875 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003876 default:
3877 return new SparcV8TargetInfo(T);
3878 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003879
John Thompson3f6918a2009-11-19 17:18:50 +00003880 // FIXME: Need a real SPU target.
3881 case llvm::Triple::cellspu:
3882 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
3883
Eli Friedmanb63decf2009-08-19 20:47:07 +00003884 case llvm::Triple::tce:
3885 return new TCETargetInfo(T);
3886
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003887 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003888 if (Triple.isOSDarwin())
3889 return new DarwinI386TargetInfo(T);
3890
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003891 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003892 case llvm::Triple::AuroraUX:
3893 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003894 case llvm::Triple::Linux:
3895 return new LinuxTargetInfo<X86_32TargetInfo>(T);
3896 case llvm::Triple::DragonFly:
3897 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
3898 case llvm::Triple::NetBSD:
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003899 return new NetBSDI386TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003900 case llvm::Triple::OpenBSD:
3901 return new OpenBSDI386TargetInfo(T);
3902 case llvm::Triple::FreeBSD:
3903 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00003904 case llvm::Triple::Minix:
3905 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003906 case llvm::Triple::Solaris:
3907 return new SolarisTargetInfo<X86_32TargetInfo>(T);
3908 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003909 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003910 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003911 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003912 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00003913 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00003914 case llvm::Triple::Haiku:
3915 return new HaikuX86_32TargetInfo(T);
Douglas Gregordca52262011-07-01 22:41:14 +00003916 case llvm::Triple::RTEMS:
3917 return new RTEMSX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003918 default:
3919 return new X86_32TargetInfo(T);
3920 }
3921
3922 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003923 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
3924 return new DarwinX86_64TargetInfo(T);
3925
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003926 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003927 case llvm::Triple::AuroraUX:
3928 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003929 case llvm::Triple::Linux:
3930 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00003931 case llvm::Triple::DragonFly:
3932 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003933 case llvm::Triple::NetBSD:
3934 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
3935 case llvm::Triple::OpenBSD:
3936 return new OpenBSDX86_64TargetInfo(T);
3937 case llvm::Triple::FreeBSD:
3938 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
3939 case llvm::Triple::Solaris:
3940 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00003941 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003942 return new MinGWX86_64TargetInfo(T);
3943 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003944 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003945 default:
3946 return new X86_64TargetInfo(T);
3947 }
3948 }
Reid Spencer5f016e22007-07-11 17:01:13 +00003949}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003950
3951/// CreateTargetInfo - Return the target info object for the specified target
3952/// triple.
David Blaikied6471f72011-09-25 23:23:43 +00003953TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00003954 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003955 llvm::Triple Triple(Opts.Triple);
3956
3957 // Construct the target
3958 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
3959 if (!Target) {
3960 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
3961 return 0;
3962 }
3963
Daniel Dunbareac7c532009-12-18 18:42:37 +00003964 // Set the target CPU if specified.
3965 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
3966 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
3967 return 0;
3968 }
3969
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003970 // Set the target ABI if specified.
3971 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
3972 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
3973 return 0;
3974 }
3975
Charles Davis98b7c5c2010-06-11 01:06:47 +00003976 // Set the target C++ ABI.
John McCallee79a4c2010-08-21 22:46:04 +00003977 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis98b7c5c2010-06-11 01:06:47 +00003978 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
3979 return 0;
3980 }
3981
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003982 // Compute the default target features, we need the target to handle this
3983 // because features may have dependencies on one another.
3984 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003985 Target->getDefaultFeatures(Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003986
3987 // Apply the user specified deltas.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00003988 // First the enables.
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003989 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
3990 ie = Opts.Features.end(); it != ie; ++it) {
3991 const char *Name = it->c_str();
3992
Rafael Espindola53ac3d82011-11-27 20:00:43 +00003993 if (Name[0] != '+')
3994 continue;
3995
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003996 // Apply the feature via the target.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00003997 if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
3998 Diags.Report(diag::err_target_invalid_feature) << Name;
3999 return 0;
4000 }
4001 }
4002
4003 // Then the disables.
4004 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
4005 ie = Opts.Features.end(); it != ie; ++it) {
4006 const char *Name = it->c_str();
4007
4008 if (Name[0] == '+')
4009 continue;
4010
4011 // Apply the feature via the target.
4012 if (Name[0] != '-' ||
4013 !Target->setFeatureEnabled(Features, Name + 1, false)) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004014 Diags.Report(diag::err_target_invalid_feature) << Name;
4015 return 0;
4016 }
4017 }
4018
4019 // Add the features to the compile options.
4020 //
4021 // FIXME: If we are completely confident that we have the right set, we only
4022 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00004023 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004024 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
4025 ie = Features.end(); it != ie; ++it)
Chris Lattner1e5f83b2011-07-14 18:24:21 +00004026 Opts.Features.push_back(std::string(it->second ? "+" : "-") +
Chris Lattner48b78bd2011-07-14 18:45:41 +00004027 it->first().str());
Daniel Dunbarb93292a2009-12-19 03:30:57 +00004028 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004029
4030 return Target.take();
4031}