blob: a55714229063d40e49d1b6746c1a29a909f30257 [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
Sebastian Pop9ec60df2012-01-20 22:01:23 +0000151 // If -target arch-pc-win32-macho option specified, we're
Eric Christopher895d4222011-07-29 21:20:35 +0000152 // generating code for Win32 ABI. No need to emit
Chad Rosierd9259f32011-07-19 20:00:06 +0000153 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
154 if (PlatformName == "win32") {
155 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
156 return;
157 }
158
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000159 // Set the appropriate OS version define.
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000160 if (PlatformName == "ios") {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000161 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000162 char Str[6];
163 Str[0] = '0' + Maj;
164 Str[1] = '0' + (Min / 10);
165 Str[2] = '0' + (Min % 10);
166 Str[3] = '0' + (Rev / 10);
167 Str[4] = '0' + (Rev % 10);
168 Str[5] = '\0';
169 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
170 } else {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000171 // Note that the Driver allows versions which aren't representable in the
172 // define (because we only get a single digit for the minor and micro
173 // revision numbers). So, we limit them to the maximum representable
174 // version.
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000175 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000176 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000177 char Str[5];
178 Str[0] = '0' + (Maj / 10);
179 Str[1] = '0' + (Maj % 10);
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000180 Str[2] = '0' + std::min(Min, 9U);
181 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000182 Str[4] = '\0';
183 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000184 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000185
186 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman618234a2008-08-20 02:34:37 +0000187}
Reid Spencer5f016e22007-07-11 17:01:13 +0000188
Chris Lattner797c3c42009-08-10 19:03:04 +0000189namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000190template<typename Target>
191class DarwinTargetInfo : public OSTargetInfo<Target> {
192protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000193 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000194 MacroBuilder &Builder) const {
Eric Christopher7c9adf92011-07-07 22:55:26 +0000195 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000196 this->PlatformMinVersion);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000197 }
Mike Stump1eb44332009-09-09 15:08:12 +0000198
Torok Edwin5f6c1942009-06-30 17:10:35 +0000199public:
200 DarwinTargetInfo(const std::string& triple) :
201 OSTargetInfo<Target>(triple) {
Eric Christopheraa7333c2011-07-02 00:20:22 +0000202 llvm::Triple T = llvm::Triple(triple);
203 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
Daniel Dunbare177d3b2011-02-21 23:12:51 +0000204 this->MCountName = "\01mcount";
Torok Edwin5f6c1942009-06-30 17:10:35 +0000205 }
206
Chris Lattner5f9e2722011-07-23 10:55:15 +0000207 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner797c3c42009-08-10 19:03:04 +0000208 // Let MCSectionMachO validate this.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000209 StringRef Segment, Section;
Chris Lattner797c3c42009-08-10 19:03:04 +0000210 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000211 bool HasTAA;
Chris Lattner797c3c42009-08-10 19:03:04 +0000212 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000213 TAA, HasTAA, StubSize);
Chris Lattner797c3c42009-08-10 19:03:04 +0000214 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000215
Anders Carlsson18af3682010-06-08 22:47:50 +0000216 virtual const char *getStaticInitSectionSpecifier() const {
217 // FIXME: We should return 0 when building kexts.
218 return "__TEXT,__StaticInit,regular,pure_instructions";
219 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000220
Torok Edwin5f6c1942009-06-30 17:10:35 +0000221};
222
Chris Lattner797c3c42009-08-10 19:03:04 +0000223
Torok Edwin5f6c1942009-06-30 17:10:35 +0000224// DragonFlyBSD Target
225template<typename Target>
226class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
227protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000228 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000229 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000230 // DragonFly defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000231 Builder.defineMacro("__DragonFly__");
232 Builder.defineMacro("__DragonFly_cc_version", "100001");
233 Builder.defineMacro("__ELF__");
234 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
235 Builder.defineMacro("__tune_i386__");
236 DefineStd(Builder, "unix", Opts);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000237 }
238public:
Mike Stump1eb44332009-09-09 15:08:12 +0000239 DragonFlyBSDTargetInfo(const std::string &triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000240 : OSTargetInfo<Target>(triple) {}
241};
242
243// FreeBSD Target
244template<typename Target>
245class FreeBSDTargetInfo : public OSTargetInfo<Target> {
246protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000247 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000248 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000249 // FreeBSD defines; list based off of gcc output
250
Benjamin Kramer474202f2011-10-18 10:10:08 +0000251 unsigned Release = Triple.getOSMajorVersion();
252 if (Release == 0U)
253 Release = 8;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000254
Benjamin Kramer474202f2011-10-18 10:10:08 +0000255 Builder.defineMacro("__FreeBSD__", Twine(Release));
256 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramera9992772010-01-09 17:55:51 +0000257 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
258 DefineStd(Builder, "unix", Opts);
259 Builder.defineMacro("__ELF__");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000260 }
261public:
Mike Stump1eb44332009-09-09 15:08:12 +0000262 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands1e90faf2009-07-08 13:55:08 +0000263 : OSTargetInfo<Target>(triple) {
264 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000265
266 llvm::Triple Triple(triple);
267 switch (Triple.getArch()) {
268 default:
269 case llvm::Triple::x86:
270 case llvm::Triple::x86_64:
271 this->MCountName = ".mcount";
272 break;
273 case llvm::Triple::mips:
274 case llvm::Triple::mipsel:
275 case llvm::Triple::ppc:
276 case llvm::Triple::ppc64:
277 this->MCountName = "_mcount";
278 break;
279 case llvm::Triple::arm:
280 this->MCountName = "__mcount";
281 break;
282 }
283
Duncan Sands1e90faf2009-07-08 13:55:08 +0000284 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000285};
286
Chris Lattner38e317d2010-07-07 16:01:42 +0000287// Minix Target
288template<typename Target>
289class MinixTargetInfo : public OSTargetInfo<Target> {
290protected:
291 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
292 MacroBuilder &Builder) const {
293 // Minix defines
294
295 Builder.defineMacro("__minix", "3");
296 Builder.defineMacro("_EM_WSIZE", "4");
297 Builder.defineMacro("_EM_PSIZE", "4");
298 Builder.defineMacro("_EM_SSIZE", "2");
299 Builder.defineMacro("_EM_LSIZE", "4");
300 Builder.defineMacro("_EM_FSIZE", "4");
301 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman6d402dc2011-12-08 23:54:21 +0000302 Builder.defineMacro("__ELF__");
Chris Lattner38e317d2010-07-07 16:01:42 +0000303 DefineStd(Builder, "unix", Opts);
304 }
305public:
306 MinixTargetInfo(const std::string &triple)
307 : OSTargetInfo<Target>(triple) {
308 this->UserLabelPrefix = "";
309 }
310};
311
Torok Edwin5f6c1942009-06-30 17:10:35 +0000312// Linux target
313template<typename Target>
314class LinuxTargetInfo : public OSTargetInfo<Target> {
315protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000316 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000317 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000318 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000319 DefineStd(Builder, "unix", Opts);
320 DefineStd(Builder, "linux", Opts);
321 Builder.defineMacro("__gnu_linux__");
322 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000323 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000324 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000325 if (Opts.CPlusPlus)
326 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000327 }
328public:
Mike Stump1eb44332009-09-09 15:08:12 +0000329 LinuxTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000330 : OSTargetInfo<Target>(triple) {
331 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000332 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000333 }
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000334
335 virtual const char *getStaticInitSectionSpecifier() const {
336 return ".text.startup";
337 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000338};
339
Chris Lattnerb62bb282009-07-13 20:29:08 +0000340// NetBSD Target
341template<typename Target>
342class NetBSDTargetInfo : public OSTargetInfo<Target> {
343protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000344 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000345 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000346 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000347 Builder.defineMacro("__NetBSD__");
348 Builder.defineMacro("__unix__");
349 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000350 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000351 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000352 }
353public:
Mike Stump1eb44332009-09-09 15:08:12 +0000354 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerb62bb282009-07-13 20:29:08 +0000355 : OSTargetInfo<Target>(triple) {
356 this->UserLabelPrefix = "";
357 }
358};
359
Torok Edwin5f6c1942009-06-30 17:10:35 +0000360// OpenBSD Target
361template<typename Target>
362class OpenBSDTargetInfo : public OSTargetInfo<Target> {
363protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000364 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000365 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000366 // OpenBSD defines; list based off of gcc output
367
Benjamin Kramera9992772010-01-09 17:55:51 +0000368 Builder.defineMacro("__OpenBSD__");
369 DefineStd(Builder, "unix", Opts);
370 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000371 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000372 Builder.defineMacro("_POSIX_THREADS");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000373 }
374public:
Mike Stump1eb44332009-09-09 15:08:12 +0000375 OpenBSDTargetInfo(const std::string &triple)
Eli Friedman62d829a2011-12-15 02:15:56 +0000376 : OSTargetInfo<Target>(triple) {
377 this->UserLabelPrefix = "";
378
379 llvm::Triple Triple(triple);
380 switch (Triple.getArch()) {
381 default:
382 case llvm::Triple::x86:
383 case llvm::Triple::x86_64:
384 case llvm::Triple::arm:
385 case llvm::Triple::sparc:
386 this->MCountName = "__mcount";
387 break;
388 case llvm::Triple::mips64:
389 case llvm::Triple::mips64el:
390 case llvm::Triple::ppc:
391 case llvm::Triple::sparcv9:
392 this->MCountName = "_mcount";
393 break;
394 }
395 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000396};
397
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000398// PSP Target
399template<typename Target>
400class PSPTargetInfo : public OSTargetInfo<Target> {
401protected:
402 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000403 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000404 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000405 Builder.defineMacro("PSP");
406 Builder.defineMacro("_PSP");
407 Builder.defineMacro("__psp__");
408 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000409 }
410public:
411 PSPTargetInfo(const std::string& triple)
412 : OSTargetInfo<Target>(triple) {
413 this->UserLabelPrefix = "";
414 }
415};
416
John Thompson3f6918a2009-11-19 17:18:50 +0000417// PS3 PPU Target
418template<typename Target>
419class PS3PPUTargetInfo : public OSTargetInfo<Target> {
420protected:
421 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000422 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000423 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000424 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000425 Builder.defineMacro("__PPU__");
426 Builder.defineMacro("__CELLOS_LV2__");
427 Builder.defineMacro("__ELF__");
428 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000429 Builder.defineMacro("_ARCH_PPC64");
430 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000431 }
432public:
433 PS3PPUTargetInfo(const std::string& triple)
434 : OSTargetInfo<Target>(triple) {
435 this->UserLabelPrefix = "";
Nick Lewycky99520702011-12-16 22:32:39 +0000436 this->LongWidth = this->LongAlign = 32;
437 this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000438 this->IntMaxType = TargetInfo::SignedLongLong;
439 this->UIntMaxType = TargetInfo::UnsignedLongLong;
440 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000441 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000442 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Nick Lewycky99520702011-12-16 22:32:39 +0000443 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000444 }
445};
446
447// FIXME: Need a real SPU target.
448// PS3 SPU Target
449template<typename Target>
450class PS3SPUTargetInfo : public OSTargetInfo<Target> {
451protected:
452 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000453 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000454 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000455 Builder.defineMacro("__SPU__");
456 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000457 }
458public:
459 PS3SPUTargetInfo(const std::string& triple)
460 : OSTargetInfo<Target>(triple) {
461 this->UserLabelPrefix = "";
462 }
463};
464
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000465// AuroraUX target
466template<typename Target>
467class AuroraUXTargetInfo : public OSTargetInfo<Target> {
468protected:
469 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000470 MacroBuilder &Builder) const {
471 DefineStd(Builder, "sun", Opts);
472 DefineStd(Builder, "unix", Opts);
473 Builder.defineMacro("__ELF__");
474 Builder.defineMacro("__svr4__");
475 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000476 }
477public:
478 AuroraUXTargetInfo(const std::string& triple)
479 : OSTargetInfo<Target>(triple) {
480 this->UserLabelPrefix = "";
481 this->WCharType = this->SignedLong;
482 // FIXME: WIntType should be SignedLong
483 }
484};
485
Torok Edwin5f6c1942009-06-30 17:10:35 +0000486// Solaris target
487template<typename Target>
488class SolarisTargetInfo : public OSTargetInfo<Target> {
489protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000490 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000491 MacroBuilder &Builder) const {
492 DefineStd(Builder, "sun", Opts);
493 DefineStd(Builder, "unix", Opts);
494 Builder.defineMacro("__ELF__");
495 Builder.defineMacro("__svr4__");
496 Builder.defineMacro("__SVR4");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000497 }
498public:
Mike Stump1eb44332009-09-09 15:08:12 +0000499 SolarisTargetInfo(const std::string& triple)
Torok Edwin5f6c1942009-06-30 17:10:35 +0000500 : OSTargetInfo<Target>(triple) {
501 this->UserLabelPrefix = "";
502 this->WCharType = this->SignedLong;
503 // FIXME: WIntType should be SignedLong
504 }
505};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000506
507// Windows target
508template<typename Target>
509class WindowsTargetInfo : public OSTargetInfo<Target> {
510protected:
511 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
512 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000513 Builder.defineMacro("_WIN32");
514 }
515 void getVisualStudioDefines(const LangOptions &Opts,
516 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000517 if (Opts.CPlusPlus) {
518 if (Opts.RTTI)
519 Builder.defineMacro("_CPPRTTI");
520
521 if (Opts.Exceptions)
522 Builder.defineMacro("_CPPUNWIND");
523 }
524
525 if (!Opts.CharIsSigned)
526 Builder.defineMacro("_CHAR_UNSIGNED");
527
528 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
529 // but it works for now.
530 if (Opts.POSIXThreads)
531 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000532
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000533 if (Opts.MSCVersion != 0)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000534 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000535
Francois Pichet62ec1f22011-09-17 17:15:52 +0000536 if (Opts.MicrosoftExt) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000537 Builder.defineMacro("_MSC_EXTENSIONS");
538
539 if (Opts.CPlusPlus0x) {
540 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
541 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
542 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
543 }
544 }
545
546 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000547 }
548
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000549public:
550 WindowsTargetInfo(const std::string &triple)
551 : OSTargetInfo<Target>(triple) {}
552};
553
Mike Stump1eb44332009-09-09 15:08:12 +0000554} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000555
Chris Lattnerd29b6302008-10-05 21:50:58 +0000556//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000557// Specific target implementations.
558//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000559
Eli Friedmane4277982008-08-20 23:11:40 +0000560namespace {
561// PPC abstract base class
562class PPCTargetInfo : public TargetInfo {
563 static const Builtin::Info BuiltinInfo[];
564 static const char * const GCCRegNames[];
565 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Eli Friedmane4277982008-08-20 23:11:40 +0000566public:
Eli Friedman15b91762009-06-05 07:05:05 +0000567 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
568
Eli Friedmane4277982008-08-20 23:11:40 +0000569 virtual void getTargetBuiltins(const Builtin::Info *&Records,
570 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000571 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000572 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000573 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000574
Chris Lattner33328642009-03-20 15:52:06 +0000575 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000576 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000577
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000578 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000579 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000580 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000581 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000582 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000583 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000584 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000585 default: return false;
586 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000587 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000588 case 'b': // Base register
589 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000590 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000591 break;
592 // FIXME: The following are added to allow parsing.
593 // I just took a guess at what the actions should be.
594 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000595 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000596 case 'v': // Altivec vector register
597 Info.setAllowsRegister();
598 break;
599 case 'w':
600 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000601 case 'd':// VSX vector register to hold vector double data
602 case 'f':// VSX vector register to hold vector float data
603 case 's':// VSX vector register to hold scalar float data
604 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000605 break;
606 default:
607 return false;
608 }
609 Info.setAllowsRegister();
610 Name++; // Skip over 'w'.
611 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000612 case 'h': // `MQ', `CTR', or `LINK' register
613 case 'q': // `MQ' register
614 case 'c': // `CTR' register
615 case 'l': // `LINK' register
616 case 'x': // `CR' register (condition register) number 0
617 case 'y': // `CR' register (condition register)
618 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000619 Info.setAllowsRegister();
620 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000621 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000622 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000623 // (use `L' instead for SImode constants)
624 case 'K': // Unsigned 16-bit constant
625 case 'L': // Signed 16-bit constant shifted left 16 bits
626 case 'M': // Constant larger than 31
627 case 'N': // Exact power of 2
628 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000629 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000630 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000631 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000632 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000633 break;
634 case 'm': // Memory operand. Note that on PowerPC targets, m can
635 // include addresses that update the base register. It
636 // is therefore only safe to use `m' in an asm statement
637 // if that asm statement accesses the operand exactly once.
638 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000639 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000640 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000641 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000642 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000643 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
644 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000645 // register to be updated.
646 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000647 if (Name[1] != 's')
648 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000649 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000650 // include any automodification of the base register. Unlike
651 // `m', this constraint can be used in asm statements that
652 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000653 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000654 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000655 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000656 break;
657 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000658 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000659 case 'Z': // Memory operand that is an indexed or indirect from a
660 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000661 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000662 Info.setAllowsMemory();
663 Info.setAllowsRegister();
664 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000665 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000666 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000667 // register (`p' is preferable for asm statements)
668 case 'S': // Constant suitable as a 64-bit mask operand
669 case 'T': // Constant suitable as a 32-bit mask operand
670 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000671 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000672 // instructions
673 case 'W': // Vector constant that does not require memory
674 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000675 break;
676 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000677 }
John Thompson8e6065a2010-06-24 22:44:13 +0000678 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000679 }
Eli Friedmane4277982008-08-20 23:11:40 +0000680 virtual const char *getClobbers() const {
681 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000682 }
Eli Friedmane4277982008-08-20 23:11:40 +0000683};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000684
Eli Friedmane4277982008-08-20 23:11:40 +0000685const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000686#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000687#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000688 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000689#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000690};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000691
692
Chris Lattnerc0f59212009-03-02 22:27:17 +0000693/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
694/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000695void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000696 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000697 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000698 Builder.defineMacro("__ppc__");
699 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000700 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000701 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000702 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000703 Builder.defineMacro("_ARCH_PPC64");
704 Builder.defineMacro("_LP64");
705 Builder.defineMacro("__LP64__");
Chris Lattnere03ae302010-02-16 18:14:57 +0000706 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000707 Builder.defineMacro("__ppc64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000708 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +0000709 Builder.defineMacro("__ppc__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000710 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000711
Chris Lattnerc0f59212009-03-02 22:27:17 +0000712 // Target properties.
Joerg Sonnenberger7cd1de52011-07-05 14:56:12 +0000713 if (getTriple().getOS() != llvm::Triple::NetBSD)
714 Builder.defineMacro("_BIG_ENDIAN");
Benjamin Kramera9992772010-01-09 17:55:51 +0000715 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000716
Chris Lattnerc0f59212009-03-02 22:27:17 +0000717 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000718 Builder.defineMacro("__NATURAL_ALIGNMENT__");
719 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000720
Chris Lattnerc0f59212009-03-02 22:27:17 +0000721 // FIXME: Should be controlled by command line option.
Benjamin Kramera9992772010-01-09 17:55:51 +0000722 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000723
John Thompson3f6918a2009-11-19 17:18:50 +0000724 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000725 Builder.defineMacro("__VEC__", "10206");
726 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000727 }
Chris Lattnerc0f59212009-03-02 22:27:17 +0000728}
729
Chris Lattner393ff042008-04-21 18:56:49 +0000730
Eli Friedmane4277982008-08-20 23:11:40 +0000731const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +0000732 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
733 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
734 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
735 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
736 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
737 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
738 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
739 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +0000740 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000741 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +0000742 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +0000743 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
744 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
745 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
746 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +0000747 "vrsave", "vscr",
748 "spe_acc", "spefscr",
749 "sfp"
750};
Reid Spencer5f016e22007-07-11 17:01:13 +0000751
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000752void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000753 unsigned &NumNames) const {
754 Names = GCCRegNames;
755 NumNames = llvm::array_lengthof(GCCRegNames);
756}
Reid Spencer5f016e22007-07-11 17:01:13 +0000757
Eli Friedmane4277982008-08-20 23:11:40 +0000758const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
759 // While some of these aliases do map to different registers
760 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000761 { { "0" }, "r0" },
762 { { "1"}, "r1" },
763 { { "2" }, "r2" },
764 { { "3" }, "r3" },
765 { { "4" }, "r4" },
766 { { "5" }, "r5" },
767 { { "6" }, "r6" },
768 { { "7" }, "r7" },
769 { { "8" }, "r8" },
770 { { "9" }, "r9" },
771 { { "10" }, "r10" },
772 { { "11" }, "r11" },
773 { { "12" }, "r12" },
774 { { "13" }, "r13" },
775 { { "14" }, "r14" },
776 { { "15" }, "r15" },
777 { { "16" }, "r16" },
778 { { "17" }, "r17" },
779 { { "18" }, "r18" },
780 { { "19" }, "r19" },
781 { { "20" }, "r20" },
782 { { "21" }, "r21" },
783 { { "22" }, "r22" },
784 { { "23" }, "r23" },
785 { { "24" }, "r24" },
786 { { "25" }, "r25" },
787 { { "26" }, "r26" },
788 { { "27" }, "r27" },
789 { { "28" }, "r28" },
790 { { "29" }, "r29" },
791 { { "30" }, "r30" },
792 { { "31" }, "r31" },
793 { { "fr0" }, "f0" },
794 { { "fr1" }, "f1" },
795 { { "fr2" }, "f2" },
796 { { "fr3" }, "f3" },
797 { { "fr4" }, "f4" },
798 { { "fr5" }, "f5" },
799 { { "fr6" }, "f6" },
800 { { "fr7" }, "f7" },
801 { { "fr8" }, "f8" },
802 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +0000803 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +0000804 { { "fr11" }, "f11" },
805 { { "fr12" }, "f12" },
806 { { "fr13" }, "f13" },
807 { { "fr14" }, "f14" },
808 { { "fr15" }, "f15" },
809 { { "fr16" }, "f16" },
810 { { "fr17" }, "f17" },
811 { { "fr18" }, "f18" },
812 { { "fr19" }, "f19" },
813 { { "fr20" }, "f20" },
814 { { "fr21" }, "f21" },
815 { { "fr22" }, "f22" },
816 { { "fr23" }, "f23" },
817 { { "fr24" }, "f24" },
818 { { "fr25" }, "f25" },
819 { { "fr26" }, "f26" },
820 { { "fr27" }, "f27" },
821 { { "fr28" }, "f28" },
822 { { "fr29" }, "f29" },
823 { { "fr30" }, "f30" },
824 { { "fr31" }, "f31" },
825 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +0000826};
827
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000828void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000829 unsigned &NumAliases) const {
830 Aliases = GCCRegAliases;
831 NumAliases = llvm::array_lengthof(GCCRegAliases);
832}
833} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +0000834
835namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000836class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000837public:
Chris Lattnere03ae302010-02-16 18:14:57 +0000838 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +0000839 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +0000840 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +0000841
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +0000842 switch (getTriple().getOS()) {
843 case llvm::Triple::FreeBSD:
844 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +0000845 SizeType = UnsignedInt;
846 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +0000847 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +0000848 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +0000849 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000850 }
851
852 virtual const char *getVAListDeclaration() const {
853 // This is the ELF definition, and is overridden by the Darwin sub-target
854 return "typedef struct __va_list_tag {"
855 " unsigned char gpr;"
856 " unsigned char fpr;"
857 " unsigned short reserved;"
858 " void* overflow_arg_area;"
859 " void* reg_save_area;"
860 "} __builtin_va_list[1];";
Eli Friedmaned855cb2008-08-21 00:13:15 +0000861 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000862};
863} // end anonymous namespace.
864
865namespace {
Eli Friedmane4277982008-08-20 23:11:40 +0000866class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +0000867public:
Eli Friedmane4277982008-08-20 23:11:40 +0000868 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +0000869 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +0000870 IntMaxType = SignedLong;
871 UIntMaxType = UnsignedLong;
872 Int64Type = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +0000873 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner1932e122009-11-07 18:59:41 +0000874 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnerf291b102008-05-09 06:17:04 +0000875 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000876 virtual const char *getVAListDeclaration() const {
877 return "typedef char* __builtin_va_list;";
878 }
Eli Friedmane4277982008-08-20 23:11:40 +0000879};
880} // end anonymous namespace.
881
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000882
883namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +0000884class DarwinPPC32TargetInfo :
885 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000886public:
Roman Divackyc81f2a22011-01-06 08:27:10 +0000887 DarwinPPC32TargetInfo(const std::string& triple)
888 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000889 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +0000890 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Anton Yartsev9bc23ba2012-01-17 22:40:00 +0000891 LongLongAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +0000892 SuitableAlign = 128;
Anton Yartsev9bc23ba2012-01-17 22:40:00 +0000893 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
894 "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
Roman Divackyc81f2a22011-01-06 08:27:10 +0000895 }
896 virtual const char *getVAListDeclaration() const {
897 return "typedef char* __builtin_va_list;";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000898 }
899};
900
901class DarwinPPC64TargetInfo :
902 public DarwinTargetInfo<PPC64TargetInfo> {
903public:
904 DarwinPPC64TargetInfo(const std::string& triple)
905 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
906 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +0000907 SuitableAlign = 128;
Daniel Dunbar4c6a2262010-05-30 00:07:30 +0000908 }
909};
910} // end anonymous namespace.
911
Reid Spencer5f016e22007-07-11 17:01:13 +0000912namespace {
Justin Holewinski25bedca2011-10-03 17:28:37 +0000913 static const unsigned PTXAddrSpaceMap[] = {
914 0, // opencl_global
915 4, // opencl_local
916 1 // opencl_constant
917 };
Justin Holewinski285dc652011-04-20 19:34:15 +0000918 class PTXTargetInfo : public TargetInfo {
919 static const char * const GCCRegNames[];
920 static const Builtin::Info BuiltinInfo[];
Justin Holewinskid8e0fe62011-09-22 17:57:40 +0000921 std::vector<llvm::StringRef> AvailableFeatures;
Justin Holewinski285dc652011-04-20 19:34:15 +0000922 public:
923 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +0000924 BigEndian = false;
Justin Holewinski285dc652011-04-20 19:34:15 +0000925 TLSSupported = false;
926 LongWidth = LongAlign = 64;
Justin Holewinski25bedca2011-10-03 17:28:37 +0000927 AddrSpaceMap = &PTXAddrSpaceMap;
Justin Holewinskid8e0fe62011-09-22 17:57:40 +0000928 // Define available target features
929 // These must be defined in sorted order!
930 AvailableFeatures.push_back("compute10");
931 AvailableFeatures.push_back("compute11");
932 AvailableFeatures.push_back("compute12");
933 AvailableFeatures.push_back("compute13");
934 AvailableFeatures.push_back("compute20");
935 AvailableFeatures.push_back("double");
936 AvailableFeatures.push_back("no-fma");
937 AvailableFeatures.push_back("ptx20");
938 AvailableFeatures.push_back("ptx21");
939 AvailableFeatures.push_back("ptx22");
940 AvailableFeatures.push_back("ptx23");
941 AvailableFeatures.push_back("sm10");
942 AvailableFeatures.push_back("sm11");
943 AvailableFeatures.push_back("sm12");
944 AvailableFeatures.push_back("sm13");
945 AvailableFeatures.push_back("sm20");
946 AvailableFeatures.push_back("sm21");
947 AvailableFeatures.push_back("sm22");
948 AvailableFeatures.push_back("sm23");
Justin Holewinski285dc652011-04-20 19:34:15 +0000949 }
950 virtual void getTargetDefines(const LangOptions &Opts,
951 MacroBuilder &Builder) const {
952 Builder.defineMacro("__PTX__");
953 }
954 virtual void getTargetBuiltins(const Builtin::Info *&Records,
955 unsigned &NumRecords) const {
956 Records = BuiltinInfo;
957 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
958 }
959
960 virtual void getGCCRegNames(const char * const *&Names,
961 unsigned &NumNames) const;
962 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
963 unsigned &NumAliases) const {
964 // No aliases.
965 Aliases = 0;
966 NumAliases = 0;
967 }
968 virtual bool validateAsmConstraint(const char *&Name,
969 TargetInfo::ConstraintInfo &info) const {
970 // FIXME: implement
971 return true;
972 }
973 virtual const char *getClobbers() const {
974 // FIXME: Is this really right?
975 return "";
976 }
977 virtual const char *getVAListDeclaration() const {
978 // FIXME: implement
979 return "typedef char* __builtin_va_list;";
980 }
Justin Holewinski808ef662011-09-15 12:13:38 +0000981
982 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
983 const std::string &Name,
984 bool Enabled) const;
Justin Holewinski285dc652011-04-20 19:34:15 +0000985 };
986
987 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000988#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +0000989#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000990 ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +0000991#include "clang/Basic/BuiltinsPTX.def"
992 };
993
994 const char * const PTXTargetInfo::GCCRegNames[] = {
995 "r0"
996 };
997
998 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
999 unsigned &NumNames) const {
1000 Names = GCCRegNames;
1001 NumNames = llvm::array_lengthof(GCCRegNames);
1002 }
1003
Justin Holewinski808ef662011-09-15 12:13:38 +00001004 bool PTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1005 const std::string &Name,
1006 bool Enabled) const {
Justin Holewinskid8e0fe62011-09-22 17:57:40 +00001007 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1008 Name)) {
1009 Features[Name] = Enabled;
1010 return true;
Justin Holewinski808ef662011-09-15 12:13:38 +00001011 } else {
Justin Holewinskid8e0fe62011-09-22 17:57:40 +00001012 return false;
Justin Holewinski808ef662011-09-15 12:13:38 +00001013 }
Justin Holewinski808ef662011-09-15 12:13:38 +00001014 }
Justin Holewinski285dc652011-04-20 19:34:15 +00001015
1016 class PTX32TargetInfo : public PTXTargetInfo {
1017 public:
1018 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1019 PointerWidth = PointerAlign = 32;
1020 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
1021 DescriptionString
1022 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
1023 }
1024 };
1025
1026 class PTX64TargetInfo : public PTXTargetInfo {
1027 public:
1028 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
1029 PointerWidth = PointerAlign = 64;
1030 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
1031 DescriptionString
1032 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
1033 }
1034 };
1035}
1036
1037namespace {
Chris Lattner9cbeb632010-03-06 21:21:27 +00001038// MBlaze abstract base class
1039class MBlazeTargetInfo : public TargetInfo {
1040 static const char * const GCCRegNames[];
1041 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1042
1043public:
1044 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +00001045 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner9cbeb632010-03-06 21:21:27 +00001046 }
1047
1048 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1049 unsigned &NumRecords) const {
1050 // FIXME: Implement.
1051 Records = 0;
1052 NumRecords = 0;
1053 }
1054
1055 virtual void getTargetDefines(const LangOptions &Opts,
1056 MacroBuilder &Builder) const;
1057
1058 virtual const char *getVAListDeclaration() const {
1059 return "typedef char* __builtin_va_list;";
1060 }
1061 virtual const char *getTargetPrefix() const {
1062 return "mblaze";
1063 }
1064 virtual void getGCCRegNames(const char * const *&Names,
1065 unsigned &NumNames) const;
1066 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1067 unsigned &NumAliases) const;
1068 virtual bool validateAsmConstraint(const char *&Name,
1069 TargetInfo::ConstraintInfo &Info) const {
1070 switch (*Name) {
1071 default: return false;
1072 case 'O': // Zero
1073 return true;
1074 case 'b': // Base register
1075 case 'f': // Floating point register
1076 Info.setAllowsRegister();
1077 return true;
1078 }
1079 }
1080 virtual const char *getClobbers() const {
1081 return "";
1082 }
1083};
1084
1085/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1086/// #defines that are not tied to a specific subtarget.
1087void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1088 MacroBuilder &Builder) const {
1089 // Target identification.
1090 Builder.defineMacro("__microblaze__");
1091 Builder.defineMacro("_ARCH_MICROBLAZE");
1092 Builder.defineMacro("__MICROBLAZE__");
1093
1094 // Target properties.
1095 Builder.defineMacro("_BIG_ENDIAN");
1096 Builder.defineMacro("__BIG_ENDIAN__");
1097
1098 // Subtarget options.
1099 Builder.defineMacro("__REGISTER_PREFIX__", "");
1100}
1101
1102
1103const char * const MBlazeTargetInfo::GCCRegNames[] = {
1104 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1105 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1106 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1107 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1108 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1109 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1110 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1111 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1112 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1113 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1114};
1115
1116void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1117 unsigned &NumNames) const {
1118 Names = GCCRegNames;
1119 NumNames = llvm::array_lengthof(GCCRegNames);
1120}
1121
1122const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1123 { {"f0"}, "r0" },
1124 { {"f1"}, "r1" },
1125 { {"f2"}, "r2" },
1126 { {"f3"}, "r3" },
1127 { {"f4"}, "r4" },
1128 { {"f5"}, "r5" },
1129 { {"f6"}, "r6" },
1130 { {"f7"}, "r7" },
1131 { {"f8"}, "r8" },
1132 { {"f9"}, "r9" },
1133 { {"f10"}, "r10" },
1134 { {"f11"}, "r11" },
1135 { {"f12"}, "r12" },
1136 { {"f13"}, "r13" },
1137 { {"f14"}, "r14" },
1138 { {"f15"}, "r15" },
1139 { {"f16"}, "r16" },
1140 { {"f17"}, "r17" },
1141 { {"f18"}, "r18" },
1142 { {"f19"}, "r19" },
1143 { {"f20"}, "r20" },
1144 { {"f21"}, "r21" },
1145 { {"f22"}, "r22" },
1146 { {"f23"}, "r23" },
1147 { {"f24"}, "r24" },
1148 { {"f25"}, "r25" },
1149 { {"f26"}, "r26" },
1150 { {"f27"}, "r27" },
1151 { {"f28"}, "r28" },
1152 { {"f29"}, "r29" },
1153 { {"f30"}, "r30" },
1154 { {"f31"}, "r31" },
1155};
1156
1157void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1158 unsigned &NumAliases) const {
1159 Aliases = GCCRegAliases;
1160 NumAliases = llvm::array_lengthof(GCCRegAliases);
1161}
1162} // end anonymous namespace.
1163
1164namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001165// Namespace for x86 abstract base class
1166const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001167#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001168#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001169 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +00001170#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +00001171};
Eli Friedman61538a72008-05-20 14:21:01 +00001172
Nuno Lopes2550d702009-12-23 17:49:57 +00001173static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +00001174 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1175 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001176 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman618234a2008-08-20 02:34:37 +00001177 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1178 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1179 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001180 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001181 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1182 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman618234a2008-08-20 02:34:37 +00001183};
1184
Eric Christophercfd323d2011-06-21 00:05:20 +00001185const TargetInfo::AddlRegName AddlRegNames[] = {
1186 { { "al", "ah", "eax", "rax" }, 0 },
1187 { { "bl", "bh", "ebx", "rbx" }, 3 },
1188 { { "cl", "ch", "ecx", "rcx" }, 2 },
1189 { { "dl", "dh", "edx", "rdx" }, 1 },
1190 { { "esi", "rsi" }, 4 },
1191 { { "edi", "rdi" }, 5 },
1192 { { "esp", "rsp" }, 7 },
1193 { { "ebp", "rbp" }, 6 },
Eli Friedman618234a2008-08-20 02:34:37 +00001194};
1195
1196// X86 target abstract base class; x86-32 and x86-64 are very close, so
1197// most of the implementation can be shared.
1198class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001199 enum X86SSEEnum {
Craig Topper05fe4b52012-01-09 09:19:09 +00001200 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
Chris Lattner84f0ea82009-03-02 22:40:39 +00001201 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001202 enum MMX3DNowEnum {
1203 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1204 } MMX3DNowLevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001205
Eric Christophereea12d12010-04-02 23:50:19 +00001206 bool HasAES;
Craig Topper31ceea02011-12-25 05:06:45 +00001207 bool HasLZCNT;
1208 bool HasBMI;
1209 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001210 bool HasPOPCNT;
Craig Topper6a511e12011-12-30 07:33:42 +00001211 bool HasFMA4;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001212
Chandler Carruth499d9722011-09-28 08:55:34 +00001213 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1214 ///
1215 /// Each enumeration represents a particular CPU supported by Clang. These
1216 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1217 enum CPUKind {
1218 CK_Generic,
1219
1220 /// \name i386
1221 /// i386-generation processors.
1222 //@{
1223 CK_i386,
1224 //@}
1225
1226 /// \name i486
1227 /// i486-generation processors.
1228 //@{
1229 CK_i486,
1230 CK_WinChipC6,
1231 CK_WinChip2,
1232 CK_C3,
1233 //@}
1234
1235 /// \name i586
1236 /// i586-generation processors, P5 microarchitecture based.
1237 //@{
1238 CK_i586,
1239 CK_Pentium,
1240 CK_PentiumMMX,
1241 //@}
1242
1243 /// \name i686
1244 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1245 //@{
1246 CK_i686,
1247 CK_PentiumPro,
1248 CK_Pentium2,
1249 CK_Pentium3,
1250 CK_Pentium3M,
1251 CK_PentiumM,
1252 CK_C3_2,
1253
1254 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1255 /// Clang however has some logic to suport this.
1256 // FIXME: Warn, deprecate, and potentially remove this.
1257 CK_Yonah,
1258 //@}
1259
1260 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001261 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001262 //@{
1263 CK_Pentium4,
1264 CK_Pentium4M,
1265 CK_Prescott,
1266 CK_Nocona,
1267 //@}
1268
1269 /// \name Core
1270 /// Core microarchitecture based processors.
1271 //@{
1272 CK_Core2,
1273
1274 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1275 /// codename which GCC no longer accepts as an option to -march, but Clang
1276 /// has some logic for recognizing it.
1277 // FIXME: Warn, deprecate, and potentially remove this.
1278 CK_Penryn,
1279 //@}
1280
1281 /// \name Atom
1282 /// Atom processors
1283 //@{
1284 CK_Atom,
1285 //@}
1286
1287 /// \name Nehalem
1288 /// Nehalem microarchitecture based processors.
1289 //@{
1290 CK_Corei7,
1291 CK_Corei7AVX,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001292 CK_CoreAVXi,
Craig Topper2b03bb02011-12-17 19:55:21 +00001293 CK_CoreAVX2,
Chandler Carruth499d9722011-09-28 08:55:34 +00001294 //@}
1295
1296 /// \name K6
1297 /// K6 architecture processors.
1298 //@{
1299 CK_K6,
1300 CK_K6_2,
1301 CK_K6_3,
1302 //@}
1303
1304 /// \name K7
1305 /// K7 architecture processors.
1306 //@{
1307 CK_Athlon,
1308 CK_AthlonThunderbird,
1309 CK_Athlon4,
1310 CK_AthlonXP,
1311 CK_AthlonMP,
1312 //@}
1313
1314 /// \name K8
1315 /// K8 architecture processors.
1316 //@{
1317 CK_Athlon64,
1318 CK_Athlon64SSE3,
1319 CK_AthlonFX,
1320 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001321 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001322 CK_Opteron,
1323 CK_OpteronSSE3,
Roman Divacky01c770d2011-10-30 07:48:46 +00001324 CK_AMDFAM10,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001325 //@}
Chandler Carruth499d9722011-09-28 08:55:34 +00001326
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001327 /// \name Bobcat
1328 /// Bobcat architecture processors.
1329 //@{
1330 CK_BTVER1,
1331 //@}
1332
1333 /// \name Bulldozer
1334 /// Bulldozer architecture processors.
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001335 //@{
1336 CK_BDVER1,
1337 CK_BDVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001338 //@}
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001339
Chandler Carruth499d9722011-09-28 08:55:34 +00001340 /// This specification is deprecated and will be removed in the future.
1341 /// Users should prefer \see CK_K8.
1342 // FIXME: Warn on this when the CPU is set to it.
1343 CK_x86_64,
1344 //@}
1345
1346 /// \name Geode
1347 /// Geode processors.
1348 //@{
1349 CK_Geode
1350 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001351 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001352
Eli Friedman618234a2008-08-20 02:34:37 +00001353public:
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001354 X86TargetInfo(const std::string& triple)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001355 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Craig Topper05fe4b52012-01-09 09:19:09 +00001356 HasAES(false), HasLZCNT(false), HasBMI(false), HasBMI2(false),
1357 HasPOPCNT(false), HasFMA4(false), CPU(CK_Generic) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001358 BigEndian = false;
Eli Friedman618234a2008-08-20 02:34:37 +00001359 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001360 }
Benjamin Kramerb4066692011-12-28 15:47:06 +00001361 virtual unsigned getFloatEvalMethod() const {
1362 // X87 evaluates with 80 bits "long double" precision.
1363 return SSELevel == NoSSE ? 2 : 0;
1364 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001365 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1366 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001367 Records = BuiltinInfo;
1368 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001369 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001370 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001371 unsigned &NumNames) const {
1372 Names = GCCRegNames;
1373 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001374 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001375 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001376 unsigned &NumAliases) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001377 Aliases = 0;
1378 NumAliases = 0;
1379 }
1380 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1381 unsigned &NumNames) const {
1382 Names = AddlRegNames;
1383 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001384 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001385 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001386 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings002333f2011-06-07 23:45:05 +00001387 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001388 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001389 return "~{dirflag},~{fpsr},~{flags}";
1390 }
Chris Lattner33328642009-03-20 15:52:06 +00001391 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001392 MacroBuilder &Builder) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001393 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1394 const std::string &Name,
1395 bool Enabled) const;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001396 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001397 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001398 virtual const char* getABI() const {
Craig Topper05fe4b52012-01-09 09:19:09 +00001399 if (PointerWidth == 64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001400 return "avx";
1401 else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow)
1402 return "no-mmx";
1403 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001404 }
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001405 virtual bool setCPU(const std::string &Name) {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001406 CPU = llvm::StringSwitch<CPUKind>(Name)
1407 .Case("i386", CK_i386)
1408 .Case("i486", CK_i486)
1409 .Case("winchip-c6", CK_WinChipC6)
1410 .Case("winchip2", CK_WinChip2)
1411 .Case("c3", CK_C3)
1412 .Case("i586", CK_i586)
1413 .Case("pentium", CK_Pentium)
1414 .Case("pentium-mmx", CK_PentiumMMX)
1415 .Case("i686", CK_i686)
1416 .Case("pentiumpro", CK_PentiumPro)
1417 .Case("pentium2", CK_Pentium2)
1418 .Case("pentium3", CK_Pentium3)
1419 .Case("pentium3m", CK_Pentium3M)
1420 .Case("pentium-m", CK_PentiumM)
1421 .Case("c3-2", CK_C3_2)
1422 .Case("yonah", CK_Yonah)
1423 .Case("pentium4", CK_Pentium4)
1424 .Case("pentium4m", CK_Pentium4M)
1425 .Case("prescott", CK_Prescott)
1426 .Case("nocona", CK_Nocona)
1427 .Case("core2", CK_Core2)
1428 .Case("penryn", CK_Penryn)
1429 .Case("atom", CK_Atom)
1430 .Case("corei7", CK_Corei7)
1431 .Case("corei7-avx", CK_Corei7AVX)
1432 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper2b03bb02011-12-17 19:55:21 +00001433 .Case("core-avx2", CK_CoreAVX2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001434 .Case("k6", CK_K6)
1435 .Case("k6-2", CK_K6_2)
1436 .Case("k6-3", CK_K6_3)
1437 .Case("athlon", CK_Athlon)
1438 .Case("athlon-tbird", CK_AthlonThunderbird)
1439 .Case("athlon-4", CK_Athlon4)
1440 .Case("athlon-xp", CK_AthlonXP)
1441 .Case("athlon-mp", CK_AthlonMP)
1442 .Case("athlon64", CK_Athlon64)
1443 .Case("athlon64-sse3", CK_Athlon64SSE3)
1444 .Case("athlon-fx", CK_AthlonFX)
1445 .Case("k8", CK_K8)
1446 .Case("k8-sse3", CK_K8SSE3)
1447 .Case("opteron", CK_Opteron)
1448 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky01c770d2011-10-30 07:48:46 +00001449 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001450 .Case("btver1", CK_BTVER1)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001451 .Case("bdver1", CK_BDVER1)
1452 .Case("bdver2", CK_BDVER2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001453 .Case("x86-64", CK_x86_64)
1454 .Case("geode", CK_Geode)
1455 .Default(CK_Generic);
1456
Chandler Carruth26a39142011-09-28 09:45:08 +00001457 // Perform any per-CPU checks necessary to determine if this CPU is
1458 // acceptable.
1459 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1460 // invalid without explaining *why*.
1461 switch (CPU) {
1462 case CK_Generic:
1463 // No processor selected!
1464 return false;
1465
1466 case CK_i386:
1467 case CK_i486:
1468 case CK_WinChipC6:
1469 case CK_WinChip2:
1470 case CK_C3:
1471 case CK_i586:
1472 case CK_Pentium:
1473 case CK_PentiumMMX:
1474 case CK_i686:
1475 case CK_PentiumPro:
1476 case CK_Pentium2:
1477 case CK_Pentium3:
1478 case CK_Pentium3M:
1479 case CK_PentiumM:
1480 case CK_Yonah:
1481 case CK_C3_2:
1482 case CK_Pentium4:
1483 case CK_Pentium4M:
1484 case CK_Prescott:
1485 case CK_K6:
1486 case CK_K6_2:
1487 case CK_K6_3:
1488 case CK_Athlon:
1489 case CK_AthlonThunderbird:
1490 case CK_Athlon4:
1491 case CK_AthlonXP:
1492 case CK_AthlonMP:
1493 case CK_Geode:
1494 // Only accept certain architectures when compiling in 32-bit mode.
1495 if (PointerWidth != 32)
1496 return false;
1497
1498 // Fallthrough
1499 case CK_Nocona:
1500 case CK_Core2:
1501 case CK_Penryn:
1502 case CK_Atom:
1503 case CK_Corei7:
1504 case CK_Corei7AVX:
1505 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001506 case CK_CoreAVX2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001507 case CK_Athlon64:
1508 case CK_Athlon64SSE3:
1509 case CK_AthlonFX:
1510 case CK_K8:
1511 case CK_K8SSE3:
1512 case CK_Opteron:
1513 case CK_OpteronSSE3:
Roman Divacky01c770d2011-10-30 07:48:46 +00001514 case CK_AMDFAM10:
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001515 case CK_BTVER1:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001516 case CK_BDVER1:
1517 case CK_BDVER2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001518 case CK_x86_64:
1519 return true;
1520 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00001521 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001522 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001523};
Chris Lattner3daed522009-03-02 22:20:04 +00001524
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001525void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001526 // FIXME: This should not be here.
1527 Features["3dnow"] = false;
1528 Features["3dnowa"] = false;
1529 Features["mmx"] = false;
1530 Features["sse"] = false;
1531 Features["sse2"] = false;
1532 Features["sse3"] = false;
1533 Features["ssse3"] = false;
1534 Features["sse41"] = false;
1535 Features["sse42"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00001536 Features["sse4a"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001537 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001538 Features["avx"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00001539 Features["avx2"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00001540 Features["lzcnt"] = false;
1541 Features["bmi"] = false;
1542 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00001543 Features["popcnt"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00001544 Features["fma4"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001545
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001546 // FIXME: This *really* should not be here.
1547
1548 // X86_64 always has SSE2.
1549 if (PointerWidth == 64)
1550 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1551
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001552 switch (CPU) {
1553 case CK_Generic:
1554 case CK_i386:
1555 case CK_i486:
1556 case CK_i586:
1557 case CK_Pentium:
1558 case CK_i686:
1559 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001560 break;
1561 case CK_PentiumMMX:
1562 case CK_Pentium2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001563 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001564 break;
1565 case CK_Pentium3:
1566 case CK_Pentium3M:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001567 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001568 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001569 break;
1570 case CK_PentiumM:
1571 case CK_Pentium4:
1572 case CK_Pentium4M:
1573 case CK_x86_64:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001574 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001575 setFeatureEnabled(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001576 break;
1577 case CK_Yonah:
1578 case CK_Prescott:
1579 case CK_Nocona:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001580 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001581 setFeatureEnabled(Features, "sse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001582 break;
1583 case CK_Core2:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001584 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001585 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001586 break;
1587 case CK_Penryn:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001588 setFeatureEnabled(Features, "mmx", true);
Benjamin Kramerb3453a82012-01-04 14:36:57 +00001589 setFeatureEnabled(Features, "sse4.1", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001590 break;
1591 case CK_Atom:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001592 setFeatureEnabled(Features, "mmx", true);
Chandler Carruth49defe62011-09-28 10:36:46 +00001593 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001594 break;
1595 case CK_Corei7:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001596 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001597 setFeatureEnabled(Features, "sse4", true);
Eric Christophereea12d12010-04-02 23:50:19 +00001598 setFeatureEnabled(Features, "aes", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001599 break;
1600 case CK_Corei7AVX:
1601 case CK_CoreAVXi:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001602 setFeatureEnabled(Features, "mmx", true);
Roman Divackybcaa3b82011-04-05 20:32:44 +00001603 setFeatureEnabled(Features, "sse4", true);
1604 setFeatureEnabled(Features, "aes", true);
Bruno Cardoso Lopese02d3912011-07-11 23:33:46 +00001605 //setFeatureEnabled(Features, "avx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001606 break;
Craig Topper2b03bb02011-12-17 19:55:21 +00001607 case CK_CoreAVX2:
1608 setFeatureEnabled(Features, "mmx", true);
1609 setFeatureEnabled(Features, "sse4", true);
1610 setFeatureEnabled(Features, "aes", true);
Craig Topper31ceea02011-12-25 05:06:45 +00001611 setFeatureEnabled(Features, "lzcnt", true);
1612 setFeatureEnabled(Features, "bmi", true);
1613 setFeatureEnabled(Features, "bmi2", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00001614 //setFeatureEnabled(Features, "avx2", true);
1615 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001616 case CK_K6:
1617 case CK_WinChipC6:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001618 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001619 break;
1620 case CK_K6_2:
1621 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001622 case CK_WinChip2:
1623 case CK_C3:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001624 setFeatureEnabled(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001625 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00001626 case CK_Athlon:
1627 case CK_AthlonThunderbird:
1628 case CK_Geode:
1629 setFeatureEnabled(Features, "3dnowa", true);
1630 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001631 case CK_Athlon4:
1632 case CK_AthlonXP:
1633 case CK_AthlonMP:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001634 setFeatureEnabled(Features, "sse", true);
1635 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001636 break;
1637 case CK_K8:
1638 case CK_Opteron:
1639 case CK_Athlon64:
1640 case CK_AthlonFX:
Mike Stump1eb44332009-09-09 15:08:12 +00001641 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001642 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001643 break;
1644 case CK_K8SSE3:
1645 case CK_OpteronSSE3:
1646 case CK_Athlon64SSE3:
Roman Divacky80b32b82011-10-30 13:47:56 +00001647 setFeatureEnabled(Features, "sse3", true);
1648 setFeatureEnabled(Features, "3dnowa", true);
1649 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00001650 case CK_AMDFAM10:
Roman Divackyc8b09a12010-12-29 13:28:29 +00001651 setFeatureEnabled(Features, "sse3", true);
Roman Divacky80b32b82011-10-30 13:47:56 +00001652 setFeatureEnabled(Features, "sse4a", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00001653 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001654 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001655 case CK_BTVER1:
1656 setFeatureEnabled(Features, "ssse3", true);
1657 setFeatureEnabled(Features, "sse4a", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001658 case CK_BDVER1:
1659 case CK_BDVER2:
1660 setFeatureEnabled(Features, "sse4", true);
1661 setFeatureEnabled(Features, "sse4a", true);
1662 setFeatureEnabled(Features, "aes", true);
1663 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001664 case CK_C3_2:
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001665 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001666 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001667 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001668 }
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001669}
1670
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001671bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump1eb44332009-09-09 15:08:12 +00001672 const std::string &Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001673 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00001674 // FIXME: This *really* should not be here. We need some way of translating
1675 // options into llvm subtarget features.
1676 if (!Features.count(Name) &&
1677 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001678 return false;
1679
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001680 // FIXME: this should probably use a switch with fall through.
1681
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001682 if (Enabled) {
1683 if (Name == "mmx")
1684 Features["mmx"] = true;
1685 else if (Name == "sse")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001686 Features["mmx"] = Features["sse"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001687 else if (Name == "sse2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001688 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001689 else if (Name == "sse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001690 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1691 true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001692 else if (Name == "ssse3")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001693 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001694 Features["ssse3"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001695 else if (Name == "sse4" || Name == "sse4.2")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001696 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001697 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1698 Features["popcnt"] = true;
Eric Christopherd39ebe22010-03-04 02:26:37 +00001699 else if (Name == "sse4.1")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001700 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopherd39ebe22010-03-04 02:26:37 +00001701 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001702 else if (Name == "3dnow")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001703 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001704 else if (Name == "3dnowa")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001705 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophereea12d12010-04-02 23:50:19 +00001706 else if (Name == "aes")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001707 Features["aes"] = true;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001708 else if (Name == "avx")
Rafael Espindola53ac3d82011-11-27 20:00:43 +00001709 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1710 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001711 Features["popcnt"] = Features["avx"] = true;
Craig Topper2b03bb02011-12-17 19:55:21 +00001712 else if (Name == "avx2")
1713 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1714 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Toppere14e08b2011-12-29 16:10:46 +00001715 Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
Craig Topper6a511e12011-12-30 07:33:42 +00001716 else if (Name == "fma4")
1717 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1718 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1719 Features["popcnt"] = Features["avx"] = Features["fma4"] = true;
Roman Divacky80b32b82011-10-30 13:47:56 +00001720 else if (Name == "sse4a")
Craig Topper6a511e12011-12-30 07:33:42 +00001721 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Benjamin Kramer5c65e4f2012-01-10 11:50:13 +00001722 Features["lzcnt"] = Features["popcnt"] = Features["sse4a"] = true;
Craig Topper31ceea02011-12-25 05:06:45 +00001723 else if (Name == "lzcnt")
1724 Features["lzcnt"] = true;
1725 else if (Name == "bmi")
1726 Features["bmi"] = true;
1727 else if (Name == "bmi2")
1728 Features["bmi2"] = true;
Craig Toppere14e08b2011-12-29 16:10:46 +00001729 else if (Name == "popcnt")
1730 Features["popcnt"] = true;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001731 } else {
1732 if (Name == "mmx")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001733 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001734 else if (Name == "sse")
Mike Stump1eb44332009-09-09 15:08:12 +00001735 Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00001736 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1737 Features["sse4a"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001738 else if (Name == "sse2")
Mike Stump1eb44332009-09-09 15:08:12 +00001739 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Craig Topper6a511e12011-12-30 07:33:42 +00001740 Features["sse41"] = Features["sse42"] = Features["sse4a"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001741 else if (Name == "sse3")
Mike Stump1eb44332009-09-09 15:08:12 +00001742 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Craig Topper6a511e12011-12-30 07:33:42 +00001743 Features["sse42"] = Features["sse4a"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001744 else if (Name == "ssse3")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001745 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencerb24bac92011-04-17 19:22:03 +00001746 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001747 Features["sse41"] = Features["sse42"] = false;
Eric Christopherd41b4ec2010-03-04 02:31:44 +00001748 else if (Name == "sse4.2")
Daniel Dunbarcb65de12011-05-03 15:34:01 +00001749 Features["sse42"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001750 else if (Name == "3dnow")
1751 Features["3dnow"] = Features["3dnowa"] = false;
1752 else if (Name == "3dnowa")
1753 Features["3dnowa"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001754 else if (Name == "aes")
1755 Features["aes"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001756 else if (Name == "avx")
Craig Topper6a511e12011-12-30 07:33:42 +00001757 Features["avx"] = Features["avx2"] = Features["fma4"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00001758 else if (Name == "avx2")
1759 Features["avx2"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00001760 else if (Name == "sse4a")
1761 Features["sse4a"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00001762 else if (Name == "lzcnt")
1763 Features["lzcnt"] = false;
1764 else if (Name == "bmi")
1765 Features["bmi"] = false;
1766 else if (Name == "bmi2")
1767 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00001768 else if (Name == "popcnt")
1769 Features["popcnt"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00001770 else if (Name == "fma4")
1771 Features["fma4"] = false;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001772 }
1773
1774 return true;
1775}
1776
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001777/// HandleTargetOptions - Perform initialization based on the user
1778/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001779void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001780 // Remember the maximum enabled sselevel.
1781 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1782 // Ignore disabled features.
1783 if (Features[i][0] == '-')
1784 continue;
1785
Eric Christophereea12d12010-04-02 23:50:19 +00001786 if (Features[i].substr(1) == "aes") {
1787 HasAES = true;
1788 continue;
1789 }
1790
Craig Topper31ceea02011-12-25 05:06:45 +00001791 if (Features[i].substr(1) == "lzcnt") {
1792 HasLZCNT = true;
1793 continue;
1794 }
1795
1796 if (Features[i].substr(1) == "bmi") {
1797 HasBMI = true;
1798 continue;
1799 }
1800
1801 if (Features[i].substr(1) == "bmi2") {
1802 HasBMI2 = true;
1803 continue;
1804 }
1805
Craig Toppere14e08b2011-12-29 16:10:46 +00001806 if (Features[i].substr(1) == "popcnt") {
1807 HasPOPCNT = true;
1808 continue;
1809 }
1810
Craig Topper6a511e12011-12-30 07:33:42 +00001811 if (Features[i].substr(1) == "fma4") {
1812 HasFMA4 = true;
1813 continue;
1814 }
1815
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001816 assert(Features[i][0] == '+' && "Invalid target feature!");
1817 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
Craig Topper05fe4b52012-01-09 09:19:09 +00001818 .Case("avx2", AVX2)
1819 .Case("avx", AVX)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001820 .Case("sse42", SSE42)
1821 .Case("sse41", SSE41)
1822 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00001823 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001824 .Case("sse2", SSE2)
1825 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001826 .Default(NoSSE);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001827 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001828
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001829 MMX3DNowEnum ThreeDNowLevel =
1830 llvm::StringSwitch<MMX3DNowEnum>(Features[i].substr(1))
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001831 .Case("3dnowa", AMD3DNowAthlon)
1832 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001833 .Case("mmx", MMX)
1834 .Default(NoMMX3DNow);
Michael J. Spencer20249a12010-10-21 03:16:25 +00001835
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001836 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00001837 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001838
1839 // Don't tell the backend if we're turning off mmx; it will end up disabling
1840 // SSE, which we don't want.
1841 std::vector<std::string>::iterator it;
1842 it = std::find(Features.begin(), Features.end(), "-mmx");
1843 if (it != Features.end())
1844 Features.erase(it);
Chris Lattner3daed522009-03-02 22:20:04 +00001845}
Chris Lattnerc0f59212009-03-02 22:27:17 +00001846
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001847/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
1848/// definitions for this particular subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00001849void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001850 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00001851 // Target identification.
1852 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00001853 Builder.defineMacro("_LP64");
1854 Builder.defineMacro("__LP64__");
1855 Builder.defineMacro("__amd64__");
1856 Builder.defineMacro("__amd64");
1857 Builder.defineMacro("__x86_64");
1858 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00001859 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00001860 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00001861 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001862
Chris Lattnerc0f59212009-03-02 22:27:17 +00001863 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001864 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
1865 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001866 switch (CPU) {
1867 case CK_Generic:
1868 break;
1869 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001870 // The rest are coming from the i386 define above.
1871 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001872 break;
1873 case CK_i486:
1874 case CK_WinChipC6:
1875 case CK_WinChip2:
1876 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001877 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001878 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00001879 case CK_PentiumMMX:
1880 Builder.defineMacro("__pentium_mmx__");
1881 Builder.defineMacro("__tune_pentium_mmx__");
1882 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001883 case CK_i586:
1884 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001885 defineCPUMacros(Builder, "i586");
1886 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001887 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001888 case CK_Pentium3:
1889 case CK_Pentium3M:
1890 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001891 Builder.defineMacro("__tune_pentium3__");
1892 // Fallthrough
1893 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001894 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001895 Builder.defineMacro("__tune_pentium2__");
1896 // Fallthrough
1897 case CK_PentiumPro:
1898 Builder.defineMacro("__tune_i686__");
1899 Builder.defineMacro("__tune_pentiumpro__");
1900 // Fallthrough
1901 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001902 Builder.defineMacro("__i686");
1903 Builder.defineMacro("__i686__");
1904 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
1905 Builder.defineMacro("__pentiumpro");
1906 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001907 break;
1908 case CK_Pentium4:
1909 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001910 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001911 break;
1912 case CK_Yonah:
1913 case CK_Prescott:
1914 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001915 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001916 break;
1917 case CK_Core2:
1918 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001919 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001920 break;
1921 case CK_Atom:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001922 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001923 break;
1924 case CK_Corei7:
1925 case CK_Corei7AVX:
1926 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001927 case CK_CoreAVX2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001928 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001929 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001930 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001931 Builder.defineMacro("__k6_2__");
1932 Builder.defineMacro("__tune_k6_2__");
1933 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001934 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00001935 if (CPU != CK_K6_2) { // In case of fallthrough
1936 // FIXME: GCC may be enabling these in cases where some other k6
1937 // architecture is specified but -m3dnow is explicitly provided. The
1938 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001939 Builder.defineMacro("__k6_3__");
1940 Builder.defineMacro("__tune_k6_3__");
1941 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00001942 // Fallthrough
1943 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001944 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001945 break;
1946 case CK_Athlon:
1947 case CK_AthlonThunderbird:
1948 case CK_Athlon4:
1949 case CK_AthlonXP:
1950 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001951 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00001952 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001953 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00001954 Builder.defineMacro("__tune_athlon_sse__");
1955 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001956 break;
1957 case CK_K8:
1958 case CK_K8SSE3:
1959 case CK_x86_64:
1960 case CK_Opteron:
1961 case CK_OpteronSSE3:
1962 case CK_Athlon64:
1963 case CK_Athlon64SSE3:
1964 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001965 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001966 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00001967 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001968 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00001969 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001970 case CK_BTVER1:
1971 defineCPUMacros(Builder, "btver1");
1972 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001973 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001974 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001975 break;
1976 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001977 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001978 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001979 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00001980 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001981 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001982 }
Chris Lattner84f0ea82009-03-02 22:40:39 +00001983
Chandler Carruth88c75b02011-09-28 09:54:07 +00001984 // Target properties.
1985 Builder.defineMacro("__LITTLE_ENDIAN__");
1986 Builder.defineMacro("__REGISTER_PREFIX__", "");
1987
Chris Lattner54175442009-04-19 17:32:33 +00001988 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1989 // functions in glibc header files that use FP Stack inline asm which the
1990 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00001991 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001992
Chandler Carruth88c75b02011-09-28 09:54:07 +00001993 if (HasAES)
1994 Builder.defineMacro("__AES__");
1995
Craig Topper31ceea02011-12-25 05:06:45 +00001996 if (HasLZCNT)
1997 Builder.defineMacro("__LZCNT__");
1998
1999 if (HasBMI)
2000 Builder.defineMacro("__BMI__");
2001
2002 if (HasBMI2)
2003 Builder.defineMacro("__BMI2__");
2004
Craig Toppere14e08b2011-12-29 16:10:46 +00002005 if (HasPOPCNT)
2006 Builder.defineMacro("__POPCNT__");
2007
Craig Topper6a511e12011-12-30 07:33:42 +00002008 if (HasFMA4)
2009 Builder.defineMacro("__FMA4__");
2010
Chris Lattner84f0ea82009-03-02 22:40:39 +00002011 // Each case falls through to the previous one here.
2012 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002013 case AVX2:
2014 Builder.defineMacro("__AVX2__");
2015 case AVX:
2016 Builder.defineMacro("__AVX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002017 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00002018 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002019 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00002020 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002021 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002022 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002023 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002024 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002025 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00002026 Builder.defineMacro("__SSE2__");
2027 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00002028 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00002029 Builder.defineMacro("__SSE__");
2030 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002031 case NoSSE:
Chris Lattner84f0ea82009-03-02 22:40:39 +00002032 break;
2033 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002034
Francois Pichet62ec1f22011-09-17 17:15:52 +00002035 if (Opts.MicrosoftExt && PointerWidth == 32) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002036 switch (SSELevel) {
Craig Topper05fe4b52012-01-09 09:19:09 +00002037 case AVX2:
2038 case AVX:
Michael J. Spencera764e832010-10-21 08:22:51 +00002039 case SSE42:
2040 case SSE41:
2041 case SSSE3:
2042 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002043 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002044 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002045 break;
2046 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002047 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002048 break;
2049 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002050 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002051 }
2052 }
2053
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002054 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002055 switch (MMX3DNowLevel) {
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002056 case AMD3DNowAthlon:
2057 Builder.defineMacro("__3dNOW_A__");
2058 case AMD3DNow:
2059 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002060 case MMX:
2061 Builder.defineMacro("__MMX__");
2062 case NoMMX3DNow:
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002063 break;
2064 }
Chris Lattnerc0f59212009-03-02 22:27:17 +00002065}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002066
2067
Eli Friedman618234a2008-08-20 02:34:37 +00002068bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002069X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002070 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002071 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00002072 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00002073 case 'Y': // first letter of a pair:
2074 switch (*(Name+1)) {
2075 default: return false;
2076 case '0': // First SSE register.
2077 case 't': // Any SSE register, when SSE2 is enabled.
2078 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2079 case 'm': // any MMX register, when inter-unit moves enabled.
2080 break; // falls through to setAllowsRegister.
2081 }
Eli Friedman618234a2008-08-20 02:34:37 +00002082 case 'a': // eax.
2083 case 'b': // ebx.
2084 case 'c': // ecx.
2085 case 'd': // edx.
2086 case 'S': // esi.
2087 case 'D': // edi.
2088 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00002089 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00002090 case 't': // top of floating point stack.
2091 case 'u': // second from top of floating point stack.
2092 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00002093 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00002094 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00002095 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00002096 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2097 case 'l': // "Index" registers: any general register that can be used as an
2098 // index in a base+index memory access.
2099 Info.setAllowsRegister();
2100 return true;
2101 case 'C': // SSE floating point constant.
2102 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002103 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002104 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002105 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002106 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00002107 return true;
2108 }
2109}
2110
Dale Johannesenf6e2c202010-10-29 23:12:32 +00002111
Eli Friedman618234a2008-08-20 02:34:37 +00002112std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00002113X86TargetInfo::convertConstraint(const char *&Constraint) const {
2114 switch (*Constraint) {
Eli Friedman618234a2008-08-20 02:34:37 +00002115 case 'a': return std::string("{ax}");
2116 case 'b': return std::string("{bx}");
2117 case 'c': return std::string("{cx}");
2118 case 'd': return std::string("{dx}");
2119 case 'S': return std::string("{si}");
2120 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00002121 case 'p': // address
2122 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00002123 case 't': // top of floating point stack.
2124 return std::string("{st}");
2125 case 'u': // second from top of floating point stack.
2126 return std::string("{st(1)}"); // second from top of floating point stack.
2127 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00002128 return std::string(1, *Constraint);
Eli Friedman618234a2008-08-20 02:34:37 +00002129 }
2130}
Eli Friedman618234a2008-08-20 02:34:37 +00002131} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00002132
2133namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002134// X86-32 generic target
2135class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00002136public:
Eli Friedman618234a2008-08-20 02:34:37 +00002137 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2138 DoubleAlign = LongLongAlign = 32;
2139 LongDoubleWidth = 96;
2140 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00002141 SuitableAlign = 128;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002142 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2143 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames567c6002011-10-11 00:52:51 +00002144 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman1afabd92009-03-29 20:31:09 +00002145 SizeType = UnsignedInt;
2146 PtrDiffType = SignedInt;
2147 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002148 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002149
2150 // Use fpret for all types.
2151 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2152 (1 << TargetInfo::Double) |
2153 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00002154
2155 // x86-32 has atomics up to 8 bytes
2156 // FIXME: Check that we actually have cmpxchg8b before setting
2157 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2158 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman618234a2008-08-20 02:34:37 +00002159 }
2160 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002161 return "typedef char* __builtin_va_list;";
Eli Friedman618234a2008-08-20 02:34:37 +00002162 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002163
Chris Lattner21fb98e2009-09-23 06:06:36 +00002164 int getEHDataRegisterNumber(unsigned RegNo) const {
2165 if (RegNo == 0) return 0;
2166 if (RegNo == 1) return 2;
2167 return -1;
2168 }
Eli Friedman618234a2008-08-20 02:34:37 +00002169};
2170} // end anonymous namespace
2171
2172namespace {
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00002173class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2174public:
2175 NetBSDI386TargetInfo(const std::string &triple) :
2176 NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2177 }
2178
2179 virtual unsigned getFloatEvalMethod() const {
2180 // NetBSD defaults to "double" rounding
2181 return 1;
2182 }
2183};
2184} // end anonymous namespace
2185
2186namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00002187class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2188public:
2189 OpenBSDI386TargetInfo(const std::string& triple) :
2190 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2191 SizeType = UnsignedLong;
2192 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00002193 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00002194 }
2195};
2196} // end anonymous namespace
2197
2198namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00002199class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00002200public:
Torok Edwin5f6c1942009-06-30 17:10:35 +00002201 DarwinI386TargetInfo(const std::string& triple) :
2202 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00002203 LongDoubleWidth = 128;
2204 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002205 SuitableAlign = 128;
Eli Friedman1afabd92009-03-29 20:31:09 +00002206 SizeType = UnsignedLong;
2207 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002208 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2209 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002210 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbar613fd672010-05-27 00:35:16 +00002211 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00002212 }
2213
Eli Friedman618234a2008-08-20 02:34:37 +00002214};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00002215} // end anonymous namespace
2216
2217namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00002218// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002219class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00002220public:
2221 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002222 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00002223 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00002224 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00002225 DoubleAlign = LongLongAlign = 64;
2226 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Anton Korobeynikovb3814412009-12-19 02:05:07 +00002227 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002228 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedman29a30502008-08-21 01:40:19 +00002229 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002230 virtual void getTargetDefines(const LangOptions &Opts,
2231 MacroBuilder &Builder) const {
2232 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2233 }
2234};
2235} // end anonymous namespace
2236
2237namespace {
2238
2239// x86-32 Windows Visual Studio target
2240class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2241public:
2242 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2243 : WindowsX86_32TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002244 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00002245 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2246 }
2247 virtual void getTargetDefines(const LangOptions &Opts,
2248 MacroBuilder &Builder) const {
2249 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2250 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2251 // The value of the following reflects processor type.
2252 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2253 // We lost the original triple, so we use the default.
2254 Builder.defineMacro("_M_IX86", "600");
2255 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002256};
2257} // end anonymous namespace
2258
2259namespace {
2260// x86-32 MinGW target
2261class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2262public:
2263 MinGWX86_32TargetInfo(const std::string& triple)
2264 : WindowsX86_32TargetInfo(triple) {
2265 }
2266 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002267 MacroBuilder &Builder) const {
2268 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002269 DefineStd(Builder, "WIN32", Opts);
2270 DefineStd(Builder, "WINNT", Opts);
2271 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00002272 Builder.defineMacro("__MSVCRT__");
2273 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002274
2275 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2276 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002277 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002278 // Provide "as-is" __declspec.
2279 Builder.defineMacro("__declspec", "__declspec");
2280 else
2281 // Provide alias of __attribute__ like mingw32-gcc.
2282 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002283 }
2284};
2285} // end anonymous namespace
2286
2287namespace {
2288// x86-32 Cygwin target
2289class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2290public:
2291 CygwinX86_32TargetInfo(const std::string& triple)
2292 : X86_32TargetInfo(triple) {
2293 TLSSupported = false;
2294 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002295 DoubleAlign = LongLongAlign = 64;
2296 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2297 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002298 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002299 }
2300 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002301 MacroBuilder &Builder) const {
2302 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2303 Builder.defineMacro("__CYGWIN__");
2304 Builder.defineMacro("__CYGWIN32__");
2305 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00002306 if (Opts.CPlusPlus)
2307 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00002308 }
Eli Friedman29a30502008-08-21 01:40:19 +00002309};
2310} // end anonymous namespace
2311
2312namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00002313// x86-32 Haiku target
2314class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2315public:
2316 HaikuX86_32TargetInfo(const std::string& triple)
2317 : X86_32TargetInfo(triple) {
2318 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00002319 IntPtrType = SignedLong;
2320 PtrDiffType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00002321 this->UserLabelPrefix = "";
Eli Friedmana7e68452010-08-22 01:00:03 +00002322 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00002323 virtual void getTargetDefines(const LangOptions &Opts,
2324 MacroBuilder &Builder) const {
2325 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2326 Builder.defineMacro("__INTEL__");
2327 Builder.defineMacro("__HAIKU__");
2328 }
2329};
2330} // end anonymous namespace
2331
Douglas Gregordca52262011-07-01 22:41:14 +00002332// RTEMS Target
2333template<typename Target>
2334class RTEMSTargetInfo : public OSTargetInfo<Target> {
2335protected:
2336 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2337 MacroBuilder &Builder) const {
2338 // RTEMS defines; list based off of gcc output
2339
Douglas Gregordca52262011-07-01 22:41:14 +00002340 Builder.defineMacro("__rtems__");
2341 Builder.defineMacro("__ELF__");
2342 }
2343public:
2344 RTEMSTargetInfo(const std::string &triple)
2345 : OSTargetInfo<Target>(triple) {
2346 this->UserLabelPrefix = "";
2347
2348 llvm::Triple Triple(triple);
2349 switch (Triple.getArch()) {
2350 default:
2351 case llvm::Triple::x86:
2352 // this->MCountName = ".mcount";
2353 break;
2354 case llvm::Triple::mips:
2355 case llvm::Triple::mipsel:
2356 case llvm::Triple::ppc:
2357 case llvm::Triple::ppc64:
2358 // this->MCountName = "_mcount";
2359 break;
2360 case llvm::Triple::arm:
2361 // this->MCountName = "__mcount";
2362 break;
2363 }
2364
2365 }
2366};
2367
2368namespace {
2369// x86-32 RTEMS target
2370class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
2371public:
2372 RTEMSX86_32TargetInfo(const std::string& triple)
2373 : X86_32TargetInfo(triple) {
2374 SizeType = UnsignedLong;
2375 IntPtrType = SignedLong;
2376 PtrDiffType = SignedLong;
2377 this->UserLabelPrefix = "";
2378 }
2379 virtual void getTargetDefines(const LangOptions &Opts,
2380 MacroBuilder &Builder) const {
2381 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2382 Builder.defineMacro("__INTEL__");
2383 Builder.defineMacro("__rtems__");
2384 }
2385};
2386} // end anonymous namespace
2387
Chris Lattner86ed3a32010-04-11 19:29:39 +00002388namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002389// x86-64 generic target
2390class X86_64TargetInfo : public X86TargetInfo {
2391public:
Chris Lattner33328642009-03-20 15:52:06 +00002392 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00002393 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00002394 LongDoubleWidth = 128;
2395 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00002396 LargeArrayMinWidth = 128;
2397 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002398 SuitableAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00002399 IntMaxType = SignedLong;
2400 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002401 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002402 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00002403
Eli Friedmaned855cb2008-08-21 00:13:15 +00002404 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2405 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002406 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002407
2408 // Use fpret only for long double.
2409 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00002410
Anders Carlssoneea64802011-10-31 16:27:11 +00002411 // Use fp2ret for _Complex long double.
2412 ComplexLongDoubleUsesFP2Ret = true;
2413
Eli Friedman2be46072011-10-14 20:59:01 +00002414 // x86-64 has atomics up to 16 bytes.
2415 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
2416 // on CPUs with cmpxchg16b
2417 MaxAtomicPromoteWidth = 128;
2418 MaxAtomicInlineWidth = 64;
Reid Spencer5f016e22007-07-11 17:01:13 +00002419 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00002420 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00002421 return "typedef struct __va_list_tag {"
2422 " unsigned gp_offset;"
2423 " unsigned fp_offset;"
2424 " void* overflow_arg_area;"
2425 " void* reg_save_area;"
John McCall2b7baf02010-05-28 18:25:28 +00002426 "} __va_list_tag;"
Eli Friedmandc043162009-07-03 00:45:06 +00002427 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson3346ae62007-11-24 23:38:12 +00002428 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002429
Chris Lattner21fb98e2009-09-23 06:06:36 +00002430 int getEHDataRegisterNumber(unsigned RegNo) const {
2431 if (RegNo == 0) return 0;
2432 if (RegNo == 1) return 1;
2433 return -1;
2434 }
Eli Friedman618234a2008-08-20 02:34:37 +00002435};
2436} // end anonymous namespace
2437
2438namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002439// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002440class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002441public:
2442 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002443 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002444 TLSSupported = false;
2445 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00002446 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00002447 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00002448 IntMaxType = SignedLongLong;
2449 UIntMaxType = UnsignedLongLong;
2450 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00002451 SizeType = UnsignedLongLong;
2452 PtrDiffType = SignedLongLong;
2453 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00002454 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002455 }
2456 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002457 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002458 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002459 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00002460 }
NAKAMURA Takumi79521992011-01-17 22:56:23 +00002461 virtual const char *getVAListDeclaration() const {
2462 return "typedef char* __builtin_va_list;";
2463 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002464};
2465} // end anonymous namespace
2466
2467namespace {
2468// x86-64 Windows Visual Studio target
2469class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
2470public:
2471 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
2472 : WindowsX86_64TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002473 LongDoubleWidth = LongDoubleAlign = 64;
2474 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00002475 }
2476 virtual void getTargetDefines(const LangOptions &Opts,
2477 MacroBuilder &Builder) const {
2478 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2479 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00002480 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002481 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002482 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002483};
2484} // end anonymous namespace
2485
2486namespace {
2487// x86-64 MinGW target
2488class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
2489public:
2490 MinGWX86_64TargetInfo(const std::string& triple)
2491 : WindowsX86_64TargetInfo(triple) {
2492 }
2493 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002494 MacroBuilder &Builder) const {
2495 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002496 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00002497 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00002498 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00002499 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002500
2501 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2502 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002503 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002504 // Provide "as-is" __declspec.
2505 Builder.defineMacro("__declspec", "__declspec");
2506 else
2507 // Provide alias of __attribute__ like mingw32-gcc.
2508 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002509 }
2510};
2511} // end anonymous namespace
2512
2513namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002514class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
2515public:
Mike Stump1eb44332009-09-09 15:08:12 +00002516 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman3c7b6e42009-07-01 03:36:11 +00002517 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
2518 Int64Type = SignedLongLong;
2519 }
2520};
2521} // end anonymous namespace
2522
2523namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00002524class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
2525public:
Mike Stump1eb44332009-09-09 15:08:12 +00002526 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman6036ebe2009-07-05 22:31:18 +00002527 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
2528 IntMaxType = SignedLongLong;
2529 UIntMaxType = UnsignedLongLong;
2530 Int64Type = SignedLongLong;
2531 }
2532};
2533} // end anonymous namespace
2534
2535namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00002536class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002537 // Possible FPU choices.
2538 enum FPUMode {
2539 NoFPU,
2540 VFP2FPU,
2541 VFP3FPU,
2542 NeonFPU
2543 };
2544
2545 static bool FPUModeIsVFP(FPUMode Mode) {
2546 return Mode >= VFP2FPU && Mode <= NeonFPU;
2547 }
2548
2549 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2550 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002551
Daniel Dunbareac7c532009-12-18 18:42:37 +00002552 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00002553
2554 unsigned FPU : 3;
2555
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002556 unsigned IsThumb : 1;
2557
2558 // Initialized via features.
2559 unsigned SoftFloat : 1;
2560 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002561
Chris Lattner2752c012010-03-03 19:03:45 +00002562 static const Builtin::Info BuiltinInfo[];
2563
Chris Lattner393ff042008-04-21 18:56:49 +00002564public:
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002565 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbareac7c532009-12-18 18:42:37 +00002566 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002567 {
Eli Friedmane6a24e82011-12-22 03:51:45 +00002568 BigEndian = false;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002569 SizeType = UnsignedInt;
2570 PtrDiffType = SignedInt;
James Molloya6d81f92011-11-23 13:35:08 +00002571 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
2572 WCharType = UnsignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002573
Chris Lattner9bffb072010-04-23 16:29:58 +00002574 // {} in inline assembly are neon specifiers, not assembly variant
2575 // specifiers.
2576 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00002577
Daniel Dunbareac7c532009-12-18 18:42:37 +00002578 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00002579 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002580 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00002581 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2582 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002583 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2584 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002585 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002586 } else {
2587 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2588 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002589 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002590 }
John McCallee79a4c2010-08-21 22:46:04 +00002591
2592 // ARM targets default to using the ARM C++ ABI.
2593 CXXABI = CXXABI_ARM;
Eli Friedman2be46072011-10-14 20:59:01 +00002594
2595 // ARM has atomics up to 8 bytes
2596 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
2597 MaxAtomicPromoteWidth = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00002598 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002599 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00002600 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00002601 ABI = Name;
2602
Daniel Dunbara2a41612009-09-14 00:02:24 +00002603 // The defaults (above) are for AAPCS, check if we need to change them.
2604 //
2605 // FIXME: We need support for -meabi... we could just mangle it into the
2606 // name.
2607 if (Name == "apcs-gnu") {
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002608 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002609 SizeType = UnsignedLong;
2610
James Molloya6d81f92011-11-23 13:35:08 +00002611 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
2612 WCharType = SignedInt;
2613
Daniel Dunbar684de632010-04-22 16:14:54 +00002614 // Do not respect the alignment of bit-field types when laying out
2615 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
2616 UseBitFieldTypeAlignment = false;
2617
Chad Rosier61a62212011-08-04 01:21:14 +00002618 /// Do force alignment of members that follow zero length bitfields. If
2619 /// the alignment of the zero-length bitfield is greater than the member
2620 /// that follows it, `bar', `bar' will be aligned as the type of the
2621 /// zero length bitfield.
2622 UseZeroLengthBitfieldAlignment = true;
2623
2624 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosier6e43f3f2011-08-04 17:52:43 +00002625 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
2626 /// gcc.
Chad Rosier61a62212011-08-04 01:21:14 +00002627 ZeroLengthBitfieldBoundary = 32;
2628
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002629 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00002630 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2631 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002632 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
Bob Wilson949fd1a2011-06-29 16:09:20 +00002633 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002634 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002635 } else {
2636 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00002637 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002638 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00002639 }
2640
Chad Rosier9f1210c2011-07-26 07:03:04 +00002641 // FIXME: Override "preferred align" for double and long long.
Daniel Dunbara2a41612009-09-14 00:02:24 +00002642 } else if (Name == "aapcs") {
2643 // FIXME: Enumerated types are variable width in straight AAPCS.
2644 } else if (Name == "aapcs-linux") {
Chad Rosier9f1210c2011-07-26 07:03:04 +00002645 ;
Daniel Dunbara2a41612009-09-14 00:02:24 +00002646 } else
2647 return false;
2648
2649 return true;
2650 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002651
Chandler Carruthc3a2e652011-09-28 05:56:05 +00002652 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002653 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
2654 Features["vfp2"] = true;
2655 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
2656 Features["neon"] = true;
2657 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002658
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002659 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2660 const std::string &Name,
2661 bool Enabled) const {
Evan Chengf972b262011-07-08 06:40:11 +00002662 if (Name == "soft-float" || Name == "soft-float-abi" ||
Evgeniy Stepanov35dd7322012-01-11 11:21:31 +00002663 Name == "vfp2" || Name == "vfp3" || Name == "neon" || Name == "d16") {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002664 Features[Name] = Enabled;
2665 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002666 return false;
2667
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002668 return true;
2669 }
2670
2671 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbara91320b2009-12-21 23:28:17 +00002672 FPU = NoFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002673 SoftFloat = SoftFloatABI = false;
2674 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2675 if (Features[i] == "+soft-float")
2676 SoftFloat = true;
2677 else if (Features[i] == "+soft-float-abi")
2678 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00002679 else if (Features[i] == "+vfp2")
2680 FPU = VFP2FPU;
2681 else if (Features[i] == "+vfp3")
2682 FPU = VFP3FPU;
2683 else if (Features[i] == "+neon")
2684 FPU = NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002685 }
2686
2687 // Remove front-end specific options which the backend handles differently.
2688 std::vector<std::string>::iterator it;
2689 it = std::find(Features.begin(), Features.end(), "+soft-float");
2690 if (it != Features.end())
2691 Features.erase(it);
2692 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2693 if (it != Features.end())
2694 Features.erase(it);
2695 }
2696
Chris Lattner5f9e2722011-07-23 10:55:15 +00002697 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbareac7c532009-12-18 18:42:37 +00002698 return llvm::StringSwitch<const char*>(Name)
2699 .Cases("arm8", "arm810", "4")
2700 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2701 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2702 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2703 .Case("ep9312", "4T")
2704 .Cases("arm10tdmi", "arm1020t", "5T")
2705 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2706 .Case("arm926ej-s", "5TEJ")
2707 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2708 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002709 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002710 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00002711 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002712 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2713 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson06f45632011-01-06 16:57:20 +00002714 .Case("cortex-m3", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00002715 .Case("cortex-m0", "6M")
Daniel Dunbareac7c532009-12-18 18:42:37 +00002716 .Default(0);
2717 }
2718 virtual bool setCPU(const std::string &Name) {
2719 if (!getCPUDefineSuffix(Name))
2720 return false;
2721
2722 CPU = Name;
2723 return true;
2724 }
Chris Lattner33328642009-03-20 15:52:06 +00002725 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002726 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00002727 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00002728 Builder.defineMacro("__arm");
2729 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002730
Chris Lattnerc0f59212009-03-02 22:27:17 +00002731 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00002732 Builder.defineMacro("__ARMEL__");
2733 Builder.defineMacro("__LITTLE_ENDIAN__");
2734 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002735
Chris Lattner5f9e2722011-07-23 10:55:15 +00002736 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00002737 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002738
Mike Stump437bb4b2009-04-08 02:07:04 +00002739 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002740
Daniel Dunbareac7c532009-12-18 18:42:37 +00002741 // FIXME: It's more complicated than this and we don't really support
2742 // interworking.
2743 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00002744 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002745
Daniel Dunbareac7c532009-12-18 18:42:37 +00002746 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramera9992772010-01-09 17:55:51 +00002747 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002748
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00002749 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00002750 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00002751
2752 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00002753 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002754
Bob Wilson84f95cf2011-05-13 18:56:03 +00002755 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002756 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00002757 Builder.defineMacro("__THUMBEL__");
2758 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00002759 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002760 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00002761 }
2762
2763 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00002764 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002765
2766 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramera9992772010-01-09 17:55:51 +00002767 Builder.defineMacro("__VFP_FP__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00002768
2769 // This only gets set when Neon instructions are actually available, unlike
2770 // the VFP define, hence the soft float and arch check. This is subtly
2771 // different from gcc, we follow the intent which was that it should be set
2772 // when Neon instructions are actually available.
Bob Wilson84f95cf2011-05-13 18:56:03 +00002773 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00002774 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00002775 }
2776 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2777 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00002778 Records = BuiltinInfo;
2779 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00002780 }
Bob Wilson8b30a932012-01-26 22:14:27 +00002781 virtual bool isCLZForZeroUndef() const { return false; }
Chris Lattner393ff042008-04-21 18:56:49 +00002782 virtual const char *getVAListDeclaration() const {
John McCall0e9972c2011-05-09 02:19:37 +00002783 return "typedef void* __builtin_va_list;";
Chris Lattner393ff042008-04-21 18:56:49 +00002784 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002785 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002786 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002787 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002788 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002789 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002790 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002791 // FIXME: Check if this is complete
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002792 switch (*Name) {
Eli Friedmana9f54962008-08-20 07:44:10 +00002793 default:
Nate Begemanad487f42008-04-22 05:03:19 +00002794 case 'l': // r0-r7
2795 case 'h': // r8-r15
2796 case 'w': // VFP Floating point register single precision
2797 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00002798 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00002799 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00002800 case 'Q': // A memory address that is a single base register.
2801 Info.setAllowsMemory();
2802 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00002803 case 'U': // a memory reference...
2804 switch (Name[1]) {
2805 case 'q': // ...ARMV4 ldrsb
2806 case 'v': // ...VFP load/store (reg+constant offset)
2807 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00002808 case 't': // address valid for load/store opaque types wider
2809 // than 128-bits
2810 case 'n': // valid address for Neon doubleword vector load/store
2811 case 'm': // valid address for Neon element and structure load/store
2812 case 's': // valid address for non-offset loads/stores of quad-word
2813 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00002814 Info.setAllowsMemory();
2815 Name++;
2816 return true;
2817 }
Nate Begemanad487f42008-04-22 05:03:19 +00002818 }
Chris Lattner393ff042008-04-21 18:56:49 +00002819 return false;
2820 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00002821 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00002822 std::string R;
2823 switch (*Constraint) {
2824 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00002825 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00002826 Constraint++;
2827 break;
Eric Christopher283f4472011-06-17 00:40:18 +00002828 case 'p': // 'p' should be translated to 'r' by default.
2829 R = std::string("r");
2830 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00002831 default:
2832 return std::string(1, *Constraint);
2833 }
2834 return R;
2835 }
Chris Lattner393ff042008-04-21 18:56:49 +00002836 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00002837 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00002838 return "";
2839 }
2840};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002841
2842const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002843 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002844 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002845 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2846
2847 // Float registers
2848 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2849 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2850 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002851 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00002852
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002853 // Double registers
2854 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2855 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00002856 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2857 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002858
2859 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00002860 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2861 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002862};
2863
2864void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002865 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002866 Names = GCCRegNames;
2867 NumNames = llvm::array_lengthof(GCCRegNames);
2868}
2869
2870const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002871 { { "a1" }, "r0" },
2872 { { "a2" }, "r1" },
2873 { { "a3" }, "r2" },
2874 { { "a4" }, "r3" },
2875 { { "v1" }, "r4" },
2876 { { "v2" }, "r5" },
2877 { { "v3" }, "r6" },
2878 { { "v4" }, "r7" },
2879 { { "v5" }, "r8" },
2880 { { "v6", "rfp" }, "r9" },
2881 { { "sl" }, "r10" },
2882 { { "fp" }, "r11" },
2883 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00002884 { { "r13" }, "sp" },
2885 { { "r14" }, "lr" },
2886 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00002887 // The S, D and Q registers overlap, but aren't really aliases; we
2888 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00002889};
2890
2891void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2892 unsigned &NumAliases) const {
2893 Aliases = GCCRegAliases;
2894 NumAliases = llvm::array_lengthof(GCCRegAliases);
2895}
Chris Lattner2752c012010-03-03 19:03:45 +00002896
2897const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00002898#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00002899#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00002900 ALL_LANGUAGES },
Chris Lattner2752c012010-03-03 19:03:45 +00002901#include "clang/Basic/BuiltinsARM.def"
2902};
Chris Lattner393ff042008-04-21 18:56:49 +00002903} // end anonymous namespace.
2904
Eli Friedmana9f54962008-08-20 07:44:10 +00002905namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00002906class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00002907 public DarwinTargetInfo<ARMTargetInfo> {
2908protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00002909 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00002910 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00002911 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00002912 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002913
Torok Edwin5f6c1942009-06-30 17:10:35 +00002914public:
Mike Stump1eb44332009-09-09 15:08:12 +00002915 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002916 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2917 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00002918 // iOS always has 64-bit atomic instructions.
2919 // FIXME: This should be based off of the target features in ARMTargetInfo.
2920 MaxAtomicInlineWidth = 64;
Daniel Dunbar350b9f32010-05-27 07:00:26 +00002921 }
Eli Friedmana9f54962008-08-20 07:44:10 +00002922};
2923} // end anonymous namespace.
2924
Tony Linthicum96319392011-12-12 21:14:55 +00002925
2926namespace {
2927// Hexagon abstract base class
2928class HexagonTargetInfo : public TargetInfo {
2929 static const Builtin::Info BuiltinInfo[];
2930 static const char * const GCCRegNames[];
2931 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2932 std::string CPU;
2933public:
2934 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00002935 BigEndian = false;
Tony Linthicum96319392011-12-12 21:14:55 +00002936 DescriptionString = ("e-p:32:32:32-"
2937 "i64:64:64-i32:32:32-"
2938 "i16:16:16-i1:32:32-a:0:0");
2939
2940 // {} in inline assembly are packet specifiers, not assembly variant
2941 // specifiers.
2942 NoAsmVariants = true;
2943 }
2944
2945 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2946 unsigned &NumRecords) const {
2947 Records = BuiltinInfo;
2948 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
2949 }
2950
2951 virtual bool validateAsmConstraint(const char *&Name,
2952 TargetInfo::ConstraintInfo &Info) const {
2953 return true;
2954 }
2955
2956 virtual void getTargetDefines(const LangOptions &Opts,
2957 MacroBuilder &Builder) const;
2958
2959 virtual const char *getVAListDeclaration() const {
2960 return "typedef char* __builtin_va_list;";
2961 }
2962 virtual void getGCCRegNames(const char * const *&Names,
2963 unsigned &NumNames) const;
2964 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2965 unsigned &NumAliases) const;
2966 virtual const char *getClobbers() const {
2967 return "";
2968 }
Sebastian Pop43115d42012-01-13 20:37:10 +00002969
2970 static const char *getHexagonCPUSuffix(StringRef Name) {
2971 return llvm::StringSwitch<const char*>(Name)
2972 .Case("hexagonv2", "2")
2973 .Case("hexagonv3", "3")
2974 .Case("hexagonv4", "4")
2975 .Default(0);
2976 }
2977
Tony Linthicum96319392011-12-12 21:14:55 +00002978 virtual bool setCPU(const std::string &Name) {
Sebastian Pop43115d42012-01-13 20:37:10 +00002979 if (!getHexagonCPUSuffix(Name))
2980 return false;
2981
Tony Linthicum96319392011-12-12 21:14:55 +00002982 CPU = Name;
2983 return true;
2984 }
2985};
2986
2987void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
2988 MacroBuilder &Builder) const {
2989 Builder.defineMacro("qdsp6");
2990 Builder.defineMacro("__qdsp6", "1");
2991 Builder.defineMacro("__qdsp6__", "1");
2992
2993 Builder.defineMacro("hexagon");
2994 Builder.defineMacro("__hexagon", "1");
2995 Builder.defineMacro("__hexagon__", "1");
2996
2997 if(CPU == "hexagonv1") {
2998 Builder.defineMacro("__HEXAGON_V1__");
2999 Builder.defineMacro("__HEXAGON_ARCH__", "1");
3000 if(Opts.HexagonQdsp6Compat) {
3001 Builder.defineMacro("__QDSP6_V1__");
3002 Builder.defineMacro("__QDSP6_ARCH__", "1");
3003 }
3004 }
3005 else if(CPU == "hexagonv2") {
3006 Builder.defineMacro("__HEXAGON_V2__");
3007 Builder.defineMacro("__HEXAGON_ARCH__", "2");
3008 if(Opts.HexagonQdsp6Compat) {
3009 Builder.defineMacro("__QDSP6_V2__");
3010 Builder.defineMacro("__QDSP6_ARCH__", "2");
3011 }
3012 }
3013 else if(CPU == "hexagonv3") {
3014 Builder.defineMacro("__HEXAGON_V3__");
3015 Builder.defineMacro("__HEXAGON_ARCH__", "3");
3016 if(Opts.HexagonQdsp6Compat) {
3017 Builder.defineMacro("__QDSP6_V3__");
3018 Builder.defineMacro("__QDSP6_ARCH__", "3");
3019 }
3020 }
3021 else if(CPU == "hexagonv4") {
3022 Builder.defineMacro("__HEXAGON_V4__");
3023 Builder.defineMacro("__HEXAGON_ARCH__", "4");
3024 if(Opts.HexagonQdsp6Compat) {
3025 Builder.defineMacro("__QDSP6_V4__");
3026 Builder.defineMacro("__QDSP6_ARCH__", "4");
3027 }
3028 }
3029}
3030
3031const char * const HexagonTargetInfo::GCCRegNames[] = {
3032 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3033 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3034 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3035 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3036 "p0", "p1", "p2", "p3",
3037 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
3038};
3039
3040void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
3041 unsigned &NumNames) const {
3042 Names = GCCRegNames;
3043 NumNames = llvm::array_lengthof(GCCRegNames);
3044}
3045
3046
3047const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
3048 { { "sp" }, "r29" },
3049 { { "fp" }, "r30" },
3050 { { "lr" }, "r31" },
3051 };
3052
3053void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3054 unsigned &NumAliases) const {
3055 Aliases = GCCRegAliases;
3056 NumAliases = llvm::array_lengthof(GCCRegAliases);
3057}
3058
3059
3060const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
3061#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3062#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3063 ALL_LANGUAGES },
3064#include "clang/Basic/BuiltinsHexagon.def"
3065};
3066}
3067
3068
Reid Spencer5f016e22007-07-11 17:01:13 +00003069namespace {
Eli Friedman01b86682008-08-20 07:28:14 +00003070class SparcV8TargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00003071 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3072 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003073 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00003074public:
Eli Friedman01b86682008-08-20 07:28:14 +00003075 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
3076 // FIXME: Support Sparc quad-precision long double?
Eli Friedmane6a24e82011-12-22 03:51:45 +00003077 BigEndian = false;
Eli Friedmaned855cb2008-08-21 00:13:15 +00003078 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 +00003079 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedman01b86682008-08-20 07:28:14 +00003080 }
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003081 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3082 const std::string &Name,
3083 bool Enabled) const {
3084 if (Name == "soft-float")
3085 Features[Name] = Enabled;
3086 else
3087 return false;
3088
3089 return true;
3090 }
3091 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3092 SoftFloat = false;
3093 for (unsigned i = 0, e = Features.size(); i != e; ++i)
3094 if (Features[i] == "+soft-float")
3095 SoftFloat = true;
3096 }
Chris Lattner33328642009-03-20 15:52:06 +00003097 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003098 MacroBuilder &Builder) const {
3099 DefineStd(Builder, "sparc", Opts);
3100 Builder.defineMacro("__sparcv8");
3101 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00003102
3103 if (SoftFloat)
3104 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00003105 }
3106 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3107 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00003108 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00003109 }
3110 virtual const char *getVAListDeclaration() const {
Eli Friedman01b86682008-08-20 07:28:14 +00003111 return "typedef void* __builtin_va_list;";
Gabor Greif26658672008-02-21 16:29:08 +00003112 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003113 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00003114 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003115 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00003116 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003117 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00003118 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00003119 // FIXME: Implement!
3120 return false;
Gabor Greif26658672008-02-21 16:29:08 +00003121 }
3122 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00003123 // FIXME: Implement!
3124 return "";
Gabor Greif26658672008-02-21 16:29:08 +00003125 }
3126};
3127
Chris Lattnere957f532009-01-27 01:58:38 +00003128const char * const SparcV8TargetInfo::GCCRegNames[] = {
3129 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3130 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3131 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3132 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
3133};
3134
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003135void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00003136 unsigned &NumNames) const {
3137 Names = GCCRegNames;
3138 NumNames = llvm::array_lengthof(GCCRegNames);
3139}
3140
3141const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003142 { { "g0" }, "r0" },
3143 { { "g1" }, "r1" },
3144 { { "g2" }, "r2" },
3145 { { "g3" }, "r3" },
3146 { { "g4" }, "r4" },
3147 { { "g5" }, "r5" },
3148 { { "g6" }, "r6" },
3149 { { "g7" }, "r7" },
3150 { { "o0" }, "r8" },
3151 { { "o1" }, "r9" },
3152 { { "o2" }, "r10" },
3153 { { "o3" }, "r11" },
3154 { { "o4" }, "r12" },
3155 { { "o5" }, "r13" },
3156 { { "o6", "sp" }, "r14" },
3157 { { "o7" }, "r15" },
3158 { { "l0" }, "r16" },
3159 { { "l1" }, "r17" },
3160 { { "l2" }, "r18" },
3161 { { "l3" }, "r19" },
3162 { { "l4" }, "r20" },
3163 { { "l5" }, "r21" },
3164 { { "l6" }, "r22" },
3165 { { "l7" }, "r23" },
3166 { { "i0" }, "r24" },
3167 { { "i1" }, "r25" },
3168 { { "i2" }, "r26" },
3169 { { "i3" }, "r27" },
3170 { { "i4" }, "r28" },
3171 { { "i5" }, "r29" },
3172 { { "i6", "fp" }, "r30" },
3173 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00003174};
3175
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003176void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00003177 unsigned &NumAliases) const {
3178 Aliases = GCCRegAliases;
3179 NumAliases = llvm::array_lengthof(GCCRegAliases);
3180}
Gabor Greif26658672008-02-21 16:29:08 +00003181} // end anonymous namespace.
3182
Eli Friedman01b86682008-08-20 07:28:14 +00003183namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003184class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
3185public:
3186 AuroraUXSparcV8TargetInfo(const std::string& triple) :
3187 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
3188 SizeType = UnsignedInt;
3189 PtrDiffType = SignedInt;
3190 }
3191};
Torok Edwin5f6c1942009-06-30 17:10:35 +00003192class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00003193public:
3194 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwin5f6c1942009-06-30 17:10:35 +00003195 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00003196 SizeType = UnsignedInt;
3197 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00003198 }
3199};
3200} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00003201
Chris Lattner2621fd12008-05-08 05:58:21 +00003202namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003203 class MSP430TargetInfo : public TargetInfo {
3204 static const char * const GCCRegNames[];
3205 public:
3206 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003207 BigEndian = false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003208 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00003209 IntWidth = 16; IntAlign = 16;
3210 LongWidth = 32; LongLongWidth = 64;
3211 LongAlign = LongLongAlign = 16;
3212 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003213 SuitableAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003214 SizeType = UnsignedInt;
3215 IntMaxType = SignedLong;
3216 UIntMaxType = UnsignedLong;
3217 IntPtrType = SignedShort;
3218 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00003219 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00003220 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003221 }
3222 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003223 MacroBuilder &Builder) const {
3224 Builder.defineMacro("MSP430");
3225 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003226 // FIXME: defines for different 'flavours' of MCU
3227 }
3228 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3229 unsigned &NumRecords) const {
3230 // FIXME: Implement.
3231 Records = 0;
3232 NumRecords = 0;
3233 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003234 virtual void getGCCRegNames(const char * const *&Names,
3235 unsigned &NumNames) const;
3236 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3237 unsigned &NumAliases) const {
3238 // No aliases.
3239 Aliases = 0;
3240 NumAliases = 0;
3241 }
3242 virtual bool validateAsmConstraint(const char *&Name,
3243 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00003244 // No target constraints for now.
3245 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003246 }
3247 virtual const char *getClobbers() const {
3248 // FIXME: Is this really right?
3249 return "";
3250 }
3251 virtual const char *getVAListDeclaration() const {
3252 // FIXME: implement
Anton Korobeynikoveb716852009-05-08 18:24:57 +00003253 return "typedef char* __builtin_va_list;";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00003254 }
3255 };
3256
3257 const char * const MSP430TargetInfo::GCCRegNames[] = {
3258 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3259 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3260 };
3261
3262 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
3263 unsigned &NumNames) const {
3264 Names = GCCRegNames;
3265 NumNames = llvm::array_lengthof(GCCRegNames);
3266 }
3267}
3268
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00003269namespace {
Eli Friedmanb63decf2009-08-19 20:47:07 +00003270
Mike Stump1eb44332009-09-09 15:08:12 +00003271 // LLVM and Clang cannot be used directly to output native binaries for
3272 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00003273 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00003274 //
3275 // TCE uses the llvm bitcode as input and uses it for generating customized
3276 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00003277 // publicly available in http://tce.cs.tut.fi
3278
Eli Friedman209f5bb2011-10-07 19:51:42 +00003279 static const unsigned TCEOpenCLAddrSpaceMap[] = {
3280 3, // opencl_global
3281 4, // opencl_local
3282 5 // opencl_constant
3283 };
3284
Eli Friedmanb63decf2009-08-19 20:47:07 +00003285 class TCETargetInfo : public TargetInfo{
3286 public:
3287 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
3288 TLSSupported = false;
3289 IntWidth = 32;
3290 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003291 PointerWidth = 32;
3292 IntAlign = 32;
3293 LongAlign = LongLongAlign = 32;
3294 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003295 SuitableAlign = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003296 SizeType = UnsignedInt;
3297 IntMaxType = SignedLong;
3298 UIntMaxType = UnsignedLong;
3299 IntPtrType = SignedInt;
3300 PtrDiffType = SignedInt;
3301 FloatWidth = 32;
3302 FloatAlign = 32;
3303 DoubleWidth = 32;
3304 DoubleAlign = 32;
3305 LongDoubleWidth = 32;
3306 LongDoubleAlign = 32;
3307 FloatFormat = &llvm::APFloat::IEEEsingle;
3308 DoubleFormat = &llvm::APFloat::IEEEsingle;
3309 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00003310 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
3311 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00003312 "f32:32:32-f64:32:32-v64:32:32-"
3313 "v128:32:32-a0:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00003314 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
Eli Friedmanb63decf2009-08-19 20:47:07 +00003315 }
3316
3317 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003318 MacroBuilder &Builder) const {
3319 DefineStd(Builder, "tce", Opts);
3320 Builder.defineMacro("__TCE__");
3321 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00003322 }
3323 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3324 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00003325 virtual const char *getClobbers() const {
3326 return "";
3327 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00003328 virtual const char *getVAListDeclaration() const {
3329 return "typedef void* __builtin_va_list;";
3330 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00003331 virtual void getGCCRegNames(const char * const *&Names,
3332 unsigned &NumNames) const {}
3333 virtual bool validateAsmConstraint(const char *&Name,
3334 TargetInfo::ConstraintInfo &info) const {
3335 return true;
3336 }
3337 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3338 unsigned &NumAliases) const {}
3339 };
3340}
3341
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003342namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003343class MipsTargetInfoBase : public TargetInfo {
3344 std::string CPU;
3345protected:
3346 std::string ABI;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003347public:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003348 MipsTargetInfoBase(const std::string& triple, const std::string& ABIStr)
Akira Hatanaka148735e2011-11-05 01:48:34 +00003349 : TargetInfo(triple), ABI(ABIStr) {}
Eric Christophered734732010-03-02 02:41:08 +00003350 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003351 virtual bool setABI(const std::string &Name) = 0;
Eric Christophered734732010-03-02 02:41:08 +00003352 virtual bool setCPU(const std::string &Name) {
3353 CPU = Name;
3354 return true;
3355 }
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003356 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christophered734732010-03-02 02:41:08 +00003357 Features[ABI] = true;
3358 Features[CPU] = true;
3359 }
3360 virtual void getArchDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003361 MacroBuilder &Builder) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003362 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003363 MacroBuilder &Builder) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003364 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3365 unsigned &NumRecords) const {
3366 // FIXME: Implement!
3367 }
3368 virtual const char *getVAListDeclaration() const {
3369 return "typedef void* __builtin_va_list;";
3370 }
3371 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003372 unsigned &NumNames) const {
3373 static const char * const GCCRegNames[] = {
3374 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
3375 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
3376 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
3377 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
3378 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
3379 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
3380 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
3381 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
3382 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
3383 "$fcc5","$fcc6","$fcc7"
3384 };
3385 Names = GCCRegNames;
3386 NumNames = llvm::array_lengthof(GCCRegNames);
3387 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003388 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003389 unsigned &NumAliases) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003390 virtual bool validateAsmConstraint(const char *&Name,
3391 TargetInfo::ConstraintInfo &Info) const {
3392 switch (*Name) {
3393 default:
Douglas Gregor21a25162011-11-02 20:52:01 +00003394 return false;
3395
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003396 case 'r': // CPU registers.
3397 case 'd': // Equivalent to "r" unless generating MIPS16 code.
3398 case 'y': // Equivalent to "r", backwards compatibility only.
3399 case 'f': // floating-point registers.
3400 Info.setAllowsRegister();
3401 return true;
3402 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003403 }
3404
3405 virtual const char *getClobbers() const {
3406 // FIXME: Implement!
3407 return "";
3408 }
3409};
3410
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003411class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003412public:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003413 Mips32TargetInfoBase(const std::string& triple) :
Akira Hatanaka148735e2011-11-05 01:48:34 +00003414 MipsTargetInfoBase(triple, "o32") {
3415 SizeType = UnsignedInt;
3416 PtrDiffType = SignedInt;
3417 }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003418 virtual bool setABI(const std::string &Name) {
3419 if ((Name == "o32") || (Name == "eabi")) {
3420 ABI = Name;
3421 return true;
3422 } else
3423 return false;
3424 }
3425 virtual void getArchDefines(const LangOptions &Opts,
3426 MacroBuilder &Builder) const {
Douglas Gregorc9a23712011-11-09 15:17:16 +00003427 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
3428 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
3429 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
3430
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003431 if (ABI == "o32") {
3432 Builder.defineMacro("__mips_o32");
3433 Builder.defineMacro("_ABIO32", "1");
3434 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
3435 }
3436 else if (ABI == "eabi")
3437 Builder.defineMacro("__mips_eabi");
3438 else
David Blaikieb219cfc2011-09-23 05:06:16 +00003439 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003440 }
3441 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3442 unsigned &NumAliases) const {
3443 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3444 { { "at" }, "$1" },
3445 { { "v0" }, "$2" },
3446 { { "v1" }, "$3" },
3447 { { "a0" }, "$4" },
3448 { { "a1" }, "$5" },
3449 { { "a2" }, "$6" },
3450 { { "a3" }, "$7" },
3451 { { "t0" }, "$8" },
3452 { { "t1" }, "$9" },
3453 { { "t2" }, "$10" },
3454 { { "t3" }, "$11" },
3455 { { "t4" }, "$12" },
3456 { { "t5" }, "$13" },
3457 { { "t6" }, "$14" },
3458 { { "t7" }, "$15" },
3459 { { "s0" }, "$16" },
3460 { { "s1" }, "$17" },
3461 { { "s2" }, "$18" },
3462 { { "s3" }, "$19" },
3463 { { "s4" }, "$20" },
3464 { { "s5" }, "$21" },
3465 { { "s6" }, "$22" },
3466 { { "s7" }, "$23" },
3467 { { "t8" }, "$24" },
3468 { { "t9" }, "$25" },
3469 { { "k0" }, "$26" },
3470 { { "k1" }, "$27" },
3471 { { "gp" }, "$28" },
3472 { { "sp" }, "$29" },
3473 { { "fp" }, "$30" },
3474 { { "ra" }, "$31" }
3475 };
3476 Aliases = GCCRegAliases;
3477 NumAliases = llvm::array_lengthof(GCCRegAliases);
3478 }
3479};
3480
3481class Mips32EBTargetInfo : public Mips32TargetInfoBase {
3482public:
3483 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3484 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3485 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3486 }
3487 virtual void getTargetDefines(const LangOptions &Opts,
3488 MacroBuilder &Builder) const {
3489 DefineStd(Builder, "mips", Opts);
3490 Builder.defineMacro("_mips");
3491 DefineStd(Builder, "MIPSEB", Opts);
3492 Builder.defineMacro("_MIPSEB");
3493 Builder.defineMacro("__REGISTER_PREFIX__", "");
3494 getArchDefines(Opts, Builder);
3495 }
3496};
3497
3498class Mips32ELTargetInfo : public Mips32TargetInfoBase {
3499public:
3500 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003501 BigEndian = false;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003502 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 +00003503 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003504 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003505 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003506 MacroBuilder &Builder) const {
3507 DefineStd(Builder, "mips", Opts);
3508 Builder.defineMacro("_mips");
3509 DefineStd(Builder, "MIPSEL", Opts);
3510 Builder.defineMacro("_MIPSEL");
3511 Builder.defineMacro("__REGISTER_PREFIX__", "");
3512 getArchDefines(Opts, Builder);
3513 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003514};
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003515
3516class Mips64TargetInfoBase : public MipsTargetInfoBase {
3517 virtual void SetDescriptionString(const std::string &Name) = 0;
3518public:
3519 Mips64TargetInfoBase(const std::string& triple) :
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003520 MipsTargetInfoBase(triple, "n64") {
3521 LongWidth = LongAlign = 64;
3522 PointerWidth = PointerAlign = 64;
3523 LongDoubleWidth = LongDoubleAlign = 128;
3524 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003525 SuitableAlign = 128;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003526 }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003527 virtual bool setABI(const std::string &Name) {
3528 SetDescriptionString(Name);
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003529
3530 if (Name != "n32" && Name != "n64")
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003531 return false;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00003532
3533 ABI = Name;
3534
3535 if (Name == "n32") {
3536 LongWidth = LongAlign = 32;
3537 PointerWidth = PointerAlign = 32;
3538 }
3539
3540 return true;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003541 }
3542 virtual void getArchDefines(const LangOptions &Opts,
3543 MacroBuilder &Builder) const {
3544 if (ABI == "n32") {
3545 Builder.defineMacro("__mips_n32");
3546 Builder.defineMacro("_ABIN32", "2");
3547 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
3548 }
3549 else if (ABI == "n64") {
3550 Builder.defineMacro("__mips_n64");
3551 Builder.defineMacro("_ABI64", "3");
3552 Builder.defineMacro("_MIPS_SIM", "_ABI64");
3553 }
3554 else
David Blaikieb219cfc2011-09-23 05:06:16 +00003555 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003556 }
3557 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3558 unsigned &NumAliases) const {
3559 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3560 { { "at" }, "$1" },
3561 { { "v0" }, "$2" },
3562 { { "v1" }, "$3" },
3563 { { "a0" }, "$4" },
3564 { { "a1" }, "$5" },
3565 { { "a2" }, "$6" },
3566 { { "a3" }, "$7" },
3567 { { "a4" }, "$8" },
3568 { { "a5" }, "$9" },
3569 { { "a6" }, "$10" },
3570 { { "a7" }, "$11" },
3571 { { "t0" }, "$12" },
3572 { { "t1" }, "$13" },
3573 { { "t2" }, "$14" },
3574 { { "t3" }, "$15" },
3575 { { "s0" }, "$16" },
3576 { { "s1" }, "$17" },
3577 { { "s2" }, "$18" },
3578 { { "s3" }, "$19" },
3579 { { "s4" }, "$20" },
3580 { { "s5" }, "$21" },
3581 { { "s6" }, "$22" },
3582 { { "s7" }, "$23" },
3583 { { "t8" }, "$24" },
3584 { { "t9" }, "$25" },
3585 { { "k0" }, "$26" },
3586 { { "k1" }, "$27" },
3587 { { "gp" }, "$28" },
3588 { { "sp" }, "$29" },
3589 { { "fp" }, "$30" },
3590 { { "ra" }, "$31" }
3591 };
3592 Aliases = GCCRegAliases;
3593 NumAliases = llvm::array_lengthof(GCCRegAliases);
3594 }
3595};
3596
3597class Mips64EBTargetInfo : public Mips64TargetInfoBase {
3598 virtual void SetDescriptionString(const std::string &Name) {
3599 // Change DescriptionString only if ABI is n32.
3600 if (Name == "n32")
3601 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 +00003602 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3603 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003604 }
3605public:
3606 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
3607 // Default ABI is n64.
3608 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 +00003609 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3610 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003611 }
3612 virtual void getTargetDefines(const LangOptions &Opts,
3613 MacroBuilder &Builder) const {
3614 DefineStd(Builder, "mips", Opts);
3615 Builder.defineMacro("_mips");
3616 DefineStd(Builder, "MIPSEB", Opts);
3617 Builder.defineMacro("_MIPSEB");
3618 Builder.defineMacro("__REGISTER_PREFIX__", "");
3619 getArchDefines(Opts, Builder);
3620 }
3621};
3622
3623class Mips64ELTargetInfo : public Mips64TargetInfoBase {
3624 virtual void SetDescriptionString(const std::string &Name) {
3625 // Change DescriptionString only if ABI is n32.
3626 if (Name == "n32")
3627 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 +00003628 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
3629 "-v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003630 }
3631public:
3632 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003633 // Default ABI is n64.
3634 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003635 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 +00003636 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
3637 "v64:64:64-n32";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003638 }
3639 virtual void getTargetDefines(const LangOptions &Opts,
3640 MacroBuilder &Builder) const {
3641 DefineStd(Builder, "mips", Opts);
3642 Builder.defineMacro("_mips");
3643 DefineStd(Builder, "MIPSEL", Opts);
3644 Builder.defineMacro("_MIPSEL");
3645 Builder.defineMacro("__REGISTER_PREFIX__", "");
3646 getArchDefines(Opts, Builder);
3647 }
3648};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003649} // end anonymous namespace.
3650
Ivan Krasinef05abd2011-08-24 20:22:22 +00003651namespace {
3652class PNaClTargetInfo : public TargetInfo {
3653public:
3654 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003655 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00003656 this->UserLabelPrefix = "";
3657 this->LongAlign = 32;
3658 this->LongWidth = 32;
3659 this->PointerAlign = 32;
3660 this->PointerWidth = 32;
3661 this->IntMaxType = TargetInfo::SignedLongLong;
3662 this->UIntMaxType = TargetInfo::UnsignedLongLong;
3663 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00003664 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00003665 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00003666 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00003667 this->SizeType = TargetInfo::UnsignedInt;
3668 this->PtrDiffType = TargetInfo::SignedInt;
3669 this->IntPtrType = TargetInfo::SignedInt;
David Meyerdd4a8892011-10-11 03:12:01 +00003670 this->RegParmMax = 2;
Ivan Krasinef05abd2011-08-24 20:22:22 +00003671 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
3672 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
3673 }
3674
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003675 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00003676 }
3677 virtual void getArchDefines(const LangOptions &Opts,
3678 MacroBuilder &Builder) const {
3679 Builder.defineMacro("__le32__");
3680 Builder.defineMacro("__pnacl__");
3681 }
3682 virtual void getTargetDefines(const LangOptions &Opts,
3683 MacroBuilder &Builder) const {
Ivan Krasin089ee112011-08-25 23:49:20 +00003684 DefineStd(Builder, "unix", Opts);
3685 Builder.defineMacro("__ELF__");
3686 if (Opts.POSIXThreads)
3687 Builder.defineMacro("_REENTRANT");
3688 if (Opts.CPlusPlus)
3689 Builder.defineMacro("_GNU_SOURCE");
3690
Ivan Krasinef05abd2011-08-24 20:22:22 +00003691 Builder.defineMacro("__native_client__");
3692 getArchDefines(Opts, Builder);
3693 }
3694 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3695 unsigned &NumRecords) const {
3696 }
3697 virtual const char *getVAListDeclaration() const {
Ivan Krasin68018db2011-09-20 14:56:54 +00003698 return "typedef int __builtin_va_list[4];";
Ivan Krasinef05abd2011-08-24 20:22:22 +00003699 }
3700 virtual void getGCCRegNames(const char * const *&Names,
3701 unsigned &NumNames) const;
3702 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3703 unsigned &NumAliases) const;
3704 virtual bool validateAsmConstraint(const char *&Name,
3705 TargetInfo::ConstraintInfo &Info) const {
3706 return false;
3707 }
3708
3709 virtual const char *getClobbers() const {
3710 return "";
3711 }
3712};
3713
3714void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
3715 unsigned &NumNames) const {
3716 Names = NULL;
3717 NumNames = 0;
3718}
3719
3720void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3721 unsigned &NumAliases) const {
3722 Aliases = NULL;
3723 NumAliases = 0;
3724}
3725} // end anonymous namespace.
3726
3727
Reid Spencer5f016e22007-07-11 17:01:13 +00003728//===----------------------------------------------------------------------===//
3729// Driver code
3730//===----------------------------------------------------------------------===//
3731
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003732static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003733 llvm::Triple Triple(T);
3734 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00003735
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003736 switch (Triple.getArch()) {
3737 default:
3738 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00003739
Tony Linthicum96319392011-12-12 21:14:55 +00003740 case llvm::Triple::hexagon:
3741 return new HexagonTargetInfo(T);
3742
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003743 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00003744 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003745 if (Triple.isOSDarwin())
3746 return new DarwinARMTargetInfo(T);
3747
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003748 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00003749 case llvm::Triple::Linux:
3750 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003751 case llvm::Triple::FreeBSD:
Torok Edwin5f6c1942009-06-30 17:10:35 +00003752 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003753 case llvm::Triple::NetBSD:
3754 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Douglas Gregordca52262011-07-01 22:41:14 +00003755 case llvm::Triple::RTEMS:
3756 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003757 default:
3758 return new ARMTargetInfo(T);
3759 }
Eli Friedman61538a72008-05-20 14:21:01 +00003760
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003761 case llvm::Triple::msp430:
3762 return new MSP430TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +00003763
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003764 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003765 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003766 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003767 return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003768 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003769 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003770 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003771 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003772 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003773 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003774 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003775 return new Mips32EBTargetInfo(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00003776 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003777
3778 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003779 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003780 case llvm::Triple::Linux:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003781 return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003782 case llvm::Triple::RTEMS:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003783 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003784 case llvm::Triple::FreeBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003785 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003786 case llvm::Triple::NetBSD:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003787 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003788 default:
Akira Hatanakab6a37b32011-09-20 19:00:23 +00003789 return new Mips32ELTargetInfo(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00003790 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00003791
Akira Hatanakabf5851a2011-09-20 19:21:49 +00003792 case llvm::Triple::mips64:
3793 switch (os) {
3794 case llvm::Triple::Linux:
3795 return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
3796 case llvm::Triple::RTEMS:
3797 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
3798 case llvm::Triple::FreeBSD:
3799 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
3800 case llvm::Triple::NetBSD:
3801 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
3802 default:
3803 return new Mips64EBTargetInfo(T);
3804 }
3805
3806 case llvm::Triple::mips64el:
3807 switch (os) {
3808 case llvm::Triple::Linux:
3809 return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
3810 case llvm::Triple::RTEMS:
3811 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
3812 case llvm::Triple::FreeBSD:
3813 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
3814 case llvm::Triple::NetBSD:
3815 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
3816 default:
3817 return new Mips64ELTargetInfo(T);
3818 }
3819
Ivan Krasinef05abd2011-08-24 20:22:22 +00003820 case llvm::Triple::le32:
3821 switch (os) {
3822 case llvm::Triple::NativeClient:
3823 return new PNaClTargetInfo(T);
3824 default:
3825 return NULL;
3826 }
3827
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003828 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003829 if (Triple.isOSDarwin())
Roman Divackyc81f2a22011-01-06 08:27:10 +00003830 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003831 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003832 case llvm::Triple::Linux:
3833 return new LinuxTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003834 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00003835 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003836 case llvm::Triple::NetBSD:
3837 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
3838 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00003839 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003840 default:
3841 return new PPC32TargetInfo(T);
3842 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003843
3844 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003845 if (Triple.isOSDarwin())
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00003846 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003847 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003848 case llvm::Triple::Linux:
3849 return new LinuxTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003850 case llvm::Triple::Lv2:
John Thompson3f6918a2009-11-19 17:18:50 +00003851 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003852 case llvm::Triple::FreeBSD:
Chris Lattnere03ae302010-02-16 18:14:57 +00003853 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003854 case llvm::Triple::NetBSD:
3855 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
3856 default:
3857 return new PPC64TargetInfo(T);
3858 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003859
Justin Holewinski285dc652011-04-20 19:34:15 +00003860 case llvm::Triple::ptx32:
3861 return new PTX32TargetInfo(T);
3862 case llvm::Triple::ptx64:
3863 return new PTX64TargetInfo(T);
3864
Chris Lattner9cbeb632010-03-06 21:21:27 +00003865 case llvm::Triple::mblaze:
3866 return new MBlazeTargetInfo(T);
3867
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003868 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003869 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00003870 case llvm::Triple::Linux:
3871 return new LinuxTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003872 case llvm::Triple::AuroraUX:
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003873 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003874 case llvm::Triple::Solaris:
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003875 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003876 case llvm::Triple::NetBSD:
3877 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
3878 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00003879 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00003880 default:
3881 return new SparcV8TargetInfo(T);
3882 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003883
John Thompson3f6918a2009-11-19 17:18:50 +00003884 // FIXME: Need a real SPU target.
3885 case llvm::Triple::cellspu:
3886 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
3887
Eli Friedmanb63decf2009-08-19 20:47:07 +00003888 case llvm::Triple::tce:
3889 return new TCETargetInfo(T);
3890
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003891 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003892 if (Triple.isOSDarwin())
3893 return new DarwinI386TargetInfo(T);
3894
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003895 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003896 case llvm::Triple::AuroraUX:
3897 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003898 case llvm::Triple::Linux:
3899 return new LinuxTargetInfo<X86_32TargetInfo>(T);
3900 case llvm::Triple::DragonFly:
3901 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
3902 case llvm::Triple::NetBSD:
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00003903 return new NetBSDI386TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003904 case llvm::Triple::OpenBSD:
3905 return new OpenBSDI386TargetInfo(T);
3906 case llvm::Triple::FreeBSD:
3907 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner38e317d2010-07-07 16:01:42 +00003908 case llvm::Triple::Minix:
3909 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003910 case llvm::Triple::Solaris:
3911 return new SolarisTargetInfo<X86_32TargetInfo>(T);
3912 case llvm::Triple::Cygwin:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003913 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003914 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003915 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003916 case llvm::Triple::Win32:
Michael J. Spencera764e832010-10-21 08:22:51 +00003917 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattner86ed3a32010-04-11 19:29:39 +00003918 case llvm::Triple::Haiku:
3919 return new HaikuX86_32TargetInfo(T);
Douglas Gregordca52262011-07-01 22:41:14 +00003920 case llvm::Triple::RTEMS:
3921 return new RTEMSX86_32TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003922 default:
3923 return new X86_32TargetInfo(T);
3924 }
3925
3926 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003927 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
3928 return new DarwinX86_64TargetInfo(T);
3929
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003930 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00003931 case llvm::Triple::AuroraUX:
3932 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003933 case llvm::Triple::Linux:
3934 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner7a7ca282010-01-09 05:41:14 +00003935 case llvm::Triple::DragonFly:
3936 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003937 case llvm::Triple::NetBSD:
3938 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
3939 case llvm::Triple::OpenBSD:
3940 return new OpenBSDX86_64TargetInfo(T);
3941 case llvm::Triple::FreeBSD:
3942 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
3943 case llvm::Triple::Solaris:
3944 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00003945 case llvm::Triple::MinGW32:
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003946 return new MinGWX86_64TargetInfo(T);
3947 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003948 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00003949 default:
3950 return new X86_64TargetInfo(T);
3951 }
3952 }
Reid Spencer5f016e22007-07-11 17:01:13 +00003953}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003954
3955/// CreateTargetInfo - Return the target info object for the specified target
3956/// triple.
David Blaikied6471f72011-09-25 23:23:43 +00003957TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Daniel Dunbarb93292a2009-12-19 03:30:57 +00003958 TargetOptions &Opts) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003959 llvm::Triple Triple(Opts.Triple);
3960
3961 // Construct the target
3962 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
3963 if (!Target) {
3964 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
3965 return 0;
3966 }
3967
Daniel Dunbareac7c532009-12-18 18:42:37 +00003968 // Set the target CPU if specified.
3969 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
3970 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
3971 return 0;
3972 }
3973
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003974 // Set the target ABI if specified.
3975 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
3976 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
3977 return 0;
3978 }
3979
Charles Davis98b7c5c2010-06-11 01:06:47 +00003980 // Set the target C++ ABI.
John McCallee79a4c2010-08-21 22:46:04 +00003981 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davis98b7c5c2010-06-11 01:06:47 +00003982 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
3983 return 0;
3984 }
3985
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003986 // Compute the default target features, we need the target to handle this
3987 // because features may have dependencies on one another.
3988 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003989 Target->getDefaultFeatures(Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003990
3991 // Apply the user specified deltas.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00003992 // First the enables.
Daniel Dunbard58c03f2009-11-15 06:48:46 +00003993 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
3994 ie = Opts.Features.end(); it != ie; ++it) {
3995 const char *Name = it->c_str();
3996
Rafael Espindola53ac3d82011-11-27 20:00:43 +00003997 if (Name[0] != '+')
3998 continue;
3999
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004000 // Apply the feature via the target.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00004001 if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
4002 Diags.Report(diag::err_target_invalid_feature) << Name;
4003 return 0;
4004 }
4005 }
4006
4007 // Then the disables.
4008 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
4009 ie = Opts.Features.end(); it != ie; ++it) {
4010 const char *Name = it->c_str();
4011
4012 if (Name[0] == '+')
4013 continue;
4014
4015 // Apply the feature via the target.
4016 if (Name[0] != '-' ||
4017 !Target->setFeatureEnabled(Features, Name + 1, false)) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004018 Diags.Report(diag::err_target_invalid_feature) << Name;
4019 return 0;
4020 }
4021 }
4022
4023 // Add the features to the compile options.
4024 //
4025 // FIXME: If we are completely confident that we have the right set, we only
4026 // need to pass the minuses.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00004027 Opts.Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004028 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
4029 ie = Features.end(); it != ie; ++it)
Chris Lattner1e5f83b2011-07-14 18:24:21 +00004030 Opts.Features.push_back(std::string(it->second ? "+" : "-") +
Chris Lattner48b78bd2011-07-14 18:45:41 +00004031 it->first().str());
Daniel Dunbarb93292a2009-12-19 03:30:57 +00004032 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00004033
4034 return Target.take();
4035}