blob: 49531baa66557c56f1efca030f7b2196aeb10222 [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"
Chandler Carruth3b844ba2013-01-02 11:45:17 +000028#include "llvm/IR/Type.h"
Chris Lattner797c3c42009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie9fe8c742011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.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:
Benjamin Kramer9df08232013-06-29 16:37:14 +000076 OSTargetInfo(const llvm::Triple &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) {
Bob Wilsond588f5c2013-08-19 20:23:37 +000091 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramera9992772010-01-09 17:55:51 +000092 Builder.defineMacro("__APPLE__");
93 Builder.defineMacro("__MACH__");
94 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenko087c65f2012-09-20 10:10:01 +000095 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
Will Dietz4f45bc02013-01-18 11:30:38 +000097 if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikova7c47172009-05-03 13:42:53 +000098
John McCall098df7f2011-06-16 00:03:19 +000099 if (!Opts.ObjCAutoRefCount) {
John McCallf85e1932011-06-15 23:02:42 +0000100 // __weak is always defined, for use in blocks and with objc pointers.
101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000102
John McCallf85e1932011-06-15 23:02:42 +0000103 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregore289d812011-09-13 17:21:33 +0000104 if (Opts.getGC() != LangOptions::NonGC)
John McCallf85e1932011-06-15 23:02:42 +0000105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106 else
107 Builder.defineMacro("__strong", "");
Eric Christopher7c9adf92011-07-07 22:55:26 +0000108
John McCallf85e1932011-06-15 23:02:42 +0000109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110 // allow this in C, since one might have block pointers in structs that
111 // are used in pure C code and in Objective-C ARC.
112 Builder.defineMacro("__unsafe_unretained", "");
John McCallf85e1932011-06-15 23:02:42 +0000113 }
Eric Christopher7c9adf92011-07-07 22:55:26 +0000114
Eli Friedman2de4fee2009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramera9992772010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedman2de4fee2009-06-04 23:00:29 +0000117 else
Benjamin Kramera9992772010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000122
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000123 // Get the platform type and version number from the triple.
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000124 unsigned Maj, Min, Rev;
Bob Wilson48b68a02012-01-31 23:52:58 +0000125 if (Triple.isMacOSX()) {
126 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000127 PlatformName = "macosx";
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000128 } else {
Bob Wilson48b68a02012-01-31 23:52:58 +0000129 Triple.getOSVersion(Maj, Min, Rev);
130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000131 }
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000132
Sebastian Pop9ec60df2012-01-20 22:01:23 +0000133 // If -target arch-pc-win32-macho option specified, we're
Eric Christopher895d4222011-07-29 21:20:35 +0000134 // generating code for Win32 ABI. No need to emit
Chad Rosierd9259f32011-07-19 20:00:06 +0000135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136 if (PlatformName == "win32") {
137 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138 return;
139 }
140
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000141 // Set the appropriate OS version define.
Bob Wilson48b68a02012-01-31 23:52:58 +0000142 if (Triple.getOS() == llvm::Triple::IOS) {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000144 char Str[6];
145 Str[0] = '0' + Maj;
146 Str[1] = '0' + (Min / 10);
147 Str[2] = '0' + (Min % 10);
148 Str[3] = '0' + (Rev / 10);
149 Str[4] = '0' + (Rev % 10);
150 Str[5] = '\0';
151 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
152 } else {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000153 // Note that the Driver allows versions which aren't representable in the
154 // define (because we only get a single digit for the minor and micro
155 // revision numbers). So, we limit them to the maximum representable
156 // version.
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000157 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000158 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000159 char Str[5];
160 Str[0] = '0' + (Maj / 10);
161 Str[1] = '0' + (Maj % 10);
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000162 Str[2] = '0' + std::min(Min, 9U);
163 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbar21ae3192010-01-26 01:44:04 +0000164 Str[4] = '\0';
165 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar8d33cd72009-04-10 19:52:24 +0000166 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000167
168 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman618234a2008-08-20 02:34:37 +0000169}
Reid Spencer5f016e22007-07-11 17:01:13 +0000170
Chris Lattner797c3c42009-08-10 19:03:04 +0000171namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000172template<typename Target>
173class DarwinTargetInfo : public OSTargetInfo<Target> {
174protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000175 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000176 MacroBuilder &Builder) const {
Eric Christopher7c9adf92011-07-07 22:55:26 +0000177 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000178 this->PlatformMinVersion);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000179 }
Mike Stump1eb44332009-09-09 15:08:12 +0000180
Torok Edwin5f6c1942009-06-30 17:10:35 +0000181public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000182 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
183 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
184 this->MCountName = "\01mcount";
185 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000186
Chris Lattner5f9e2722011-07-23 10:55:15 +0000187 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner797c3c42009-08-10 19:03:04 +0000188 // Let MCSectionMachO validate this.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000189 StringRef Segment, Section;
Chris Lattner797c3c42009-08-10 19:03:04 +0000190 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000191 bool HasTAA;
Chris Lattner797c3c42009-08-10 19:03:04 +0000192 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000193 TAA, HasTAA, StubSize);
Chris Lattner797c3c42009-08-10 19:03:04 +0000194 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000195
Anders Carlsson18af3682010-06-08 22:47:50 +0000196 virtual const char *getStaticInitSectionSpecifier() const {
197 // FIXME: We should return 0 when building kexts.
198 return "__TEXT,__StaticInit,regular,pure_instructions";
199 }
Michael J. Spencer20249a12010-10-21 03:16:25 +0000200
John McCall41887602012-01-29 01:20:30 +0000201 /// Darwin does not support protected visibility. Darwin's "default"
202 /// is very similar to ELF's "protected"; Darwin requires a "weak"
203 /// attribute on declarations that can be dynamically replaced.
204 virtual bool hasProtectedVisibility() const {
205 return false;
206 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000207};
208
Chris Lattner797c3c42009-08-10 19:03:04 +0000209
Torok Edwin5f6c1942009-06-30 17:10:35 +0000210// DragonFlyBSD Target
211template<typename Target>
212class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
213protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000214 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000215 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000216 // DragonFly defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000217 Builder.defineMacro("__DragonFly__");
218 Builder.defineMacro("__DragonFly_cc_version", "100001");
219 Builder.defineMacro("__ELF__");
220 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
221 Builder.defineMacro("__tune_i386__");
222 DefineStd(Builder, "unix", Opts);
Torok Edwin5f6c1942009-06-30 17:10:35 +0000223 }
224public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000225 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
226 : OSTargetInfo<Target>(Triple) {
227 this->UserLabelPrefix = "";
Eli Friedmanb089c4d2012-02-10 23:02:29 +0000228
Benjamin Kramer9df08232013-06-29 16:37:14 +0000229 switch (Triple.getArch()) {
230 default:
231 case llvm::Triple::x86:
232 case llvm::Triple::x86_64:
233 this->MCountName = ".mcount";
234 break;
235 }
Eli Friedmanb089c4d2012-02-10 23:02:29 +0000236 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000237};
238
239// FreeBSD Target
240template<typename Target>
241class FreeBSDTargetInfo : public OSTargetInfo<Target> {
242protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000243 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000244 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000245 // FreeBSD defines; list based off of gcc output
246
Benjamin Kramer474202f2011-10-18 10:10:08 +0000247 unsigned Release = Triple.getOSMajorVersion();
248 if (Release == 0U)
249 Release = 8;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000250
Benjamin Kramer474202f2011-10-18 10:10:08 +0000251 Builder.defineMacro("__FreeBSD__", Twine(Release));
252 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramera9992772010-01-09 17:55:51 +0000253 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
254 DefineStd(Builder, "unix", Opts);
255 Builder.defineMacro("__ELF__");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000256 }
257public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000258 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
259 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000260
Benjamin Kramer9df08232013-06-29 16:37:14 +0000261 switch (Triple.getArch()) {
262 default:
263 case llvm::Triple::x86:
264 case llvm::Triple::x86_64:
265 this->MCountName = ".mcount";
266 break;
267 case llvm::Triple::mips:
268 case llvm::Triple::mipsel:
269 case llvm::Triple::ppc:
270 case llvm::Triple::ppc64:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000271 case llvm::Triple::ppc64le:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000272 this->MCountName = "_mcount";
273 break;
274 case llvm::Triple::arm:
275 this->MCountName = "__mcount";
276 break;
Duncan Sands1e90faf2009-07-08 13:55:08 +0000277 }
Benjamin Kramer9df08232013-06-29 16:37:14 +0000278 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000279};
280
Chris Lattner38e317d2010-07-07 16:01:42 +0000281// Minix Target
282template<typename Target>
283class MinixTargetInfo : public OSTargetInfo<Target> {
284protected:
285 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
286 MacroBuilder &Builder) const {
287 // Minix defines
288
289 Builder.defineMacro("__minix", "3");
290 Builder.defineMacro("_EM_WSIZE", "4");
291 Builder.defineMacro("_EM_PSIZE", "4");
292 Builder.defineMacro("_EM_SSIZE", "2");
293 Builder.defineMacro("_EM_LSIZE", "4");
294 Builder.defineMacro("_EM_FSIZE", "4");
295 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman6d402dc2011-12-08 23:54:21 +0000296 Builder.defineMacro("__ELF__");
Chris Lattner38e317d2010-07-07 16:01:42 +0000297 DefineStd(Builder, "unix", Opts);
298 }
299public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000300 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
301 this->UserLabelPrefix = "";
302 }
Chris Lattner38e317d2010-07-07 16:01:42 +0000303};
304
Torok Edwin5f6c1942009-06-30 17:10:35 +0000305// Linux target
306template<typename Target>
307class LinuxTargetInfo : public OSTargetInfo<Target> {
308protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000309 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000310 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000311 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000312 DefineStd(Builder, "unix", Opts);
313 DefineStd(Builder, "linux", Opts);
314 Builder.defineMacro("__gnu_linux__");
315 Builder.defineMacro("__ELF__");
Logan Chien94a71422012-09-02 09:30:11 +0000316 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov32064032012-04-26 12:08:09 +0000317 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000318 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000319 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000320 if (Opts.CPlusPlus)
321 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000322 }
323public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000324 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000325 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000326 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000327 }
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000328
329 virtual const char *getStaticInitSectionSpecifier() const {
330 return ".text.startup";
331 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000332};
333
Chris Lattnerb62bb282009-07-13 20:29:08 +0000334// NetBSD Target
335template<typename Target>
336class NetBSDTargetInfo : public OSTargetInfo<Target> {
337protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000338 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000339 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000340 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000341 Builder.defineMacro("__NetBSD__");
342 Builder.defineMacro("__unix__");
343 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000344 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000345 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000346 }
347public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000348 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
349 this->UserLabelPrefix = "";
350 }
Chris Lattnerb62bb282009-07-13 20:29:08 +0000351};
352
Torok Edwin5f6c1942009-06-30 17:10:35 +0000353// OpenBSD Target
354template<typename Target>
355class OpenBSDTargetInfo : public OSTargetInfo<Target> {
356protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000357 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000358 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000359 // OpenBSD defines; list based off of gcc output
360
Benjamin Kramera9992772010-01-09 17:55:51 +0000361 Builder.defineMacro("__OpenBSD__");
362 DefineStd(Builder, "unix", Opts);
363 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000364 if (Opts.POSIXThreads)
Chris Lattner4ddcf3b2012-04-25 06:12:24 +0000365 Builder.defineMacro("_REENTRANT");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000366 }
367public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000368 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
369 this->UserLabelPrefix = "";
370 this->TLSSupported = false;
Eli Friedman62d829a2011-12-15 02:15:56 +0000371
Eli Friedman62d829a2011-12-15 02:15:56 +0000372 switch (Triple.getArch()) {
373 default:
374 case llvm::Triple::x86:
375 case llvm::Triple::x86_64:
376 case llvm::Triple::arm:
Eric Christopher825d3862012-11-14 22:08:59 +0000377 case llvm::Triple::sparc:
Eli Friedman62d829a2011-12-15 02:15:56 +0000378 this->MCountName = "__mcount";
379 break;
380 case llvm::Triple::mips64:
381 case llvm::Triple::mips64el:
382 case llvm::Triple::ppc:
Eric Christopher825d3862012-11-14 22:08:59 +0000383 case llvm::Triple::sparcv9:
Eli Friedman62d829a2011-12-15 02:15:56 +0000384 this->MCountName = "_mcount";
385 break;
386 }
387 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000388};
389
Eli Friedman42f74f22012-08-08 23:57:20 +0000390// Bitrig Target
391template<typename Target>
392class BitrigTargetInfo : public OSTargetInfo<Target> {
393protected:
394 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
395 MacroBuilder &Builder) const {
396 // Bitrig defines; list based off of gcc output
397
398 Builder.defineMacro("__Bitrig__");
399 DefineStd(Builder, "unix", Opts);
400 Builder.defineMacro("__ELF__");
401 if (Opts.POSIXThreads)
402 Builder.defineMacro("_REENTRANT");
403 }
404public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000405 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
406 this->UserLabelPrefix = "";
407 this->TLSSupported = false;
408 this->MCountName = "__mcount";
Eli Friedman42f74f22012-08-08 23:57:20 +0000409 }
410};
411
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000412// PSP Target
413template<typename Target>
414class PSPTargetInfo : public OSTargetInfo<Target> {
415protected:
416 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000417 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000418 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000419 Builder.defineMacro("PSP");
420 Builder.defineMacro("_PSP");
421 Builder.defineMacro("__psp__");
422 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000423 }
424public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000425 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000426 this->UserLabelPrefix = "";
427 }
428};
429
John Thompson3f6918a2009-11-19 17:18:50 +0000430// PS3 PPU Target
431template<typename Target>
432class PS3PPUTargetInfo : public OSTargetInfo<Target> {
433protected:
434 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000435 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000436 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000437 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000438 Builder.defineMacro("__PPU__");
439 Builder.defineMacro("__CELLOS_LV2__");
440 Builder.defineMacro("__ELF__");
441 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000442 Builder.defineMacro("_ARCH_PPC64");
443 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000444 }
445public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000446 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompson3f6918a2009-11-19 17:18:50 +0000447 this->UserLabelPrefix = "";
Nick Lewycky99520702011-12-16 22:32:39 +0000448 this->LongWidth = this->LongAlign = 32;
449 this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000450 this->IntMaxType = TargetInfo::SignedLongLong;
451 this->UIntMaxType = TargetInfo::UnsignedLongLong;
452 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000453 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000454 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 +0000455 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000456 }
457};
458
459// FIXME: Need a real SPU target.
460// PS3 SPU Target
461template<typename Target>
462class PS3SPUTargetInfo : public OSTargetInfo<Target> {
463protected:
464 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000465 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000466 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000467 Builder.defineMacro("__SPU__");
468 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000469 }
470public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000471 PS3SPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompson3f6918a2009-11-19 17:18:50 +0000472 this->UserLabelPrefix = "";
473 }
474};
475
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000476// AuroraUX target
477template<typename Target>
478class AuroraUXTargetInfo : public OSTargetInfo<Target> {
479protected:
480 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000481 MacroBuilder &Builder) const {
482 DefineStd(Builder, "sun", Opts);
483 DefineStd(Builder, "unix", Opts);
484 Builder.defineMacro("__ELF__");
485 Builder.defineMacro("__svr4__");
486 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000487 }
488public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000489 AuroraUXTargetInfo(const llvm::Triple &Triple)
490 : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000491 this->UserLabelPrefix = "";
492 this->WCharType = this->SignedLong;
493 // FIXME: WIntType should be SignedLong
494 }
495};
496
Torok Edwin5f6c1942009-06-30 17:10:35 +0000497// Solaris target
498template<typename Target>
499class SolarisTargetInfo : public OSTargetInfo<Target> {
500protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000501 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000502 MacroBuilder &Builder) const {
503 DefineStd(Builder, "sun", Opts);
504 DefineStd(Builder, "unix", Opts);
505 Builder.defineMacro("__ELF__");
506 Builder.defineMacro("__svr4__");
507 Builder.defineMacro("__SVR4");
David Chisnall165329c2012-02-28 17:10:04 +0000508 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
509 // newer, but to 500 for everything else. feature_test.h has a check to
510 // ensure that you are not using C99 with an old version of X/Open or C89
511 // with a new version.
512 if (Opts.C99 || Opts.C11)
513 Builder.defineMacro("_XOPEN_SOURCE", "600");
514 else
515 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnallb4f0bd62012-03-02 10:49:52 +0000516 if (Opts.CPlusPlus)
David Chisnall165329c2012-02-28 17:10:04 +0000517 Builder.defineMacro("__C99FEATURES__");
David Chisnall48fad492012-02-17 18:35:11 +0000518 Builder.defineMacro("_LARGEFILE_SOURCE");
519 Builder.defineMacro("_LARGEFILE64_SOURCE");
520 Builder.defineMacro("__EXTENSIONS__");
David Chisnall165329c2012-02-28 17:10:04 +0000521 Builder.defineMacro("_REENTRANT");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000522 }
523public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000524 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000525 this->UserLabelPrefix = "";
David Chisnallfb027842012-03-28 18:04:14 +0000526 this->WCharType = this->SignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000527 // FIXME: WIntType should be SignedLong
528 }
529};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000530
531// Windows target
532template<typename Target>
533class WindowsTargetInfo : public OSTargetInfo<Target> {
534protected:
535 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
536 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000537 Builder.defineMacro("_WIN32");
538 }
539 void getVisualStudioDefines(const LangOptions &Opts,
540 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000541 if (Opts.CPlusPlus) {
542 if (Opts.RTTI)
543 Builder.defineMacro("_CPPRTTI");
544
545 if (Opts.Exceptions)
546 Builder.defineMacro("_CPPUNWIND");
547 }
548
549 if (!Opts.CharIsSigned)
550 Builder.defineMacro("_CHAR_UNSIGNED");
551
552 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
553 // but it works for now.
554 if (Opts.POSIXThreads)
555 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000556
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000557 if (Opts.MSCVersion != 0)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000558 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000559
Francois Pichet62ec1f22011-09-17 17:15:52 +0000560 if (Opts.MicrosoftExt) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000561 Builder.defineMacro("_MSC_EXTENSIONS");
562
Richard Smith80ad52f2013-01-02 11:42:31 +0000563 if (Opts.CPlusPlus11) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000564 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
565 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
566 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
567 }
568 }
569
570 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000571 }
572
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000573public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000574 WindowsTargetInfo(const llvm::Triple &Triple)
575 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000576};
577
Derek Schuff7da46f92012-10-11 16:55:58 +0000578template <typename Target>
579class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramer9df08232013-06-29 16:37:14 +0000580protected:
Derek Schuff7da46f92012-10-11 16:55:58 +0000581 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
582 MacroBuilder &Builder) const {
583 if (Opts.POSIXThreads)
584 Builder.defineMacro("_REENTRANT");
585 if (Opts.CPlusPlus)
586 Builder.defineMacro("_GNU_SOURCE");
587
588 DefineStd(Builder, "unix", Opts);
589 Builder.defineMacro("__ELF__");
590 Builder.defineMacro("__native_client__");
591 }
Benjamin Kramer9df08232013-06-29 16:37:14 +0000592
593public:
594 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff7da46f92012-10-11 16:55:58 +0000595 this->UserLabelPrefix = "";
596 this->LongAlign = 32;
597 this->LongWidth = 32;
598 this->PointerAlign = 32;
599 this->PointerWidth = 32;
600 this->IntMaxType = TargetInfo::SignedLongLong;
601 this->UIntMaxType = TargetInfo::UnsignedLongLong;
602 this->Int64Type = TargetInfo::SignedLongLong;
603 this->DoubleAlign = 64;
604 this->LongDoubleWidth = 64;
605 this->LongDoubleAlign = 64;
606 this->SizeType = TargetInfo::UnsignedInt;
607 this->PtrDiffType = TargetInfo::SignedInt;
608 this->IntPtrType = TargetInfo::SignedInt;
Eli Benderskyc0783dc2013-04-08 21:31:01 +0000609 // RegParmMax is inherited from the underlying architecture
Derek Schuff7da46f92012-10-11 16:55:58 +0000610 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
611 this->DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
612 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
613 }
Derek Schuff263366f2012-10-16 22:30:41 +0000614 virtual typename Target::CallingConvCheckResult checkCallingConvention(
615 CallingConv CC) const {
616 return CC == CC_PnaclCall ? Target::CCCR_OK :
617 Target::checkCallingConvention(CC);
618 }
Derek Schuff7da46f92012-10-11 16:55:58 +0000619};
Mike Stump1eb44332009-09-09 15:08:12 +0000620} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000621
Chris Lattnerd29b6302008-10-05 21:50:58 +0000622//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000623// Specific target implementations.
624//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000625
Eli Friedmane4277982008-08-20 23:11:40 +0000626namespace {
627// PPC abstract base class
628class PPCTargetInfo : public TargetInfo {
629 static const Builtin::Info BuiltinInfo[];
630 static const char * const GCCRegNames[];
631 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel02a84272012-06-11 22:35:19 +0000632 std::string CPU;
Eli Friedmane4277982008-08-20 23:11:40 +0000633public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000634 PPCTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000635 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber6e1d2ea2012-01-31 02:07:33 +0000636 LongDoubleWidth = LongDoubleAlign = 128;
637 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
638 }
Eli Friedman15b91762009-06-05 07:05:05 +0000639
Hal Finkel39d5fa12012-07-03 16:51:04 +0000640 /// \brief Flags for architecture specific defines.
641 typedef enum {
642 ArchDefineNone = 0,
643 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
644 ArchDefinePpcgr = 1 << 1,
645 ArchDefinePpcsq = 1 << 2,
646 ArchDefine440 = 1 << 3,
647 ArchDefine603 = 1 << 4,
648 ArchDefine604 = 1 << 5,
649 ArchDefinePwr4 = 1 << 6,
Bill Schmidt2821e182013-02-01 20:23:10 +0000650 ArchDefinePwr5 = 1 << 7,
651 ArchDefinePwr5x = 1 << 8,
652 ArchDefinePwr6 = 1 << 9,
653 ArchDefinePwr6x = 1 << 10,
654 ArchDefinePwr7 = 1 << 11,
655 ArchDefineA2 = 1 << 12,
656 ArchDefineA2q = 1 << 13
Hal Finkel39d5fa12012-07-03 16:51:04 +0000657 } ArchDefineTypes;
658
Bill Schmidt2821e182013-02-01 20:23:10 +0000659 // Note: GCC recognizes the following additional cpus:
660 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
661 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
662 // titan, rs64.
Hal Finkel02a84272012-06-11 22:35:19 +0000663 virtual bool setCPU(const std::string &Name) {
664 bool CPUKnown = llvm::StringSwitch<bool>(Name)
665 .Case("generic", true)
666 .Case("440", true)
667 .Case("450", true)
668 .Case("601", true)
669 .Case("602", true)
670 .Case("603", true)
671 .Case("603e", true)
672 .Case("603ev", true)
673 .Case("604", true)
674 .Case("604e", true)
675 .Case("620", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000676 .Case("630", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000677 .Case("g3", true)
678 .Case("7400", true)
679 .Case("g4", true)
680 .Case("7450", true)
681 .Case("g4+", true)
682 .Case("750", true)
683 .Case("970", true)
684 .Case("g5", true)
685 .Case("a2", true)
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000686 .Case("a2q", true)
Hal Finkel7de32962012-09-18 22:25:03 +0000687 .Case("e500mc", true)
688 .Case("e5500", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000689 .Case("power3", true)
690 .Case("pwr3", true)
691 .Case("power4", true)
692 .Case("pwr4", true)
693 .Case("power5", true)
694 .Case("pwr5", true)
695 .Case("power5x", true)
696 .Case("pwr5x", true)
697 .Case("power6", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000698 .Case("pwr6", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000699 .Case("power6x", true)
700 .Case("pwr6x", true)
701 .Case("power7", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000702 .Case("pwr7", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000703 .Case("powerpc", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000704 .Case("ppc", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000705 .Case("powerpc64", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000706 .Case("ppc64", true)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000707 .Case("powerpc64le", true)
708 .Case("ppc64le", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000709 .Default(false);
710
711 if (CPUKnown)
712 CPU = Name;
713
714 return CPUKnown;
715 }
716
Eli Friedmane4277982008-08-20 23:11:40 +0000717 virtual void getTargetBuiltins(const Builtin::Info *&Records,
718 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000719 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000720 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000721 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000722
Bob Wilson9f1c49c2012-01-28 18:02:29 +0000723 virtual bool isCLZForZeroUndef() const { return false; }
724
Chris Lattner33328642009-03-20 15:52:06 +0000725 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000726 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000727
Bill Schmidt199402b2013-02-01 02:14:03 +0000728 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
729
730 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
731 StringRef Name,
732 bool Enabled) const;
733
Douglas Gregore727d212012-01-30 06:38:25 +0000734 virtual bool hasFeature(StringRef Feature) const;
735
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000736 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000737 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000738 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000739 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000740 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000741 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000742 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000743 default: return false;
744 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000745 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000746 case 'b': // Base register
747 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000748 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000749 break;
750 // FIXME: The following are added to allow parsing.
751 // I just took a guess at what the actions should be.
752 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000753 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000754 case 'v': // Altivec vector register
755 Info.setAllowsRegister();
756 break;
757 case 'w':
758 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000759 case 'd':// VSX vector register to hold vector double data
760 case 'f':// VSX vector register to hold vector float data
761 case 's':// VSX vector register to hold scalar float data
762 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000763 break;
764 default:
765 return false;
766 }
767 Info.setAllowsRegister();
768 Name++; // Skip over 'w'.
769 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000770 case 'h': // `MQ', `CTR', or `LINK' register
771 case 'q': // `MQ' register
772 case 'c': // `CTR' register
773 case 'l': // `LINK' register
774 case 'x': // `CR' register (condition register) number 0
775 case 'y': // `CR' register (condition register)
776 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000777 Info.setAllowsRegister();
778 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000779 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000780 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000781 // (use `L' instead for SImode constants)
782 case 'K': // Unsigned 16-bit constant
783 case 'L': // Signed 16-bit constant shifted left 16 bits
784 case 'M': // Constant larger than 31
785 case 'N': // Exact power of 2
786 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000787 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000788 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000789 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000790 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000791 break;
792 case 'm': // Memory operand. Note that on PowerPC targets, m can
793 // include addresses that update the base register. It
794 // is therefore only safe to use `m' in an asm statement
795 // if that asm statement accesses the operand exactly once.
796 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000797 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000798 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000799 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000800 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000801 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
802 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000803 // register to be updated.
804 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000805 if (Name[1] != 's')
806 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000807 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000808 // include any automodification of the base register. Unlike
809 // `m', this constraint can be used in asm statements that
810 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000811 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000812 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000813 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000814 break;
815 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000816 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000817 case 'Z': // Memory operand that is an indexed or indirect from a
818 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000819 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000820 Info.setAllowsMemory();
821 Info.setAllowsRegister();
822 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000823 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000824 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000825 // register (`p' is preferable for asm statements)
826 case 'S': // Constant suitable as a 64-bit mask operand
827 case 'T': // Constant suitable as a 32-bit mask operand
828 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000829 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000830 // instructions
831 case 'W': // Vector constant that does not require memory
832 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000833 break;
834 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000835 }
John Thompson8e6065a2010-06-24 22:44:13 +0000836 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000837 }
Eli Friedmane4277982008-08-20 23:11:40 +0000838 virtual const char *getClobbers() const {
839 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000840 }
Adhemerval Zanellab0fc94c2013-01-22 20:02:45 +0000841 int getEHDataRegisterNumber(unsigned RegNo) const {
842 if (RegNo == 0) return 3;
843 if (RegNo == 1) return 4;
844 return -1;
845 }
Eli Friedmane4277982008-08-20 23:11:40 +0000846};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000847
Eli Friedmane4277982008-08-20 23:11:40 +0000848const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000849#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000850#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000851 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000852#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000853};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000854
855
Chris Lattnerc0f59212009-03-02 22:27:17 +0000856/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
857/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000858void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000859 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000860 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000861 Builder.defineMacro("__ppc__");
Chandler Carruthc6fa1152013-06-25 11:13:47 +0000862 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000863 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000864 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000865 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000866 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000867 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnere03ae302010-02-16 18:14:57 +0000868 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000869 Builder.defineMacro("__ppc64__");
Chandler Carruthc6fa1152013-06-25 11:13:47 +0000870 Builder.defineMacro("__PPC64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000871 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000872
Chris Lattnerc0f59212009-03-02 22:27:17 +0000873 // Target properties.
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000874 if (getTriple().getArch() == llvm::Triple::ppc64le) {
875 Builder.defineMacro("_LITTLE_ENDIAN");
876 Builder.defineMacro("__LITTLE_ENDIAN__");
877 } else {
878 if (getTriple().getOS() != llvm::Triple::NetBSD &&
879 getTriple().getOS() != llvm::Triple::OpenBSD)
880 Builder.defineMacro("_BIG_ENDIAN");
881 Builder.defineMacro("__BIG_ENDIAN__");
882 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000883
Chris Lattnerc0f59212009-03-02 22:27:17 +0000884 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000885 Builder.defineMacro("__NATURAL_ALIGNMENT__");
886 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000887
Chris Lattnerc0f59212009-03-02 22:27:17 +0000888 // FIXME: Should be controlled by command line option.
Roman Divackyb2f6f472013-07-03 19:45:54 +0000889 if (LongDoubleWidth == 128)
890 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000891
John Thompson3f6918a2009-11-19 17:18:50 +0000892 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000893 Builder.defineMacro("__VEC__", "10206");
894 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000895 }
Hal Finkel02a84272012-06-11 22:35:19 +0000896
897 // CPU identification.
Hal Finkel39d5fa12012-07-03 16:51:04 +0000898 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
899 .Case("440", ArchDefineName)
900 .Case("450", ArchDefineName | ArchDefine440)
901 .Case("601", ArchDefineName)
902 .Case("602", ArchDefineName | ArchDefinePpcgr)
903 .Case("603", ArchDefineName | ArchDefinePpcgr)
904 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
905 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
906 .Case("604", ArchDefineName | ArchDefinePpcgr)
907 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
908 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt2821e182013-02-01 20:23:10 +0000909 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000910 .Case("7400", ArchDefineName | ArchDefinePpcgr)
911 .Case("7450", ArchDefineName | ArchDefinePpcgr)
912 .Case("750", ArchDefineName | ArchDefinePpcgr)
913 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
914 | ArchDefinePpcsq)
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000915 .Case("a2", ArchDefineA2)
916 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt2821e182013-02-01 20:23:10 +0000917 .Case("pwr3", ArchDefinePpcgr)
918 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
919 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
920 | ArchDefinePpcsq)
921 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
922 | ArchDefinePpcgr | ArchDefinePpcsq)
923 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
924 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
925 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
926 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
927 | ArchDefinePpcsq)
928 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
929 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
930 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
931 .Case("power3", ArchDefinePpcgr)
932 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
933 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
934 | ArchDefinePpcsq)
935 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
936 | ArchDefinePpcgr | ArchDefinePpcsq)
937 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
938 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
939 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
940 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
941 | ArchDefinePpcsq)
942 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
943 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
944 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000945 .Default(ArchDefineNone);
946
947 if (defs & ArchDefineName)
948 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
949 if (defs & ArchDefinePpcgr)
950 Builder.defineMacro("_ARCH_PPCGR");
951 if (defs & ArchDefinePpcsq)
952 Builder.defineMacro("_ARCH_PPCSQ");
953 if (defs & ArchDefine440)
Hal Finkel02a84272012-06-11 22:35:19 +0000954 Builder.defineMacro("_ARCH_440");
Hal Finkel39d5fa12012-07-03 16:51:04 +0000955 if (defs & ArchDefine603)
956 Builder.defineMacro("_ARCH_603");
957 if (defs & ArchDefine604)
958 Builder.defineMacro("_ARCH_604");
Bill Schmidt2821e182013-02-01 20:23:10 +0000959 if (defs & ArchDefinePwr4)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000960 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt2821e182013-02-01 20:23:10 +0000961 if (defs & ArchDefinePwr5)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000962 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt2821e182013-02-01 20:23:10 +0000963 if (defs & ArchDefinePwr5x)
964 Builder.defineMacro("_ARCH_PWR5X");
965 if (defs & ArchDefinePwr6)
Hal Finkel02a84272012-06-11 22:35:19 +0000966 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt2821e182013-02-01 20:23:10 +0000967 if (defs & ArchDefinePwr6x)
968 Builder.defineMacro("_ARCH_PWR6X");
969 if (defs & ArchDefinePwr7)
970 Builder.defineMacro("_ARCH_PWR7");
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000971 if (defs & ArchDefineA2)
972 Builder.defineMacro("_ARCH_A2");
973 if (defs & ArchDefineA2q) {
974 Builder.defineMacro("_ARCH_A2Q");
975 Builder.defineMacro("_ARCH_QP");
976 }
977
978 if (getTriple().getVendor() == llvm::Triple::BGQ) {
979 Builder.defineMacro("__bg__");
980 Builder.defineMacro("__THW_BLUEGENE__");
981 Builder.defineMacro("__bgq__");
982 Builder.defineMacro("__TOS_BGQ__");
983 }
Bill Schmidt2821e182013-02-01 20:23:10 +0000984
985 // FIXME: The following are not yet generated here by Clang, but are
986 // generated by GCC:
987 //
988 // _SOFT_FLOAT_
989 // __RECIP_PRECISION__
990 // __APPLE_ALTIVEC__
991 // __VSX__
992 // __RECIP__
993 // __RECIPF__
994 // __RSQRTE__
995 // __RSQRTEF__
996 // _SOFT_DOUBLE_
997 // __NO_LWSYNC__
998 // __HAVE_BSWAP__
999 // __LONGDOUBLE128
1000 // __CMODEL_MEDIUM__
1001 // __CMODEL_LARGE__
1002 // _CALL_SYSV
1003 // _CALL_DARWIN
1004 // __NO_FPRS__
Bill Schmidt199402b2013-02-01 02:14:03 +00001005}
1006
1007void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1008 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1009 .Case("7400", true)
1010 .Case("g4", true)
1011 .Case("7450", true)
1012 .Case("g4+", true)
1013 .Case("970", true)
1014 .Case("g5", true)
1015 .Case("pwr6", true)
1016 .Case("pwr7", true)
1017 .Case("ppc64", true)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001018 .Case("ppc64le", true)
Bill Schmidt199402b2013-02-01 02:14:03 +00001019 .Default(false);
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001020
1021 Features["qpx"] = (CPU == "a2q");
Bill Schmidt199402b2013-02-01 02:14:03 +00001022}
1023
1024bool PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1025 StringRef Name,
1026 bool Enabled) const {
Hal Finkelfe6b2712013-03-30 13:47:44 +00001027 if (Name == "altivec" || Name == "fprnd" || Name == "mfocrf" ||
1028 Name == "popcntd" || Name == "qpx") {
Bill Schmidt199402b2013-02-01 02:14:03 +00001029 Features[Name] = Enabled;
1030 return true;
Hal Finkel02a84272012-06-11 22:35:19 +00001031 }
Bill Schmidt199402b2013-02-01 02:14:03 +00001032
1033 return false;
Chris Lattnerc0f59212009-03-02 22:27:17 +00001034}
1035
Douglas Gregore727d212012-01-30 06:38:25 +00001036bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1037 return Feature == "powerpc";
1038}
Chris Lattner393ff042008-04-21 18:56:49 +00001039
Douglas Gregore727d212012-01-30 06:38:25 +00001040
Eli Friedmane4277982008-08-20 23:11:40 +00001041const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +00001042 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1043 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1044 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1045 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1046 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1047 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1048 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1049 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +00001050 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +00001051 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +00001052 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +00001053 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1054 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1055 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1056 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +00001057 "vrsave", "vscr",
1058 "spe_acc", "spefscr",
1059 "sfp"
1060};
Reid Spencer5f016e22007-07-11 17:01:13 +00001061
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001062void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +00001063 unsigned &NumNames) const {
1064 Names = GCCRegNames;
1065 NumNames = llvm::array_lengthof(GCCRegNames);
1066}
Reid Spencer5f016e22007-07-11 17:01:13 +00001067
Eli Friedmane4277982008-08-20 23:11:40 +00001068const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1069 // While some of these aliases do map to different registers
1070 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001071 { { "0" }, "r0" },
1072 { { "1"}, "r1" },
1073 { { "2" }, "r2" },
1074 { { "3" }, "r3" },
1075 { { "4" }, "r4" },
1076 { { "5" }, "r5" },
1077 { { "6" }, "r6" },
1078 { { "7" }, "r7" },
1079 { { "8" }, "r8" },
1080 { { "9" }, "r9" },
1081 { { "10" }, "r10" },
1082 { { "11" }, "r11" },
1083 { { "12" }, "r12" },
1084 { { "13" }, "r13" },
1085 { { "14" }, "r14" },
1086 { { "15" }, "r15" },
1087 { { "16" }, "r16" },
1088 { { "17" }, "r17" },
1089 { { "18" }, "r18" },
1090 { { "19" }, "r19" },
1091 { { "20" }, "r20" },
1092 { { "21" }, "r21" },
1093 { { "22" }, "r22" },
1094 { { "23" }, "r23" },
1095 { { "24" }, "r24" },
1096 { { "25" }, "r25" },
1097 { { "26" }, "r26" },
1098 { { "27" }, "r27" },
1099 { { "28" }, "r28" },
1100 { { "29" }, "r29" },
1101 { { "30" }, "r30" },
1102 { { "31" }, "r31" },
1103 { { "fr0" }, "f0" },
1104 { { "fr1" }, "f1" },
1105 { { "fr2" }, "f2" },
1106 { { "fr3" }, "f3" },
1107 { { "fr4" }, "f4" },
1108 { { "fr5" }, "f5" },
1109 { { "fr6" }, "f6" },
1110 { { "fr7" }, "f7" },
1111 { { "fr8" }, "f8" },
1112 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +00001113 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001114 { { "fr11" }, "f11" },
1115 { { "fr12" }, "f12" },
1116 { { "fr13" }, "f13" },
1117 { { "fr14" }, "f14" },
1118 { { "fr15" }, "f15" },
1119 { { "fr16" }, "f16" },
1120 { { "fr17" }, "f17" },
1121 { { "fr18" }, "f18" },
1122 { { "fr19" }, "f19" },
1123 { { "fr20" }, "f20" },
1124 { { "fr21" }, "f21" },
1125 { { "fr22" }, "f22" },
1126 { { "fr23" }, "f23" },
1127 { { "fr24" }, "f24" },
1128 { { "fr25" }, "f25" },
1129 { { "fr26" }, "f26" },
1130 { { "fr27" }, "f27" },
1131 { { "fr28" }, "f28" },
1132 { { "fr29" }, "f29" },
1133 { { "fr30" }, "f30" },
1134 { { "fr31" }, "f31" },
1135 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +00001136};
1137
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001138void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +00001139 unsigned &NumAliases) const {
1140 Aliases = GCCRegAliases;
1141 NumAliases = llvm::array_lengthof(GCCRegAliases);
1142}
1143} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00001144
1145namespace {
Eli Friedmane4277982008-08-20 23:11:40 +00001146class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001147public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001148 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +00001149 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 +00001150 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +00001151
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001152 switch (getTriple().getOS()) {
Nico Weber6e1d2ea2012-01-31 02:07:33 +00001153 case llvm::Triple::Linux:
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001154 case llvm::Triple::FreeBSD:
1155 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001156 SizeType = UnsignedInt;
Hal Finkel178a9b82012-03-02 20:54:36 +00001157 PtrDiffType = SignedInt;
1158 IntPtrType = SignedInt;
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001159 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +00001160 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001161 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001162 }
Roman Divackye3d175d2012-03-13 16:53:54 +00001163
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001164 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1165 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001166 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001167 }
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001168
1169 // PPC32 supports atomics up to 4 bytes.
1170 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001171 }
1172
Meador Ingec5613b22012-06-16 03:34:49 +00001173 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001174 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Ingec5613b22012-06-16 03:34:49 +00001175 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001176 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001177};
1178} // end anonymous namespace.
1179
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001180// Note: ABI differences may eventually require us to have a separate
1181// TargetInfo for little endian.
Reid Spencer5f016e22007-07-11 17:01:13 +00001182namespace {
Eli Friedmane4277982008-08-20 23:11:40 +00001183class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001184public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001185 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00001186 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001187 IntMaxType = SignedLong;
1188 UIntMaxType = UnsignedLong;
1189 Int64Type = SignedLong;
Roman Divackye3d175d2012-03-13 16:53:54 +00001190
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001191 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1192 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001193 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Bill Schmidtdbaf4bc2012-10-29 14:59:24 +00001194 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Bill Schmidtb1baad62013-07-03 21:03:06 +00001195 "i64:64:64-f32:32:32-f64:64:64-"
Bill Schmidtdbaf4bc2012-10-29 14:59:24 +00001196 "v128:128:128-n32:64";
1197 } else
1198 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1199 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
1200 "v128:128:128-n32:64";
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001201
1202 // PPC64 supports atomics up to 8 bytes.
1203 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerf291b102008-05-09 06:17:04 +00001204 }
Meador Ingec5613b22012-06-16 03:34:49 +00001205 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1206 return TargetInfo::CharPtrBuiltinVaList;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001207 }
Eli Friedmane4277982008-08-20 23:11:40 +00001208};
1209} // end anonymous namespace.
1210
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001211
1212namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001213class DarwinPPC32TargetInfo :
1214 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001215public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001216 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1217 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001218 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001219 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
David Fangb5afadd2013-05-16 17:51:48 +00001220 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001221 LongLongAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001222 SuitableAlign = 128;
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001223 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1224 "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
Roman Divackyc81f2a22011-01-06 08:27:10 +00001225 }
Meador Ingec5613b22012-06-16 03:34:49 +00001226 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1227 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001228 }
1229};
1230
1231class DarwinPPC64TargetInfo :
1232 public DarwinTargetInfo<PPC64TargetInfo> {
1233public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001234 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1235 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001236 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001237 SuitableAlign = 128;
Bill Schmidtdbaf4bc2012-10-29 14:59:24 +00001238 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1239 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001240 }
1241};
1242} // end anonymous namespace.
1243
Reid Spencer5f016e22007-07-11 17:01:13 +00001244namespace {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001245 static const unsigned NVPTXAddrSpaceMap[] = {
1246 1, // opencl_global
1247 3, // opencl_local
1248 4, // opencl_constant
1249 1, // cuda_device
1250 4, // cuda_constant
1251 3, // cuda_shared
1252 };
1253 class NVPTXTargetInfo : public TargetInfo {
1254 static const char * const GCCRegNames[];
Justin Holewinski2c585b92012-05-24 17:43:12 +00001255 static const Builtin::Info BuiltinInfo[];
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001256 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001257 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001258 BigEndian = false;
1259 TLSSupported = false;
1260 LongWidth = LongAlign = 64;
1261 AddrSpaceMap = &NVPTXAddrSpaceMap;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001262 // Define available target features
1263 // These must be defined in sorted order!
Justin Holewinski9903e942012-07-11 15:34:55 +00001264 NoAsmVariants = true;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001265 }
1266 virtual void getTargetDefines(const LangOptions &Opts,
1267 MacroBuilder &Builder) const {
1268 Builder.defineMacro("__PTX__");
Justin Holewinski2c585b92012-05-24 17:43:12 +00001269 Builder.defineMacro("__NVPTX__");
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001270 }
1271 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1272 unsigned &NumRecords) const {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001273 Records = BuiltinInfo;
1274 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001275 }
1276 virtual bool hasFeature(StringRef Feature) const {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001277 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001278 }
1279
1280 virtual void getGCCRegNames(const char * const *&Names,
1281 unsigned &NumNames) const;
1282 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1283 unsigned &NumAliases) const {
1284 // No aliases.
1285 Aliases = 0;
1286 NumAliases = 0;
1287 }
1288 virtual bool validateAsmConstraint(const char *&Name,
Justin Holewinski0ac428e2013-06-21 18:51:24 +00001289 TargetInfo::ConstraintInfo &Info) const {
1290 switch (*Name) {
1291 default: return false;
1292 case 'c':
1293 case 'h':
1294 case 'r':
1295 case 'l':
1296 case 'f':
1297 case 'd':
1298 Info.setAllowsRegister();
1299 return true;
1300 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001301 }
1302 virtual const char *getClobbers() const {
1303 // FIXME: Is this really right?
1304 return "";
1305 }
Meador Ingec5613b22012-06-16 03:34:49 +00001306 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001307 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00001308 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001309 }
1310 virtual bool setCPU(const std::string &Name) {
Justin Holewinskiaffa3af2013-03-30 14:38:26 +00001311 bool Valid = llvm::StringSwitch<bool>(Name)
1312 .Case("sm_20", true)
1313 .Case("sm_21", true)
1314 .Case("sm_30", true)
1315 .Case("sm_35", true)
1316 .Default(false);
1317
1318 return Valid;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001319 }
Justin Holewinski2c585b92012-05-24 17:43:12 +00001320 };
1321
1322 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1323#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1324#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1325 ALL_LANGUAGES },
1326#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001327 };
1328
1329 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1330 "r0"
1331 };
1332
1333 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1334 unsigned &NumNames) const {
1335 Names = GCCRegNames;
1336 NumNames = llvm::array_lengthof(GCCRegNames);
1337 }
1338
1339 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1340 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001341 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001342 PointerWidth = PointerAlign = 32;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001343 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001344 DescriptionString
1345 = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1346 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1347 "n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001348 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001349 };
1350
1351 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1352 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001353 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001354 PointerWidth = PointerAlign = 64;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001355 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001356 DescriptionString
1357 = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1358 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1359 "n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001360 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001361 };
1362}
1363
1364namespace {
Eli Friedman6505a292012-10-12 23:32:00 +00001365
1366static const unsigned R600AddrSpaceMap[] = {
1367 1, // opencl_global
1368 3, // opencl_local
1369 2, // opencl_constant
1370 1, // cuda_device
1371 2, // cuda_constant
1372 3 // cuda_shared
1373};
1374
Tom Stellardfd075912013-03-04 17:40:53 +00001375static const char *DescriptionStringR600 =
1376 "e"
1377 "-p:32:32:32"
1378 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32"
1379 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1380 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1381 "-n32:64";
1382
1383static const char *DescriptionStringR600DoubleOps =
1384 "e"
1385 "-p:32:32:32"
1386 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64"
1387 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1388 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1389 "-n32:64";
1390
1391static const char *DescriptionStringSI =
1392 "e"
1393 "-p:64:64:64"
1394 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64"
1395 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1396 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1397 "-n32:64";
1398
Eli Friedman6505a292012-10-12 23:32:00 +00001399class R600TargetInfo : public TargetInfo {
Tom Stellardfd075912013-03-04 17:40:53 +00001400 /// \brief The GPU profiles supported by the R600 target.
1401 enum GPUKind {
1402 GK_NONE,
1403 GK_R600,
1404 GK_R600_DOUBLE_OPS,
1405 GK_R700,
1406 GK_R700_DOUBLE_OPS,
1407 GK_EVERGREEN,
1408 GK_EVERGREEN_DOUBLE_OPS,
1409 GK_NORTHERN_ISLANDS,
1410 GK_CAYMAN,
1411 GK_SOUTHERN_ISLANDS
1412 } GPU;
1413
Eli Friedman6505a292012-10-12 23:32:00 +00001414public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001415 R600TargetInfo(const llvm::Triple &Triple)
1416 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardfd075912013-03-04 17:40:53 +00001417 DescriptionString = DescriptionStringR600;
Eli Friedman6505a292012-10-12 23:32:00 +00001418 AddrSpaceMap = &R600AddrSpaceMap;
1419 }
1420
1421 virtual const char * getClobbers() const {
1422 return "";
1423 }
1424
1425 virtual void getGCCRegNames(const char * const *&Names,
1426 unsigned &numNames) const {
1427 Names = NULL;
1428 numNames = 0;
1429 }
1430
1431 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1432 unsigned &NumAliases) const {
1433 Aliases = NULL;
1434 NumAliases = 0;
1435 }
1436
1437 virtual bool validateAsmConstraint(const char *&Name,
1438 TargetInfo::ConstraintInfo &info) const {
1439 return true;
1440 }
1441
1442 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1443 unsigned &NumRecords) const {
1444 Records = NULL;
1445 NumRecords = 0;
1446 }
1447
1448
1449 virtual void getTargetDefines(const LangOptions &Opts,
1450 MacroBuilder &Builder) const {
1451 Builder.defineMacro("__R600__");
1452 }
1453
1454 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1455 return TargetInfo::CharPtrBuiltinVaList;
1456 }
1457
Tom Stellardfd075912013-03-04 17:40:53 +00001458 virtual bool setCPU(const std::string &Name) {
1459 GPU = llvm::StringSwitch<GPUKind>(Name)
1460 .Case("r600" , GK_R600)
1461 .Case("rv610", GK_R600)
1462 .Case("rv620", GK_R600)
1463 .Case("rv630", GK_R600)
1464 .Case("rv635", GK_R600)
1465 .Case("rs780", GK_R600)
1466 .Case("rs880", GK_R600)
1467 .Case("rv670", GK_R600_DOUBLE_OPS)
1468 .Case("rv710", GK_R700)
1469 .Case("rv730", GK_R700)
1470 .Case("rv740", GK_R700_DOUBLE_OPS)
1471 .Case("rv770", GK_R700_DOUBLE_OPS)
1472 .Case("palm", GK_EVERGREEN)
1473 .Case("cedar", GK_EVERGREEN)
1474 .Case("sumo", GK_EVERGREEN)
1475 .Case("sumo2", GK_EVERGREEN)
1476 .Case("redwood", GK_EVERGREEN)
1477 .Case("juniper", GK_EVERGREEN)
1478 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1479 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1480 .Case("barts", GK_NORTHERN_ISLANDS)
1481 .Case("turks", GK_NORTHERN_ISLANDS)
1482 .Case("caicos", GK_NORTHERN_ISLANDS)
1483 .Case("cayman", GK_CAYMAN)
1484 .Case("aruba", GK_CAYMAN)
Tom Stellard3b848ec2013-04-01 20:56:49 +00001485 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardfd075912013-03-04 17:40:53 +00001486 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1487 .Case("verde", GK_SOUTHERN_ISLANDS)
1488 .Case("oland", GK_SOUTHERN_ISLANDS)
1489 .Default(GK_NONE);
1490
1491 if (GPU == GK_NONE) {
1492 return false;
1493 }
1494
1495 // Set the correct data layout
1496 switch (GPU) {
1497 case GK_NONE:
1498 case GK_R600:
1499 case GK_R700:
1500 case GK_EVERGREEN:
1501 case GK_NORTHERN_ISLANDS:
1502 DescriptionString = DescriptionStringR600;
1503 break;
1504 case GK_R600_DOUBLE_OPS:
1505 case GK_R700_DOUBLE_OPS:
1506 case GK_EVERGREEN_DOUBLE_OPS:
1507 case GK_CAYMAN:
1508 DescriptionString = DescriptionStringR600DoubleOps;
1509 break;
1510 case GK_SOUTHERN_ISLANDS:
1511 DescriptionString = DescriptionStringSI;
1512 break;
1513 }
1514
1515 return true;
1516 }
Eli Friedman6505a292012-10-12 23:32:00 +00001517};
1518
1519} // end anonymous namespace
1520
1521namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001522// Namespace for x86 abstract base class
1523const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001524#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001525#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001526 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +00001527#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +00001528};
Eli Friedman61538a72008-05-20 14:21:01 +00001529
Nuno Lopes2550d702009-12-23 17:49:57 +00001530static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +00001531 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1532 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001533 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman618234a2008-08-20 02:34:37 +00001534 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1535 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1536 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001537 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001538 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1539 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman618234a2008-08-20 02:34:37 +00001540};
1541
Eric Christophercfd323d2011-06-21 00:05:20 +00001542const TargetInfo::AddlRegName AddlRegNames[] = {
1543 { { "al", "ah", "eax", "rax" }, 0 },
1544 { { "bl", "bh", "ebx", "rbx" }, 3 },
1545 { { "cl", "ch", "ecx", "rcx" }, 2 },
1546 { { "dl", "dh", "edx", "rdx" }, 1 },
1547 { { "esi", "rsi" }, 4 },
1548 { { "edi", "rdi" }, 5 },
1549 { { "esp", "rsp" }, 7 },
1550 { { "ebp", "rbp" }, 6 },
Eli Friedman618234a2008-08-20 02:34:37 +00001551};
1552
1553// X86 target abstract base class; x86-32 and x86-64 are very close, so
1554// most of the implementation can be shared.
1555class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001556 enum X86SSEEnum {
Craig Topper10c2c682013-08-20 07:09:39 +00001557 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512
Chris Lattner84f0ea82009-03-02 22:40:39 +00001558 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001559 enum MMX3DNowEnum {
1560 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1561 } MMX3DNowLevel;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00001562 enum XOPEnum {
1563 NoXOP,
1564 SSE4A,
1565 FMA4,
1566 XOP
1567 } XOPLevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001568
Eric Christophereea12d12010-04-02 23:50:19 +00001569 bool HasAES;
Craig Topper3c0bc152012-05-31 05:18:48 +00001570 bool HasPCLMUL;
Craig Topper31ceea02011-12-25 05:06:45 +00001571 bool HasLZCNT;
Benjamin Kramer84f30802012-07-07 09:39:18 +00001572 bool HasRDRND;
Craig Topper31ceea02011-12-25 05:06:45 +00001573 bool HasBMI;
1574 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001575 bool HasPOPCNT;
Michael Liao463eb892012-11-10 05:17:46 +00001576 bool HasRTM;
Michael Liao72339a02013-03-26 17:52:08 +00001577 bool HasPRFCHW;
Michael Liao1bfc28c2013-03-29 05:17:55 +00001578 bool HasRDSEED;
Craig Topper2ae95072012-06-03 21:46:30 +00001579 bool HasFMA;
Manman Ren146e5a42012-10-11 00:59:55 +00001580 bool HasF16C;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001581
Chandler Carruth499d9722011-09-28 08:55:34 +00001582 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1583 ///
1584 /// Each enumeration represents a particular CPU supported by Clang. These
1585 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1586 enum CPUKind {
1587 CK_Generic,
1588
1589 /// \name i386
1590 /// i386-generation processors.
1591 //@{
1592 CK_i386,
1593 //@}
1594
1595 /// \name i486
1596 /// i486-generation processors.
1597 //@{
1598 CK_i486,
1599 CK_WinChipC6,
1600 CK_WinChip2,
1601 CK_C3,
1602 //@}
1603
1604 /// \name i586
1605 /// i586-generation processors, P5 microarchitecture based.
1606 //@{
1607 CK_i586,
1608 CK_Pentium,
1609 CK_PentiumMMX,
1610 //@}
1611
1612 /// \name i686
1613 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1614 //@{
1615 CK_i686,
1616 CK_PentiumPro,
1617 CK_Pentium2,
1618 CK_Pentium3,
1619 CK_Pentium3M,
1620 CK_PentiumM,
1621 CK_C3_2,
1622
1623 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1624 /// Clang however has some logic to suport this.
1625 // FIXME: Warn, deprecate, and potentially remove this.
1626 CK_Yonah,
1627 //@}
1628
1629 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001630 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001631 //@{
1632 CK_Pentium4,
1633 CK_Pentium4M,
1634 CK_Prescott,
1635 CK_Nocona,
1636 //@}
1637
1638 /// \name Core
1639 /// Core microarchitecture based processors.
1640 //@{
1641 CK_Core2,
1642
1643 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1644 /// codename which GCC no longer accepts as an option to -march, but Clang
1645 /// has some logic for recognizing it.
1646 // FIXME: Warn, deprecate, and potentially remove this.
1647 CK_Penryn,
1648 //@}
1649
1650 /// \name Atom
1651 /// Atom processors
1652 //@{
1653 CK_Atom,
1654 //@}
1655
1656 /// \name Nehalem
1657 /// Nehalem microarchitecture based processors.
1658 //@{
1659 CK_Corei7,
1660 CK_Corei7AVX,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001661 CK_CoreAVXi,
Craig Topper2b03bb02011-12-17 19:55:21 +00001662 CK_CoreAVX2,
Chandler Carruth499d9722011-09-28 08:55:34 +00001663 //@}
1664
Craig Topper10c2c682013-08-20 07:09:39 +00001665 /// \name Knights Landing
1666 /// Knights Landing processor.
1667 CK_KNL,
1668
Chandler Carruth499d9722011-09-28 08:55:34 +00001669 /// \name K6
1670 /// K6 architecture processors.
1671 //@{
1672 CK_K6,
1673 CK_K6_2,
1674 CK_K6_3,
1675 //@}
1676
1677 /// \name K7
1678 /// K7 architecture processors.
1679 //@{
1680 CK_Athlon,
1681 CK_AthlonThunderbird,
1682 CK_Athlon4,
1683 CK_AthlonXP,
1684 CK_AthlonMP,
1685 //@}
1686
1687 /// \name K8
1688 /// K8 architecture processors.
1689 //@{
1690 CK_Athlon64,
1691 CK_Athlon64SSE3,
1692 CK_AthlonFX,
1693 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001694 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001695 CK_Opteron,
1696 CK_OpteronSSE3,
Roman Divacky01c770d2011-10-30 07:48:46 +00001697 CK_AMDFAM10,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001698 //@}
Chandler Carruth499d9722011-09-28 08:55:34 +00001699
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001700 /// \name Bobcat
1701 /// Bobcat architecture processors.
1702 //@{
1703 CK_BTVER1,
Benjamin Kramer63063f52013-05-03 10:47:15 +00001704 CK_BTVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001705 //@}
1706
1707 /// \name Bulldozer
1708 /// Bulldozer architecture processors.
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001709 //@{
1710 CK_BDVER1,
1711 CK_BDVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001712 //@}
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001713
Chandler Carruth499d9722011-09-28 08:55:34 +00001714 /// This specification is deprecated and will be removed in the future.
1715 /// Users should prefer \see CK_K8.
1716 // FIXME: Warn on this when the CPU is set to it.
1717 CK_x86_64,
1718 //@}
1719
1720 /// \name Geode
1721 /// Geode processors.
1722 //@{
1723 CK_Geode
1724 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001725 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001726
Eli Friedman618234a2008-08-20 02:34:37 +00001727public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001728 X86TargetInfo(const llvm::Triple &Triple)
1729 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00001730 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1731 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
1732 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasFMA(false),
1733 HasF16C(false), CPU(CK_Generic) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001734 BigEndian = false;
Eli Friedman618234a2008-08-20 02:34:37 +00001735 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001736 }
Benjamin Kramerb4066692011-12-28 15:47:06 +00001737 virtual unsigned getFloatEvalMethod() const {
1738 // X87 evaluates with 80 bits "long double" precision.
1739 return SSELevel == NoSSE ? 2 : 0;
1740 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001741 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1742 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001743 Records = BuiltinInfo;
1744 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001745 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001746 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001747 unsigned &NumNames) const {
1748 Names = GCCRegNames;
1749 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001750 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001751 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001752 unsigned &NumAliases) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001753 Aliases = 0;
1754 NumAliases = 0;
1755 }
1756 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
Eric Christopher825d3862012-11-14 22:08:59 +00001757 unsigned &NumNames) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001758 Names = AddlRegNames;
1759 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001760 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001761 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001762 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings002333f2011-06-07 23:45:05 +00001763 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001764 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001765 return "~{dirflag},~{fpsr},~{flags}";
1766 }
Chris Lattner33328642009-03-20 15:52:06 +00001767 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001768 MacroBuilder &Builder) const;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00001769 void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1770 bool Enabled) const;
1771 void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1772 bool Enabled) const;
1773 void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1774 bool Enabled) const;
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001775 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00001776 StringRef Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001777 bool Enabled) const;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001778 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregore727d212012-01-30 06:38:25 +00001779 virtual bool hasFeature(StringRef Feature) const;
Daniel Dunbarb93292a2009-12-19 03:30:57 +00001780 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001781 virtual const char* getABI() const {
Derek Schuffbabaf312012-10-11 15:52:22 +00001782 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001783 return "avx";
Derek Schuffbabaf312012-10-11 15:52:22 +00001784 else if (getTriple().getArch() == llvm::Triple::x86 &&
1785 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001786 return "no-mmx";
1787 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001788 }
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001789 virtual bool setCPU(const std::string &Name) {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001790 CPU = llvm::StringSwitch<CPUKind>(Name)
1791 .Case("i386", CK_i386)
1792 .Case("i486", CK_i486)
1793 .Case("winchip-c6", CK_WinChipC6)
1794 .Case("winchip2", CK_WinChip2)
1795 .Case("c3", CK_C3)
1796 .Case("i586", CK_i586)
1797 .Case("pentium", CK_Pentium)
1798 .Case("pentium-mmx", CK_PentiumMMX)
1799 .Case("i686", CK_i686)
1800 .Case("pentiumpro", CK_PentiumPro)
1801 .Case("pentium2", CK_Pentium2)
1802 .Case("pentium3", CK_Pentium3)
1803 .Case("pentium3m", CK_Pentium3M)
1804 .Case("pentium-m", CK_PentiumM)
1805 .Case("c3-2", CK_C3_2)
1806 .Case("yonah", CK_Yonah)
1807 .Case("pentium4", CK_Pentium4)
1808 .Case("pentium4m", CK_Pentium4M)
1809 .Case("prescott", CK_Prescott)
1810 .Case("nocona", CK_Nocona)
1811 .Case("core2", CK_Core2)
1812 .Case("penryn", CK_Penryn)
1813 .Case("atom", CK_Atom)
1814 .Case("corei7", CK_Corei7)
1815 .Case("corei7-avx", CK_Corei7AVX)
1816 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper2b03bb02011-12-17 19:55:21 +00001817 .Case("core-avx2", CK_CoreAVX2)
Craig Topper10c2c682013-08-20 07:09:39 +00001818 .Case("knl", CK_KNL)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001819 .Case("k6", CK_K6)
1820 .Case("k6-2", CK_K6_2)
1821 .Case("k6-3", CK_K6_3)
1822 .Case("athlon", CK_Athlon)
1823 .Case("athlon-tbird", CK_AthlonThunderbird)
1824 .Case("athlon-4", CK_Athlon4)
1825 .Case("athlon-xp", CK_AthlonXP)
1826 .Case("athlon-mp", CK_AthlonMP)
1827 .Case("athlon64", CK_Athlon64)
1828 .Case("athlon64-sse3", CK_Athlon64SSE3)
1829 .Case("athlon-fx", CK_AthlonFX)
1830 .Case("k8", CK_K8)
1831 .Case("k8-sse3", CK_K8SSE3)
1832 .Case("opteron", CK_Opteron)
1833 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky01c770d2011-10-30 07:48:46 +00001834 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001835 .Case("btver1", CK_BTVER1)
Benjamin Kramer63063f52013-05-03 10:47:15 +00001836 .Case("btver2", CK_BTVER2)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001837 .Case("bdver1", CK_BDVER1)
1838 .Case("bdver2", CK_BDVER2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001839 .Case("x86-64", CK_x86_64)
1840 .Case("geode", CK_Geode)
1841 .Default(CK_Generic);
1842
Chandler Carruth26a39142011-09-28 09:45:08 +00001843 // Perform any per-CPU checks necessary to determine if this CPU is
1844 // acceptable.
1845 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1846 // invalid without explaining *why*.
1847 switch (CPU) {
1848 case CK_Generic:
1849 // No processor selected!
1850 return false;
1851
1852 case CK_i386:
1853 case CK_i486:
1854 case CK_WinChipC6:
1855 case CK_WinChip2:
1856 case CK_C3:
1857 case CK_i586:
1858 case CK_Pentium:
1859 case CK_PentiumMMX:
1860 case CK_i686:
1861 case CK_PentiumPro:
1862 case CK_Pentium2:
1863 case CK_Pentium3:
1864 case CK_Pentium3M:
1865 case CK_PentiumM:
1866 case CK_Yonah:
1867 case CK_C3_2:
1868 case CK_Pentium4:
1869 case CK_Pentium4M:
1870 case CK_Prescott:
1871 case CK_K6:
1872 case CK_K6_2:
1873 case CK_K6_3:
1874 case CK_Athlon:
1875 case CK_AthlonThunderbird:
1876 case CK_Athlon4:
1877 case CK_AthlonXP:
1878 case CK_AthlonMP:
1879 case CK_Geode:
1880 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffbabaf312012-10-11 15:52:22 +00001881 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth26a39142011-09-28 09:45:08 +00001882 return false;
1883
1884 // Fallthrough
1885 case CK_Nocona:
1886 case CK_Core2:
1887 case CK_Penryn:
1888 case CK_Atom:
1889 case CK_Corei7:
1890 case CK_Corei7AVX:
1891 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001892 case CK_CoreAVX2:
Craig Topper10c2c682013-08-20 07:09:39 +00001893 case CK_KNL:
Chandler Carruth26a39142011-09-28 09:45:08 +00001894 case CK_Athlon64:
1895 case CK_Athlon64SSE3:
1896 case CK_AthlonFX:
1897 case CK_K8:
1898 case CK_K8SSE3:
1899 case CK_Opteron:
1900 case CK_OpteronSSE3:
Roman Divacky01c770d2011-10-30 07:48:46 +00001901 case CK_AMDFAM10:
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001902 case CK_BTVER1:
Benjamin Kramer63063f52013-05-03 10:47:15 +00001903 case CK_BTVER2:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001904 case CK_BDVER1:
1905 case CK_BDVER2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001906 case CK_x86_64:
1907 return true;
1908 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00001909 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001910 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00001911
1912 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
1913 // We accept all non-ARM calling conventions
1914 return (CC == CC_X86ThisCall ||
1915 CC == CC_X86FastCall ||
Peter Collingbourne7728cdd2013-02-23 00:06:18 +00001916 CC == CC_X86StdCall ||
1917 CC == CC_C ||
Guy Benyei38980082012-12-25 08:53:55 +00001918 CC == CC_X86Pascal ||
1919 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00001920 }
1921
Aaron Ballmanfff32482012-12-09 17:45:41 +00001922 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
1923 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00001924 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001925};
Chris Lattner3daed522009-03-02 22:20:04 +00001926
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001927void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001928 // FIXME: This should not be here.
1929 Features["3dnow"] = false;
1930 Features["3dnowa"] = false;
1931 Features["mmx"] = false;
1932 Features["sse"] = false;
1933 Features["sse2"] = false;
1934 Features["sse3"] = false;
1935 Features["ssse3"] = false;
1936 Features["sse41"] = false;
1937 Features["sse42"] = false;
Roman Divacky80b32b82011-10-30 13:47:56 +00001938 Features["sse4a"] = false;
Eric Christophereea12d12010-04-02 23:50:19 +00001939 Features["aes"] = false;
Craig Topper3c0bc152012-05-31 05:18:48 +00001940 Features["pclmul"] = false;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001941 Features["avx"] = false;
Craig Topper2b03bb02011-12-17 19:55:21 +00001942 Features["avx2"] = false;
Craig Topper42f98732013-08-20 07:39:54 +00001943 Features["avx-512"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00001944 Features["lzcnt"] = false;
Benjamin Kramer84f30802012-07-07 09:39:18 +00001945 Features["rdrand"] = false;
Craig Topper31ceea02011-12-25 05:06:45 +00001946 Features["bmi"] = false;
1947 Features["bmi2"] = false;
Craig Toppere14e08b2011-12-29 16:10:46 +00001948 Features["popcnt"] = false;
Michael Liao463eb892012-11-10 05:17:46 +00001949 Features["rtm"] = false;
Michael Liao72339a02013-03-26 17:52:08 +00001950 Features["prfchw"] = false;
Michael Liao1bfc28c2013-03-29 05:17:55 +00001951 Features["rdseed"] = false;
Craig Topper6a511e12011-12-30 07:33:42 +00001952 Features["fma4"] = false;
Craig Topper2ae95072012-06-03 21:46:30 +00001953 Features["fma"] = false;
Craig Topperb6af69e2012-06-09 22:24:14 +00001954 Features["xop"] = false;
Manman Ren146e5a42012-10-11 00:59:55 +00001955 Features["f16c"] = false;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001956
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001957 // FIXME: This *really* should not be here.
1958
1959 // X86_64 always has SSE2.
Derek Schuffbabaf312012-10-11 15:52:22 +00001960 if (getTriple().getArch() == llvm::Triple::x86_64)
Eli Friedman612db2a2012-11-17 01:16:19 +00001961 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001962
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001963 switch (CPU) {
1964 case CK_Generic:
1965 case CK_i386:
1966 case CK_i486:
1967 case CK_i586:
1968 case CK_Pentium:
1969 case CK_i686:
1970 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001971 break;
1972 case CK_PentiumMMX:
1973 case CK_Pentium2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001974 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001975 break;
1976 case CK_Pentium3:
1977 case CK_Pentium3M:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001978 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001979 break;
1980 case CK_PentiumM:
1981 case CK_Pentium4:
1982 case CK_Pentium4M:
1983 case CK_x86_64:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001984 setFeatureEnabled(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001985 break;
1986 case CK_Yonah:
1987 case CK_Prescott:
1988 case CK_Nocona:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001989 setFeatureEnabled(Features, "sse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001990 break;
1991 case CK_Core2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001992 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001993 break;
1994 case CK_Penryn:
Benjamin Kramerb3453a82012-01-04 14:36:57 +00001995 setFeatureEnabled(Features, "sse4.1", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001996 break;
1997 case CK_Atom:
Chandler Carruth49defe62011-09-28 10:36:46 +00001998 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001999 break;
2000 case CK_Corei7:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002001 setFeatureEnabled(Features, "sse4", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002002 break;
2003 case CK_Corei7AVX:
Benjamin Kramer84f30802012-07-07 09:39:18 +00002004 setFeatureEnabled(Features, "avx", true);
2005 setFeatureEnabled(Features, "aes", true);
2006 setFeatureEnabled(Features, "pclmul", true);
2007 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002008 case CK_CoreAVXi:
Craig Topperfd936302012-04-26 07:31:30 +00002009 setFeatureEnabled(Features, "avx", true);
Roman Divackybcaa3b82011-04-05 20:32:44 +00002010 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00002011 setFeatureEnabled(Features, "pclmul", true);
Benjamin Kramer84f30802012-07-07 09:39:18 +00002012 setFeatureEnabled(Features, "rdrnd", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002013 setFeatureEnabled(Features, "f16c", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002014 break;
Craig Topper2b03bb02011-12-17 19:55:21 +00002015 case CK_CoreAVX2:
Craig Topperfd936302012-04-26 07:31:30 +00002016 setFeatureEnabled(Features, "avx2", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00002017 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00002018 setFeatureEnabled(Features, "pclmul", true);
Craig Topper31ceea02011-12-25 05:06:45 +00002019 setFeatureEnabled(Features, "lzcnt", true);
Benjamin Kramer84f30802012-07-07 09:39:18 +00002020 setFeatureEnabled(Features, "rdrnd", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002021 setFeatureEnabled(Features, "f16c", true);
Craig Topper31ceea02011-12-25 05:06:45 +00002022 setFeatureEnabled(Features, "bmi", true);
2023 setFeatureEnabled(Features, "bmi2", true);
Michael Liao463eb892012-11-10 05:17:46 +00002024 setFeatureEnabled(Features, "rtm", true);
Craig Topper2ae95072012-06-03 21:46:30 +00002025 setFeatureEnabled(Features, "fma", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00002026 break;
Craig Topper10c2c682013-08-20 07:09:39 +00002027 case CK_KNL:
Craig Topper42f98732013-08-20 07:39:54 +00002028 setFeatureEnabled(Features, "avx-512", true);
Craig Topper10c2c682013-08-20 07:09:39 +00002029 setFeatureEnabled(Features, "aes", true);
2030 setFeatureEnabled(Features, "pclmul", true);
2031 setFeatureEnabled(Features, "lzcnt", true);
2032 setFeatureEnabled(Features, "rdrnd", true);
2033 setFeatureEnabled(Features, "f16c", true);
2034 setFeatureEnabled(Features, "bmi", true);
2035 setFeatureEnabled(Features, "bmi2", true);
2036 setFeatureEnabled(Features, "rtm", true);
2037 setFeatureEnabled(Features, "fma", true);
2038 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002039 case CK_K6:
2040 case CK_WinChipC6:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002041 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002042 break;
2043 case CK_K6_2:
2044 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002045 case CK_WinChip2:
2046 case CK_C3:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002047 setFeatureEnabled(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002048 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00002049 case CK_Athlon:
2050 case CK_AthlonThunderbird:
2051 case CK_Geode:
2052 setFeatureEnabled(Features, "3dnowa", true);
2053 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002054 case CK_Athlon4:
2055 case CK_AthlonXP:
2056 case CK_AthlonMP:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002057 setFeatureEnabled(Features, "sse", true);
2058 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002059 break;
2060 case CK_K8:
2061 case CK_Opteron:
2062 case CK_Athlon64:
2063 case CK_AthlonFX:
Mike Stump1eb44332009-09-09 15:08:12 +00002064 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002065 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002066 break;
2067 case CK_K8SSE3:
2068 case CK_OpteronSSE3:
2069 case CK_Athlon64SSE3:
Roman Divacky80b32b82011-10-30 13:47:56 +00002070 setFeatureEnabled(Features, "sse3", true);
2071 setFeatureEnabled(Features, "3dnowa", true);
2072 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00002073 case CK_AMDFAM10:
Roman Divackyc8b09a12010-12-29 13:28:29 +00002074 setFeatureEnabled(Features, "sse3", true);
Roman Divacky80b32b82011-10-30 13:47:56 +00002075 setFeatureEnabled(Features, "sse4a", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00002076 setFeatureEnabled(Features, "3dnowa", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002077 setFeatureEnabled(Features, "lzcnt", true);
2078 setFeatureEnabled(Features, "popcnt", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002079 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002080 case CK_BTVER1:
2081 setFeatureEnabled(Features, "ssse3", true);
2082 setFeatureEnabled(Features, "sse4a", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002083 setFeatureEnabled(Features, "lzcnt", true);
2084 setFeatureEnabled(Features, "popcnt", true);
Craig Topper90ea0362012-05-30 05:54:54 +00002085 break;
Benjamin Kramer63063f52013-05-03 10:47:15 +00002086 case CK_BTVER2:
2087 setFeatureEnabled(Features, "avx", true);
2088 setFeatureEnabled(Features, "sse4a", true);
2089 setFeatureEnabled(Features, "lzcnt", true);
2090 setFeatureEnabled(Features, "aes", true);
2091 setFeatureEnabled(Features, "pclmul", true);
2092 setFeatureEnabled(Features, "bmi", true);
2093 setFeatureEnabled(Features, "f16c", true);
2094 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002095 case CK_BDVER1:
Craig Topperb6af69e2012-06-09 22:24:14 +00002096 setFeatureEnabled(Features, "xop", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002097 setFeatureEnabled(Features, "lzcnt", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002098 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00002099 setFeatureEnabled(Features, "pclmul", true);
Eli Friedmanf5824992012-11-26 21:57:28 +00002100 break;
Eli Friedmanfaf35382012-11-17 01:43:10 +00002101 case CK_BDVER2:
2102 setFeatureEnabled(Features, "xop", true);
2103 setFeatureEnabled(Features, "lzcnt", true);
2104 setFeatureEnabled(Features, "aes", true);
2105 setFeatureEnabled(Features, "pclmul", true);
2106 setFeatureEnabled(Features, "bmi", true);
2107 setFeatureEnabled(Features, "fma", true);
2108 setFeatureEnabled(Features, "f16c", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002109 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002110 case CK_C3_2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002111 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002112 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002113 }
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002114}
2115
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002116void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
2117 X86SSEEnum Level, bool Enabled) const {
2118 if (Enabled) {
2119 switch (Level) {
2120 case AVX512:
2121 Features["avx-512"] = true;
2122 case AVX2:
2123 Features["avx2"] = true;
2124 case AVX:
2125 Features["avx"] = true;
2126 case SSE42:
2127 Features["popcnt"] = Features["sse42"] = true;
2128 case SSE41:
2129 Features["sse41"] = true;
2130 case SSSE3:
2131 Features["ssse3"] = true;
2132 case SSE3:
2133 Features["sse3"] = true;
2134 case SSE2:
2135 Features["sse2"] = true;
2136 case SSE1:
2137 setMMXLevel(Features, MMX, Enabled);
2138 Features["sse"] = true;
2139 case NoSSE:
2140 break;
2141 }
2142 return;
2143 }
2144
2145 switch (Level) {
2146 case NoSSE:
2147 case SSE1:
2148 Features["sse"] = false;
2149 case SSE2:
2150 Features["sse2"] = false;
2151 case SSE3:
2152 Features["sse3"] = false;
2153 setXOPLevel(Features, NoXOP, false);
2154 case SSSE3:
2155 Features["ssse3"] = false;
2156 case SSE41:
2157 Features["sse41"] = false;
2158 case SSE42:
2159 Features["popcnt"] = Features["sse42"] = false;
2160 case AVX:
2161 Features["fma"] = Features["avx"] = false;
2162 setXOPLevel(Features, SSE4A, false);
2163 case AVX2:
2164 Features["avx2"] = false;
2165 case AVX512:
2166 Features["avx-512"] = false;
2167 }
2168}
2169
2170void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
2171 MMX3DNowEnum Level, bool Enabled) const {
2172 if (Enabled) {
2173 switch (Level) {
2174 case AMD3DNowAthlon:
2175 Features["3dnowa"] = true;
2176 case AMD3DNow:
2177 Features["3dnow"] = true;
2178 case MMX:
2179 Features["mmx"] = true;
2180 case NoMMX3DNow:
2181 break;
2182 }
2183 return;
2184 }
2185
2186 switch (Level) {
2187 case NoMMX3DNow:
2188 case MMX:
2189 Features["mmx"] = false;
2190 case AMD3DNow:
2191 Features["3dnow"] = false;
2192 case AMD3DNowAthlon:
2193 Features["3dnowa"] = false;
2194 }
2195}
2196
2197void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2198 bool Enabled) const {
2199 if (Enabled) {
2200 switch (Level) {
2201 case XOP:
2202 Features["xop"] = true;
2203 case FMA4:
2204 Features["fma4"] = true;
2205 setSSELevel(Features, AVX, true);
2206 case SSE4A:
2207 Features["sse4a"] = true;
2208 setSSELevel(Features, SSE3, true);
2209 case NoXOP:
2210 break;
2211 }
2212 return;
2213 }
2214
2215 switch (Level) {
2216 case NoXOP:
2217 case SSE4A:
2218 Features["sse4a"] = false;
2219 case FMA4:
2220 Features["fma4"] = false;
2221 case XOP:
2222 Features["xop"] = false;
2223 }
2224}
2225
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002226bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00002227 StringRef Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002228 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00002229 // FIXME: This *really* should not be here. We need some way of translating
2230 // options into llvm subtarget features.
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002231 if (Name == "sse4" || Name == "sse4.2")
2232 Name = "sse42";
2233 if (Name == "sse4.1")
2234 Name = "sse41";
2235 if (Name == "rdrnd")
2236 Name = "rdrand";
2237 if (!Features.count(Name))
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002238 return false;
2239
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002240 Features[Name] = Enabled;
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002241
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002242 if (Name == "mmx")
2243 setMMXLevel(Features, MMX, Enabled);
2244 else if (Name == "sse")
2245 setSSELevel(Features, SSE1, Enabled);
2246 else if (Name == "sse2")
2247 setSSELevel(Features, SSE2, Enabled);
2248 else if (Name == "sse3")
2249 setSSELevel(Features, SSE3, Enabled);
2250 else if (Name == "ssse3")
2251 setSSELevel(Features, SSSE3, Enabled);
2252 else if (Name == "sse42")
2253 setSSELevel(Features, SSE42, Enabled);
2254 else if (Name == "sse41")
2255 setSSELevel(Features, SSE41, Enabled);
2256 else if (Name == "3dnow")
2257 setMMXLevel(Features, AMD3DNow, Enabled);
2258 else if (Name == "3dnowa")
2259 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
2260 else if (Name == "aes") {
2261 if (Enabled)
2262 setSSELevel(Features, SSE2, Enabled);
2263 } else if (Name == "pclmul") {
2264 if (Enabled)
2265 setSSELevel(Features, SSE2, Enabled);
2266 } else if (Name == "avx")
2267 setSSELevel(Features, AVX, Enabled);
2268 else if (Name == "avx2")
2269 setSSELevel(Features, AVX2, Enabled);
2270 else if (Name == "avx-512")
2271 setSSELevel(Features, AVX512, Enabled);
2272 else if (Name == "fma") {
2273 if (Enabled)
2274 setSSELevel(Features, AVX, Enabled);
2275 } else if (Name == "fma4") {
2276 setXOPLevel(Features, FMA4, Enabled);
2277 } else if (Name == "xop") {
2278 setXOPLevel(Features, XOP, Enabled);
2279 } else if (Name == "sse4a") {
2280 setXOPLevel(Features, SSE4A, Enabled);
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002281 }
2282
2283 return true;
2284}
2285
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002286/// HandleTargetOptions - Perform initialization based on the user
2287/// configured set of features.
Daniel Dunbarb93292a2009-12-19 03:30:57 +00002288void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002289 // Remember the maximum enabled sselevel.
2290 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2291 // Ignore disabled features.
2292 if (Features[i][0] == '-')
2293 continue;
2294
Benjamin Kramer713575a2012-03-05 15:10:44 +00002295 StringRef Feature = StringRef(Features[i]).substr(1);
2296
2297 if (Feature == "aes") {
Eric Christophereea12d12010-04-02 23:50:19 +00002298 HasAES = true;
2299 continue;
2300 }
2301
Craig Topper3c0bc152012-05-31 05:18:48 +00002302 if (Feature == "pclmul") {
2303 HasPCLMUL = true;
2304 continue;
2305 }
2306
Benjamin Kramer713575a2012-03-05 15:10:44 +00002307 if (Feature == "lzcnt") {
Craig Topper31ceea02011-12-25 05:06:45 +00002308 HasLZCNT = true;
2309 continue;
2310 }
2311
Benjamin Kramer84f30802012-07-07 09:39:18 +00002312 if (Feature == "rdrand") {
2313 HasRDRND = true;
2314 continue;
2315 }
2316
Benjamin Kramer713575a2012-03-05 15:10:44 +00002317 if (Feature == "bmi") {
Craig Topper31ceea02011-12-25 05:06:45 +00002318 HasBMI = true;
2319 continue;
2320 }
2321
Benjamin Kramer713575a2012-03-05 15:10:44 +00002322 if (Feature == "bmi2") {
Craig Topper31ceea02011-12-25 05:06:45 +00002323 HasBMI2 = true;
2324 continue;
2325 }
2326
Benjamin Kramer713575a2012-03-05 15:10:44 +00002327 if (Feature == "popcnt") {
Craig Toppere14e08b2011-12-29 16:10:46 +00002328 HasPOPCNT = true;
2329 continue;
2330 }
2331
Michael Liao463eb892012-11-10 05:17:46 +00002332 if (Feature == "rtm") {
2333 HasRTM = true;
2334 continue;
2335 }
2336
Michael Liao72339a02013-03-26 17:52:08 +00002337 if (Feature == "prfchw") {
2338 HasPRFCHW = true;
2339 continue;
2340 }
2341
Michael Liao1bfc28c2013-03-29 05:17:55 +00002342 if (Feature == "rdseed") {
2343 HasRDSEED = true;
2344 continue;
2345 }
2346
Craig Topper2ae95072012-06-03 21:46:30 +00002347 if (Feature == "fma") {
2348 HasFMA = true;
2349 continue;
2350 }
2351
Manman Ren146e5a42012-10-11 00:59:55 +00002352 if (Feature == "f16c") {
2353 HasF16C = true;
2354 continue;
2355 }
2356
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002357 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer713575a2012-03-05 15:10:44 +00002358 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper42f98732013-08-20 07:39:54 +00002359 .Case("avx-512", AVX512)
Craig Topper05fe4b52012-01-09 09:19:09 +00002360 .Case("avx2", AVX2)
2361 .Case("avx", AVX)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002362 .Case("sse42", SSE42)
2363 .Case("sse41", SSE41)
2364 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00002365 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002366 .Case("sse2", SSE2)
2367 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002368 .Default(NoSSE);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002369 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002370
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002371 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer713575a2012-03-05 15:10:44 +00002372 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002373 .Case("3dnowa", AMD3DNowAthlon)
2374 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002375 .Case("mmx", MMX)
2376 .Default(NoMMX3DNow);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002377 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002378
2379 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2380 .Case("xop", XOP)
2381 .Case("fma4", FMA4)
2382 .Case("sse4a", SSE4A)
2383 .Default(NoXOP);
2384 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002385 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002386
2387 // Don't tell the backend if we're turning off mmx; it will end up disabling
2388 // SSE, which we don't want.
2389 std::vector<std::string>::iterator it;
2390 it = std::find(Features.begin(), Features.end(), "-mmx");
2391 if (it != Features.end())
2392 Features.erase(it);
Chris Lattner3daed522009-03-02 22:20:04 +00002393}
Chris Lattnerc0f59212009-03-02 22:27:17 +00002394
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002395/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2396/// definitions for this particular subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00002397void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002398 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00002399 // Target identification.
Derek Schuffbabaf312012-10-11 15:52:22 +00002400 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00002401 Builder.defineMacro("__amd64__");
2402 Builder.defineMacro("__amd64");
2403 Builder.defineMacro("__x86_64");
2404 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00002405 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00002406 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00002407 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002408
Chris Lattnerc0f59212009-03-02 22:27:17 +00002409 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002410 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2411 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002412 switch (CPU) {
2413 case CK_Generic:
2414 break;
2415 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002416 // The rest are coming from the i386 define above.
2417 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002418 break;
2419 case CK_i486:
2420 case CK_WinChipC6:
2421 case CK_WinChip2:
2422 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002423 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002424 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00002425 case CK_PentiumMMX:
2426 Builder.defineMacro("__pentium_mmx__");
2427 Builder.defineMacro("__tune_pentium_mmx__");
2428 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002429 case CK_i586:
2430 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002431 defineCPUMacros(Builder, "i586");
2432 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002433 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002434 case CK_Pentium3:
2435 case CK_Pentium3M:
2436 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002437 Builder.defineMacro("__tune_pentium3__");
2438 // Fallthrough
2439 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002440 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002441 Builder.defineMacro("__tune_pentium2__");
2442 // Fallthrough
2443 case CK_PentiumPro:
2444 Builder.defineMacro("__tune_i686__");
2445 Builder.defineMacro("__tune_pentiumpro__");
2446 // Fallthrough
2447 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002448 Builder.defineMacro("__i686");
2449 Builder.defineMacro("__i686__");
2450 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2451 Builder.defineMacro("__pentiumpro");
2452 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002453 break;
2454 case CK_Pentium4:
2455 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002456 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002457 break;
2458 case CK_Yonah:
2459 case CK_Prescott:
2460 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002461 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002462 break;
2463 case CK_Core2:
2464 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002465 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002466 break;
2467 case CK_Atom:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002468 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002469 break;
2470 case CK_Corei7:
2471 case CK_Corei7AVX:
2472 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00002473 case CK_CoreAVX2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002474 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002475 break;
Craig Topper10c2c682013-08-20 07:09:39 +00002476 case CK_KNL:
2477 defineCPUMacros(Builder, "knl");
2478 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002479 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002480 Builder.defineMacro("__k6_2__");
2481 Builder.defineMacro("__tune_k6_2__");
2482 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002483 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002484 if (CPU != CK_K6_2) { // In case of fallthrough
2485 // FIXME: GCC may be enabling these in cases where some other k6
2486 // architecture is specified but -m3dnow is explicitly provided. The
2487 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002488 Builder.defineMacro("__k6_3__");
2489 Builder.defineMacro("__tune_k6_3__");
2490 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00002491 // Fallthrough
2492 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002493 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002494 break;
2495 case CK_Athlon:
2496 case CK_AthlonThunderbird:
2497 case CK_Athlon4:
2498 case CK_AthlonXP:
2499 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002500 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002501 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002502 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002503 Builder.defineMacro("__tune_athlon_sse__");
2504 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002505 break;
2506 case CK_K8:
2507 case CK_K8SSE3:
2508 case CK_x86_64:
2509 case CK_Opteron:
2510 case CK_OpteronSSE3:
2511 case CK_Athlon64:
2512 case CK_Athlon64SSE3:
2513 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002514 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002515 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00002516 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002517 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00002518 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002519 case CK_BTVER1:
2520 defineCPUMacros(Builder, "btver1");
2521 break;
Benjamin Kramer63063f52013-05-03 10:47:15 +00002522 case CK_BTVER2:
2523 defineCPUMacros(Builder, "btver2");
2524 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002525 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002526 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002527 break;
2528 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002529 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002530 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002531 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002532 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002533 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002534 }
Chris Lattner84f0ea82009-03-02 22:40:39 +00002535
Chandler Carruth88c75b02011-09-28 09:54:07 +00002536 // Target properties.
2537 Builder.defineMacro("__LITTLE_ENDIAN__");
2538 Builder.defineMacro("__REGISTER_PREFIX__", "");
2539
Chris Lattner54175442009-04-19 17:32:33 +00002540 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2541 // functions in glibc header files that use FP Stack inline asm which the
2542 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00002543 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002544
Chandler Carruth88c75b02011-09-28 09:54:07 +00002545 if (HasAES)
2546 Builder.defineMacro("__AES__");
2547
Craig Topper3c0bc152012-05-31 05:18:48 +00002548 if (HasPCLMUL)
2549 Builder.defineMacro("__PCLMUL__");
2550
Craig Topper31ceea02011-12-25 05:06:45 +00002551 if (HasLZCNT)
2552 Builder.defineMacro("__LZCNT__");
2553
Benjamin Kramer84f30802012-07-07 09:39:18 +00002554 if (HasRDRND)
2555 Builder.defineMacro("__RDRND__");
2556
Craig Topper31ceea02011-12-25 05:06:45 +00002557 if (HasBMI)
2558 Builder.defineMacro("__BMI__");
2559
2560 if (HasBMI2)
2561 Builder.defineMacro("__BMI2__");
2562
Craig Toppere14e08b2011-12-29 16:10:46 +00002563 if (HasPOPCNT)
2564 Builder.defineMacro("__POPCNT__");
2565
Michael Liao463eb892012-11-10 05:17:46 +00002566 if (HasRTM)
2567 Builder.defineMacro("__RTM__");
2568
Michael Liao72339a02013-03-26 17:52:08 +00002569 if (HasPRFCHW)
2570 Builder.defineMacro("__PRFCHW__");
2571
Michael Liao1bfc28c2013-03-29 05:17:55 +00002572 if (HasRDSEED)
2573 Builder.defineMacro("__RDSEED__");
2574
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002575 switch (XOPLevel) {
2576 case XOP:
2577 Builder.defineMacro("__XOP__");
2578 case FMA4:
Craig Topper6a511e12011-12-30 07:33:42 +00002579 Builder.defineMacro("__FMA4__");
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002580 case SSE4A:
2581 Builder.defineMacro("__SSE4A__");
2582 case NoXOP:
2583 break;
2584 }
Craig Topper6a511e12011-12-30 07:33:42 +00002585
Craig Topper2ae95072012-06-03 21:46:30 +00002586 if (HasFMA)
2587 Builder.defineMacro("__FMA__");
2588
Manman Ren146e5a42012-10-11 00:59:55 +00002589 if (HasF16C)
2590 Builder.defineMacro("__F16C__");
2591
Chris Lattner84f0ea82009-03-02 22:40:39 +00002592 // Each case falls through to the previous one here.
2593 switch (SSELevel) {
Craig Topper10c2c682013-08-20 07:09:39 +00002594 case AVX512:
Craig Topper42f98732013-08-20 07:39:54 +00002595 Builder.defineMacro("__AVX512F__");
Craig Topper05fe4b52012-01-09 09:19:09 +00002596 case AVX2:
2597 Builder.defineMacro("__AVX2__");
2598 case AVX:
2599 Builder.defineMacro("__AVX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002600 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00002601 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002602 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00002603 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002604 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002605 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002606 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002607 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002608 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00002609 Builder.defineMacro("__SSE2__");
2610 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00002611 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00002612 Builder.defineMacro("__SSE__");
2613 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002614 case NoSSE:
Chris Lattner84f0ea82009-03-02 22:40:39 +00002615 break;
2616 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002617
Derek Schuffbabaf312012-10-11 15:52:22 +00002618 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002619 switch (SSELevel) {
Craig Topper10c2c682013-08-20 07:09:39 +00002620 case AVX512:
Craig Topper05fe4b52012-01-09 09:19:09 +00002621 case AVX2:
2622 case AVX:
Michael J. Spencera764e832010-10-21 08:22:51 +00002623 case SSE42:
2624 case SSE41:
2625 case SSSE3:
2626 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002627 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002628 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002629 break;
2630 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002631 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002632 break;
2633 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002634 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002635 }
2636 }
2637
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002638 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002639 switch (MMX3DNowLevel) {
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002640 case AMD3DNowAthlon:
2641 Builder.defineMacro("__3dNOW_A__");
2642 case AMD3DNow:
2643 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002644 case MMX:
2645 Builder.defineMacro("__MMX__");
2646 case NoMMX3DNow:
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002647 break;
2648 }
Michael J. Spencerd1b33942013-04-04 23:53:43 +00002649
2650 if (CPU >= CK_i486) {
2651 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2652 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2653 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2654 }
2655 if (CPU >= CK_i586)
2656 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerc0f59212009-03-02 22:27:17 +00002657}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002658
Douglas Gregore727d212012-01-30 06:38:25 +00002659bool X86TargetInfo::hasFeature(StringRef Feature) const {
2660 return llvm::StringSwitch<bool>(Feature)
2661 .Case("aes", HasAES)
2662 .Case("avx", SSELevel >= AVX)
2663 .Case("avx2", SSELevel >= AVX2)
Craig Topper10c2c682013-08-20 07:09:39 +00002664 .Case("avx512", SSELevel >= AVX512)
Douglas Gregore727d212012-01-30 06:38:25 +00002665 .Case("bmi", HasBMI)
2666 .Case("bmi2", HasBMI2)
Craig Topper2ae95072012-06-03 21:46:30 +00002667 .Case("fma", HasFMA)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002668 .Case("fma4", XOPLevel >= FMA4)
Douglas Gregore727d212012-01-30 06:38:25 +00002669 .Case("lzcnt", HasLZCNT)
Benjamin Kramer84f30802012-07-07 09:39:18 +00002670 .Case("rdrnd", HasRDRND)
Douglas Gregore727d212012-01-30 06:38:25 +00002671 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2672 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2673 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3c0bc152012-05-31 05:18:48 +00002674 .Case("pclmul", HasPCLMUL)
Douglas Gregore727d212012-01-30 06:38:25 +00002675 .Case("popcnt", HasPOPCNT)
Michael Liao463eb892012-11-10 05:17:46 +00002676 .Case("rtm", HasRTM)
Michael Liao72339a02013-03-26 17:52:08 +00002677 .Case("prfchw", HasPRFCHW)
Michael Liao1bfc28c2013-03-29 05:17:55 +00002678 .Case("rdseed", HasRDSEED)
Douglas Gregore727d212012-01-30 06:38:25 +00002679 .Case("sse", SSELevel >= SSE1)
2680 .Case("sse2", SSELevel >= SSE2)
2681 .Case("sse3", SSELevel >= SSE3)
2682 .Case("ssse3", SSELevel >= SSSE3)
2683 .Case("sse41", SSELevel >= SSE41)
2684 .Case("sse42", SSELevel >= SSE42)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002685 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregore727d212012-01-30 06:38:25 +00002686 .Case("x86", true)
Derek Schuffbabaf312012-10-11 15:52:22 +00002687 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2688 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002689 .Case("xop", XOPLevel >= XOP)
Manman Ren146e5a42012-10-11 00:59:55 +00002690 .Case("f16c", HasF16C)
Douglas Gregore727d212012-01-30 06:38:25 +00002691 .Default(false);
2692}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002693
Eli Friedman618234a2008-08-20 02:34:37 +00002694bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002695X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002696 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002697 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00002698 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00002699 case 'Y': // first letter of a pair:
2700 switch (*(Name+1)) {
2701 default: return false;
2702 case '0': // First SSE register.
2703 case 't': // Any SSE register, when SSE2 is enabled.
2704 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2705 case 'm': // any MMX register, when inter-unit moves enabled.
2706 break; // falls through to setAllowsRegister.
2707 }
Eli Friedman618234a2008-08-20 02:34:37 +00002708 case 'a': // eax.
2709 case 'b': // ebx.
2710 case 'c': // ecx.
2711 case 'd': // edx.
2712 case 'S': // esi.
2713 case 'D': // edi.
2714 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00002715 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00002716 case 't': // top of floating point stack.
2717 case 'u': // second from top of floating point stack.
2718 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00002719 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00002720 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00002721 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00002722 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2723 case 'l': // "Index" registers: any general register that can be used as an
2724 // index in a base+index memory access.
2725 Info.setAllowsRegister();
2726 return true;
2727 case 'C': // SSE floating point constant.
2728 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002729 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002730 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002731 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002732 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00002733 return true;
2734 }
2735}
2736
Dale Johannesenf6e2c202010-10-29 23:12:32 +00002737
Eli Friedman618234a2008-08-20 02:34:37 +00002738std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00002739X86TargetInfo::convertConstraint(const char *&Constraint) const {
2740 switch (*Constraint) {
Eli Friedman618234a2008-08-20 02:34:37 +00002741 case 'a': return std::string("{ax}");
2742 case 'b': return std::string("{bx}");
2743 case 'c': return std::string("{cx}");
2744 case 'd': return std::string("{dx}");
2745 case 'S': return std::string("{si}");
2746 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00002747 case 'p': // address
2748 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00002749 case 't': // top of floating point stack.
2750 return std::string("{st}");
2751 case 'u': // second from top of floating point stack.
2752 return std::string("{st(1)}"); // second from top of floating point stack.
2753 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00002754 return std::string(1, *Constraint);
Eli Friedman618234a2008-08-20 02:34:37 +00002755 }
2756}
Eli Friedman618234a2008-08-20 02:34:37 +00002757} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00002758
2759namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002760// X86-32 generic target
2761class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00002762public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002763 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00002764 DoubleAlign = LongLongAlign = 32;
2765 LongDoubleWidth = 96;
2766 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00002767 SuitableAlign = 128;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002768 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2769 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames567c6002011-10-11 00:52:51 +00002770 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman1afabd92009-03-29 20:31:09 +00002771 SizeType = UnsignedInt;
2772 PtrDiffType = SignedInt;
2773 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002774 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002775
2776 // Use fpret for all types.
2777 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2778 (1 << TargetInfo::Double) |
2779 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00002780
2781 // x86-32 has atomics up to 8 bytes
2782 // FIXME: Check that we actually have cmpxchg8b before setting
2783 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2784 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman618234a2008-08-20 02:34:37 +00002785 }
Meador Ingec5613b22012-06-16 03:34:49 +00002786 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2787 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman618234a2008-08-20 02:34:37 +00002788 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002789
Chris Lattner21fb98e2009-09-23 06:06:36 +00002790 int getEHDataRegisterNumber(unsigned RegNo) const {
2791 if (RegNo == 0) return 0;
2792 if (RegNo == 1) return 2;
2793 return -1;
2794 }
Bill Wendling68fd6082012-11-12 06:42:51 +00002795 virtual bool validateInputSize(StringRef Constraint,
2796 unsigned Size) const {
2797 switch (Constraint[0]) {
2798 default: break;
2799 case 'a':
2800 case 'b':
2801 case 'c':
2802 case 'd':
Bill Wendlingf634bdf2012-11-12 18:52:32 +00002803 return Size <= 32;
Bill Wendling68fd6082012-11-12 06:42:51 +00002804 }
2805
2806 return true;
2807 }
Eli Friedman618234a2008-08-20 02:34:37 +00002808};
2809} // end anonymous namespace
2810
2811namespace {
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00002812class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2813public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002814 NetBSDI386TargetInfo(const llvm::Triple &Triple)
2815 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00002816
2817 virtual unsigned getFloatEvalMethod() const {
2818 // NetBSD defaults to "double" rounding
2819 return 1;
2820 }
2821};
2822} // end anonymous namespace
2823
2824namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00002825class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2826public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002827 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
2828 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman624c1462009-07-05 18:47:56 +00002829 SizeType = UnsignedLong;
2830 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00002831 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00002832 }
2833};
2834} // end anonymous namespace
2835
2836namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00002837class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
2838public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002839 BitrigI386TargetInfo(const llvm::Triple &Triple)
2840 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman42f74f22012-08-08 23:57:20 +00002841 SizeType = UnsignedLong;
2842 IntPtrType = SignedLong;
2843 PtrDiffType = SignedLong;
2844 }
2845};
2846} // end anonymous namespace
2847
2848namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00002849class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00002850public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002851 DarwinI386TargetInfo(const llvm::Triple &Triple)
2852 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00002853 LongDoubleWidth = 128;
2854 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002855 SuitableAlign = 128;
Chad Rosierf9e9af72012-07-13 23:57:43 +00002856 MaxVectorAlign = 256;
Eli Friedman1afabd92009-03-29 20:31:09 +00002857 SizeType = UnsignedLong;
2858 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002859 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2860 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002861 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbar613fd672010-05-27 00:35:16 +00002862 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00002863 }
2864
Eli Friedman618234a2008-08-20 02:34:37 +00002865};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00002866} // end anonymous namespace
2867
2868namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00002869// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002870class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00002871public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002872 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
2873 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00002874 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00002875 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00002876 DoubleAlign = LongLongAlign = 64;
2877 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 +00002878 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002879 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedman29a30502008-08-21 01:40:19 +00002880 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002881 virtual void getTargetDefines(const LangOptions &Opts,
2882 MacroBuilder &Builder) const {
2883 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2884 }
2885};
2886} // end anonymous namespace
2887
2888namespace {
2889
2890// x86-32 Windows Visual Studio target
2891class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2892public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002893 VisualStudioWindowsX86_32TargetInfo(const llvm::Triple &Triple)
2894 : WindowsX86_32TargetInfo(Triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002895 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00002896 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2897 }
2898 virtual void getTargetDefines(const LangOptions &Opts,
2899 MacroBuilder &Builder) const {
2900 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2901 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2902 // The value of the following reflects processor type.
2903 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2904 // We lost the original triple, so we use the default.
2905 Builder.defineMacro("_M_IX86", "600");
2906 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002907};
2908} // end anonymous namespace
2909
2910namespace {
2911// x86-32 MinGW target
2912class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2913public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002914 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
2915 : WindowsX86_32TargetInfo(Triple) {}
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002916 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002917 MacroBuilder &Builder) const {
2918 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002919 DefineStd(Builder, "WIN32", Opts);
2920 DefineStd(Builder, "WINNT", Opts);
2921 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00002922 Builder.defineMacro("__MSVCRT__");
2923 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002924
2925 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2926 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002927 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002928 // Provide "as-is" __declspec.
2929 Builder.defineMacro("__declspec", "__declspec");
2930 else
2931 // Provide alias of __attribute__ like mingw32-gcc.
2932 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002933 }
2934};
2935} // end anonymous namespace
2936
2937namespace {
2938// x86-32 Cygwin target
2939class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2940public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002941 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
2942 : X86_32TargetInfo(Triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002943 TLSSupported = false;
2944 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002945 DoubleAlign = LongLongAlign = 64;
2946 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2947 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002948 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002949 }
2950 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002951 MacroBuilder &Builder) const {
2952 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumie72f4d92012-12-14 10:17:26 +00002953 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00002954 Builder.defineMacro("__CYGWIN__");
2955 Builder.defineMacro("__CYGWIN32__");
2956 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00002957 if (Opts.CPlusPlus)
2958 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00002959 }
Eli Friedman29a30502008-08-21 01:40:19 +00002960};
2961} // end anonymous namespace
2962
2963namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00002964// x86-32 Haiku target
2965class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2966public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002967 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattner86ed3a32010-04-11 19:29:39 +00002968 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00002969 IntPtrType = SignedLong;
2970 PtrDiffType = SignedLong;
Eli Friedman6902e412012-11-27 02:58:24 +00002971 ProcessIDType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00002972 this->UserLabelPrefix = "";
Benjamin Krameref7bcea2012-11-08 12:59:15 +00002973 this->TLSSupported = false;
Eli Friedmana7e68452010-08-22 01:00:03 +00002974 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00002975 virtual void getTargetDefines(const LangOptions &Opts,
2976 MacroBuilder &Builder) const {
2977 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2978 Builder.defineMacro("__INTEL__");
2979 Builder.defineMacro("__HAIKU__");
2980 }
2981};
2982} // end anonymous namespace
2983
Douglas Gregordca52262011-07-01 22:41:14 +00002984// RTEMS Target
2985template<typename Target>
2986class RTEMSTargetInfo : public OSTargetInfo<Target> {
2987protected:
2988 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2989 MacroBuilder &Builder) const {
2990 // RTEMS defines; list based off of gcc output
2991
Douglas Gregordca52262011-07-01 22:41:14 +00002992 Builder.defineMacro("__rtems__");
2993 Builder.defineMacro("__ELF__");
2994 }
Benjamin Kramer9df08232013-06-29 16:37:14 +00002995
Douglas Gregordca52262011-07-01 22:41:14 +00002996public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002997 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
2998 this->UserLabelPrefix = "";
Douglas Gregordca52262011-07-01 22:41:14 +00002999
Benjamin Kramer9df08232013-06-29 16:37:14 +00003000 switch (Triple.getArch()) {
3001 default:
3002 case llvm::Triple::x86:
3003 // this->MCountName = ".mcount";
3004 break;
3005 case llvm::Triple::mips:
3006 case llvm::Triple::mipsel:
3007 case llvm::Triple::ppc:
3008 case llvm::Triple::ppc64:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00003009 case llvm::Triple::ppc64le:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003010 // this->MCountName = "_mcount";
3011 break;
3012 case llvm::Triple::arm:
3013 // this->MCountName = "__mcount";
3014 break;
Douglas Gregordca52262011-07-01 22:41:14 +00003015 }
Benjamin Kramer9df08232013-06-29 16:37:14 +00003016 }
Douglas Gregordca52262011-07-01 22:41:14 +00003017};
3018
3019namespace {
3020// x86-32 RTEMS target
3021class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3022public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003023 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregordca52262011-07-01 22:41:14 +00003024 SizeType = UnsignedLong;
3025 IntPtrType = SignedLong;
3026 PtrDiffType = SignedLong;
3027 this->UserLabelPrefix = "";
3028 }
3029 virtual void getTargetDefines(const LangOptions &Opts,
3030 MacroBuilder &Builder) const {
3031 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3032 Builder.defineMacro("__INTEL__");
3033 Builder.defineMacro("__rtems__");
3034 }
3035};
3036} // end anonymous namespace
3037
Chris Lattner86ed3a32010-04-11 19:29:39 +00003038namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00003039// x86-64 generic target
3040class X86_64TargetInfo : public X86TargetInfo {
3041public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003042 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00003043 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00003044 LongDoubleWidth = 128;
3045 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00003046 LargeArrayMinWidth = 128;
3047 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003048 SuitableAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00003049 IntMaxType = SignedLong;
3050 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003051 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00003052 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00003053
Eli Friedmaned855cb2008-08-21 00:13:15 +00003054 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3055 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003056 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00003057
3058 // Use fpret only for long double.
3059 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00003060
Anders Carlssoneea64802011-10-31 16:27:11 +00003061 // Use fp2ret for _Complex long double.
3062 ComplexLongDoubleUsesFP2Ret = true;
3063
Eli Friedman2be46072011-10-14 20:59:01 +00003064 // x86-64 has atomics up to 16 bytes.
3065 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3066 // on CPUs with cmpxchg16b
3067 MaxAtomicPromoteWidth = 128;
3068 MaxAtomicInlineWidth = 64;
Reid Spencer5f016e22007-07-11 17:01:13 +00003069 }
Meador Ingec5613b22012-06-16 03:34:49 +00003070 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3071 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson3346ae62007-11-24 23:38:12 +00003072 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00003073
Chris Lattner21fb98e2009-09-23 06:06:36 +00003074 int getEHDataRegisterNumber(unsigned RegNo) const {
3075 if (RegNo == 0) return 0;
3076 if (RegNo == 1) return 1;
3077 return -1;
3078 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00003079
3080 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
Peter Collingbourne7728cdd2013-02-23 00:06:18 +00003081 return (CC == CC_Default ||
3082 CC == CC_C ||
3083 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003084 }
3085
Aaron Ballmanfff32482012-12-09 17:45:41 +00003086 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
3087 return CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003088 }
3089
Eli Friedman618234a2008-08-20 02:34:37 +00003090};
3091} // end anonymous namespace
3092
3093namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003094// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003095class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003096public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003097 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3098 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003099 TLSSupported = false;
3100 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00003101 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00003102 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00003103 IntMaxType = SignedLongLong;
3104 UIntMaxType = UnsignedLongLong;
3105 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00003106 SizeType = UnsignedLongLong;
3107 PtrDiffType = SignedLongLong;
3108 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00003109 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003110 }
3111 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003112 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003113 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003114 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00003115 }
Meador Ingec5613b22012-06-16 03:34:49 +00003116 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3117 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumi79521992011-01-17 22:56:23 +00003118 }
Michael J. Spencera764e832010-10-21 08:22:51 +00003119};
3120} // end anonymous namespace
3121
3122namespace {
3123// x86-64 Windows Visual Studio target
3124class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
3125public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003126 VisualStudioWindowsX86_64TargetInfo(const llvm::Triple &Triple)
3127 : WindowsX86_64TargetInfo(Triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00003128 LongDoubleWidth = LongDoubleAlign = 64;
3129 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00003130 }
3131 virtual void getTargetDefines(const LangOptions &Opts,
3132 MacroBuilder &Builder) const {
3133 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3134 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00003135 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003136 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003137 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003138};
3139} // end anonymous namespace
3140
3141namespace {
3142// x86-64 MinGW target
3143class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3144public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003145 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3146 : WindowsX86_64TargetInfo(Triple) {}
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003147 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003148 MacroBuilder &Builder) const {
3149 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00003150 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00003151 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00003152 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00003153 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00003154
3155 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3156 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00003157 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00003158 // Provide "as-is" __declspec.
3159 Builder.defineMacro("__declspec", "__declspec");
3160 else
3161 // Provide alias of __attribute__ like mingw32-gcc.
3162 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003163 }
3164};
3165} // end anonymous namespace
3166
3167namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003168class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3169public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003170 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3171 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003172 Int64Type = SignedLongLong;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003173 MaxVectorAlign = 256;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003174 }
3175};
3176} // end anonymous namespace
3177
3178namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00003179class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3180public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003181 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3182 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman6036ebe2009-07-05 22:31:18 +00003183 IntMaxType = SignedLongLong;
3184 UIntMaxType = UnsignedLongLong;
3185 Int64Type = SignedLongLong;
3186 }
3187};
3188} // end anonymous namespace
3189
3190namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00003191class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3192public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003193 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3194 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3195 IntMaxType = SignedLongLong;
3196 UIntMaxType = UnsignedLongLong;
3197 Int64Type = SignedLongLong;
Eli Friedman42f74f22012-08-08 23:57:20 +00003198 }
3199};
Tim Northoverc264e162013-01-31 12:13:10 +00003200}
3201
3202namespace {
3203class AArch64TargetInfo : public TargetInfo {
3204 static const char * const GCCRegNames[];
3205 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Tim Northoverff920ee2013-05-04 07:15:13 +00003206
Tim Northoverb793f0d2013-08-01 09:23:19 +00003207 enum FPUModeEnum {
3208 FPUMode,
3209 NeonMode
3210 };
3211
3212 unsigned FPU;
Tim Northoverff920ee2013-05-04 07:15:13 +00003213 static const Builtin::Info BuiltinInfo[];
Tim Northoverb793f0d2013-08-01 09:23:19 +00003214
Tim Northoverc264e162013-01-31 12:13:10 +00003215public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003216 AArch64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Tim Northoverc264e162013-01-31 12:13:10 +00003217 BigEndian = false;
3218 LongWidth = LongAlign = 64;
3219 LongDoubleWidth = LongDoubleAlign = 128;
3220 PointerWidth = PointerAlign = 64;
3221 SuitableAlign = 128;
3222 DescriptionString = "e-p:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3223 "i64:64:64-i128:128:128-f32:32:32-f64:64:64-"
3224 "f128:128:128-n32:64-S128";
3225
3226 WCharType = UnsignedInt;
3227 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3228
Tim Northover6a93c862013-02-18 12:11:32 +00003229 // AArch64 backend supports 64-bit operations at the moment. In principle
3230 // 128-bit is possible if register-pairs are used.
3231 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3232
Tim Northoverc264e162013-01-31 12:13:10 +00003233 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3234 }
3235 virtual void getTargetDefines(const LangOptions &Opts,
3236 MacroBuilder &Builder) const {
3237 // GCC defines theses currently
3238 Builder.defineMacro("__aarch64__");
3239 Builder.defineMacro("__AARCH64EL__");
3240
3241 // ACLE predefines. Many can only have one possible value on v8 AArch64.
3242
3243 // FIXME: these were written based on an unreleased version of a 32-bit ACLE
3244 // which was intended to be compatible with a 64-bit implementation. They
3245 // will need updating when a real 64-bit ACLE exists. Particularly pressing
Tim Northoverdabcbf92013-04-05 14:08:55 +00003246 // instances are: __ARM_ARCH_ISA_ARM, __ARM_ARCH_ISA_THUMB, __ARM_PCS.
3247 Builder.defineMacro("__ARM_ACLE", "101");
3248 Builder.defineMacro("__ARM_ARCH", "8");
3249 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
Tim Northoverc264e162013-01-31 12:13:10 +00003250
Tim Northoverdabcbf92013-04-05 14:08:55 +00003251 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
3252 Builder.defineMacro("__ARM_FEATURE_CLZ");
3253 Builder.defineMacro("__ARM_FEATURE_FMA");
Tim Northoverc264e162013-01-31 12:13:10 +00003254
3255 // FIXME: ACLE 1.1 reserves bit 4. Will almost certainly come to mean
3256 // 128-bit LDXP present, at which point this becomes 0x1f.
Tim Northoverdabcbf92013-04-05 14:08:55 +00003257 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xf");
Tim Northoverc264e162013-01-31 12:13:10 +00003258
3259 // 0xe implies support for half, single and double precision operations.
Tim Northoverdabcbf92013-04-05 14:08:55 +00003260 Builder.defineMacro("__ARM_FP", "0xe");
Tim Northoverc264e162013-01-31 12:13:10 +00003261
3262 // PCS specifies this for SysV variants, which is all we support. Other ABIs
Tim Northoverdabcbf92013-04-05 14:08:55 +00003263 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
3264 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
Tim Northoverc264e162013-01-31 12:13:10 +00003265
3266 if (Opts.FastMath || Opts.FiniteMathOnly)
Tim Northoverdabcbf92013-04-05 14:08:55 +00003267 Builder.defineMacro("__ARM_FP_FAST");
Tim Northoverc264e162013-01-31 12:13:10 +00003268
3269 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
Tim Northoverdabcbf92013-04-05 14:08:55 +00003270 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
Tim Northoverc264e162013-01-31 12:13:10 +00003271
Tim Northoverdabcbf92013-04-05 14:08:55 +00003272 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Tim Northoverc264e162013-01-31 12:13:10 +00003273 Opts.ShortWChar ? "2" : "4");
3274
Tim Northoverdabcbf92013-04-05 14:08:55 +00003275 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
Tim Northoverc264e162013-01-31 12:13:10 +00003276 Opts.ShortEnums ? "1" : "4");
3277
3278 if (BigEndian)
Tim Northoverb793f0d2013-08-01 09:23:19 +00003279 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3280
3281 if (FPU == NeonMode) {
3282 Builder.defineMacro("__AARCH_FEATURE_ADVSIMD");
3283
3284 // 64-bit NEON supports half, single and double precision operations.
3285 Builder.defineMacro("__AARCH_ADVSIMD_FP", "0xe");
3286 }
Tim Northoverc264e162013-01-31 12:13:10 +00003287 }
3288 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3289 unsigned &NumRecords) const {
Tim Northoverff920ee2013-05-04 07:15:13 +00003290 Records = BuiltinInfo;
3291 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin;
Tim Northoverc264e162013-01-31 12:13:10 +00003292 }
3293 virtual bool hasFeature(StringRef Feature) const {
Tim Northoverb793f0d2013-08-01 09:23:19 +00003294 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode);
Tim Northoverc264e162013-01-31 12:13:10 +00003295 }
Tim Northoverb793f0d2013-08-01 09:23:19 +00003296
3297 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3298 StringRef Name, bool Enabled) const {
3299 if (Name == "neon") {
3300 Features[Name] = Enabled;
3301 return true;
3302 }
3303
3304 return false;
3305 }
3306
3307 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3308 FPU = FPUMode;
3309 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3310 if (Features[i] == "+neon")
3311 FPU = NeonMode;
3312 }
3313 }
3314
3315 virtual void getGCCRegNames(const char *const *&Names,
Tim Northoverc264e162013-01-31 12:13:10 +00003316 unsigned &NumNames) const;
3317 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3318 unsigned &NumAliases) const;
3319
3320 virtual bool isCLZForZeroUndef() const { return false; }
3321
3322 virtual bool validateAsmConstraint(const char *&Name,
3323 TargetInfo::ConstraintInfo &Info) const {
3324 switch (*Name) {
3325 default: return false;
3326 case 'w': // An FP/SIMD vector register
3327 Info.setAllowsRegister();
3328 return true;
3329 case 'I': // Constant that can be used with an ADD instruction
3330 case 'J': // Constant that can be used with a SUB instruction
3331 case 'K': // Constant that can be used with a 32-bit logical instruction
3332 case 'L': // Constant that can be used with a 64-bit logical instruction
3333 case 'M': // Constant that can be used as a 32-bit MOV immediate
3334 case 'N': // Constant that can be used as a 64-bit MOV immediate
3335 case 'Y': // Floating point constant zero
3336 case 'Z': // Integer constant zero
3337 return true;
3338 case 'Q': // A memory reference with base register and no offset
3339 Info.setAllowsMemory();
3340 return true;
3341 case 'S': // A symbolic address
3342 Info.setAllowsRegister();
3343 return true;
3344 case 'U':
3345 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3346 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3347 // Usa: An absolute symbolic address
3348 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3349 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3350 }
3351 }
3352
3353 virtual const char *getClobbers() const {
3354 // There are no AArch64 clobbers shared by all asm statements.
3355 return "";
3356 }
3357
3358 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3359 return TargetInfo::AArch64ABIBuiltinVaList;
3360 }
3361};
3362
3363const char * const AArch64TargetInfo::GCCRegNames[] = {
3364 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3365 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3366 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3367 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3368
3369 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3370 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3371 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3372 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3373
3374 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3375 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3376 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3377 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3378
3379 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3380 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3381 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3382 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3383
3384 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3385 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3386 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3387 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3388
3389 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3390 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3391 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3392 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3393
3394 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3395 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3396 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3397 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3398};
3399
3400void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3401 unsigned &NumNames) const {
3402 Names = GCCRegNames;
3403 NumNames = llvm::array_lengthof(GCCRegNames);
3404}
3405
3406const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3407 { { "x16" }, "ip0"},
3408 { { "x17" }, "ip1"},
3409 { { "x29" }, "fp" },
3410 { { "x30" }, "lr" }
3411};
3412
3413void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3414 unsigned &NumAliases) const {
3415 Aliases = GCCRegAliases;
3416 NumAliases = llvm::array_lengthof(GCCRegAliases);
3417
3418}
Tim Northoverff920ee2013-05-04 07:15:13 +00003419
3420const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
3421#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3422#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3423 ALL_LANGUAGES },
3424#include "clang/Basic/BuiltinsAArch64.def"
3425};
3426
Eli Friedman42f74f22012-08-08 23:57:20 +00003427} // end anonymous namespace
3428
3429namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00003430class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003431 // Possible FPU choices.
3432 enum FPUMode {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003433 VFP2FPU = (1 << 0),
3434 VFP3FPU = (1 << 1),
3435 VFP4FPU = (1 << 2),
3436 NeonFPU = (1 << 3)
Daniel Dunbara91320b2009-12-21 23:28:17 +00003437 };
3438
3439 static bool FPUModeIsVFP(FPUMode Mode) {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003440 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU);
Daniel Dunbara91320b2009-12-21 23:28:17 +00003441 }
3442
3443 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3444 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003445
Daniel Dunbareac7c532009-12-18 18:42:37 +00003446 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003447
Bob Wilsoncfaab002012-09-29 23:52:52 +00003448 unsigned FPU : 4;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003449
Logan Chieneae5a8202012-10-10 06:56:20 +00003450 unsigned IsAAPCS : 1;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003451 unsigned IsThumb : 1;
3452
3453 // Initialized via features.
3454 unsigned SoftFloat : 1;
3455 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003456
Chris Lattner2752c012010-03-03 19:03:45 +00003457 static const Builtin::Info BuiltinInfo[];
3458
Rafael Espindola620c0af2013-05-13 20:09:47 +00003459 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3460 // On linux, binaries targeting old cpus call functions in libgcc to
3461 // perform atomic operations. The implementation in libgcc then calls into
3462 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3463 // is that if we assume the kernel is at least as recent as the hardware,
3464 // it is safe to use atomic instructions on armv6 and newer.
Rafael Espindolae1e03422013-06-17 20:00:15 +00003465 if (T.getOS() != llvm::Triple::Linux &&
3466 T.getOS() != llvm::Triple::FreeBSD &&
3467 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten04491632013-06-15 09:40:14 +00003468 return false;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003469 StringRef ArchName = T.getArchName();
Rafael Espindola69db5552013-05-14 00:44:24 +00003470 if (T.getArch() == llvm::Triple::arm) {
3471 if (!ArchName.startswith("armv"))
3472 return false;
3473 StringRef VersionStr = ArchName.substr(4);
3474 unsigned Version;
3475 if (VersionStr.getAsInteger(10, Version))
3476 return false;
3477 return Version >= 6;
3478 }
3479 assert(T.getArch() == llvm::Triple::thumb);
3480 if (!ArchName.startswith("thumbv"))
3481 return false;
3482 StringRef VersionStr = ArchName.substr(6);
3483 unsigned Version;
3484 if (VersionStr.getAsInteger(10, Version))
3485 return false;
3486 return Version >= 7;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003487 }
3488
Chris Lattner393ff042008-04-21 18:56:49 +00003489public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003490 ARMTargetInfo(const llvm::Triple &Triple)
3491 : TargetInfo(Triple), ABI("aapcs-linux"), CPU("arm1136j-s"),
3492 IsAAPCS(true) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003493 BigEndian = false;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003494 SizeType = UnsignedInt;
3495 PtrDiffType = SignedInt;
James Molloya6d81f92011-11-23 13:35:08 +00003496 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3497 WCharType = UnsignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003498
Chris Lattner9bffb072010-04-23 16:29:58 +00003499 // {} in inline assembly are neon specifiers, not assembly variant
3500 // specifiers.
3501 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00003502
Daniel Dunbareac7c532009-12-18 18:42:37 +00003503 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00003504 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003505 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00003506 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3507 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003508 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
3509 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003510 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003511 } else {
3512 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3513 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003514 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003515 }
John McCallee79a4c2010-08-21 22:46:04 +00003516
3517 // ARM targets default to using the ARM C++ ABI.
John McCallb8b2c9d2013-01-25 22:30:49 +00003518 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman2be46072011-10-14 20:59:01 +00003519
3520 // ARM has atomics up to 8 bytes
Eli Friedman2be46072011-10-14 20:59:01 +00003521 MaxAtomicPromoteWidth = 64;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003522 if (shouldUseInlineAtomic(getTriple()))
3523 MaxAtomicInlineWidth = 64;
James Molloye45b9b72012-03-12 09:14:10 +00003524
3525 // Do force alignment of members that follow zero length bitfields. If
3526 // the alignment of the zero-length bitfield is greater than the member
3527 // that follows it, `bar', `bar' will be aligned as the type of the
3528 // zero length bitfield.
3529 UseZeroLengthBitfieldAlignment = true;
Eli Friedman61538a72008-05-20 14:21:01 +00003530 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003531 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00003532 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003533 ABI = Name;
3534
Daniel Dunbara2a41612009-09-14 00:02:24 +00003535 // The defaults (above) are for AAPCS, check if we need to change them.
3536 //
3537 // FIXME: We need support for -meabi... we could just mangle it into the
3538 // name.
3539 if (Name == "apcs-gnu") {
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003540 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindola27fa2362012-12-13 04:17:14 +00003541 // size_t is unsigned int on FreeBSD.
3542 if (getTriple().getOS() != llvm::Triple::FreeBSD)
3543 SizeType = UnsignedLong;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003544
James Molloya6d81f92011-11-23 13:35:08 +00003545 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3546 WCharType = SignedInt;
3547
Daniel Dunbar684de632010-04-22 16:14:54 +00003548 // Do not respect the alignment of bit-field types when laying out
3549 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3550 UseBitFieldTypeAlignment = false;
3551
Chad Rosier61a62212011-08-04 01:21:14 +00003552 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosier6e43f3f2011-08-04 17:52:43 +00003553 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3554 /// gcc.
Chad Rosier61a62212011-08-04 01:21:14 +00003555 ZeroLengthBitfieldBoundary = 32;
3556
Logan Chieneae5a8202012-10-10 06:56:20 +00003557 IsAAPCS = false;
3558
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003559 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00003560 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3561 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003562 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 +00003563 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003564 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003565 } else {
3566 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 +00003567 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003568 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003569 }
3570
Chad Rosier9f1210c2011-07-26 07:03:04 +00003571 // FIXME: Override "preferred align" for double and long long.
David Tweedb16abb12012-10-25 13:33:01 +00003572 } else if (Name == "aapcs" || Name == "aapcs-vfp") {
Bob Wilsone4bce7a2013-06-18 05:36:04 +00003573 // size_t is unsigned long on Darwin.
3574 if (getTriple().isOSDarwin())
3575 SizeType = UnsignedLong;
Logan Chieneae5a8202012-10-10 06:56:20 +00003576 IsAAPCS = true;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003577 // FIXME: Enumerated types are variable width in straight AAPCS.
3578 } else if (Name == "aapcs-linux") {
Logan Chieneae5a8202012-10-10 06:56:20 +00003579 IsAAPCS = true;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003580 } else
3581 return false;
3582
3583 return true;
3584 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003585
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003586 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003587 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3588 Features["vfp2"] = true;
Bob Wilsoncfaab002012-09-29 23:52:52 +00003589 else if (CPU == "cortex-a8" || CPU == "cortex-a15" ||
3590 CPU == "cortex-a9" || CPU == "cortex-a9-mp")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003591 Features["neon"] = true;
Bob Wilsonfc553452013-03-04 22:37:46 +00003592 else if (CPU == "swift" || CPU == "cortex-a7") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003593 Features["vfp4"] = true;
3594 Features["neon"] = true;
3595 }
Daniel Dunbara91320b2009-12-21 23:28:17 +00003596 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00003597
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003598 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00003599 StringRef Name,
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003600 bool Enabled) const {
Evan Chengf972b262011-07-08 06:40:11 +00003601 if (Name == "soft-float" || Name == "soft-float-abi" ||
Bob Wilsoncfaab002012-09-29 23:52:52 +00003602 Name == "vfp2" || Name == "vfp3" || Name == "vfp4" || Name == "neon" ||
Joey Goulycbed3bf2013-06-27 13:19:54 +00003603 Name == "d16" || Name == "neonfp" || Name == "v8fp") {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003604 Features[Name] = Enabled;
3605 } else
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003606 return false;
3607
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003608 return true;
3609 }
3610
3611 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003612 FPU = 0;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003613 SoftFloat = SoftFloatABI = false;
3614 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3615 if (Features[i] == "+soft-float")
3616 SoftFloat = true;
3617 else if (Features[i] == "+soft-float-abi")
3618 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003619 else if (Features[i] == "+vfp2")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003620 FPU |= VFP2FPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003621 else if (Features[i] == "+vfp3")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003622 FPU |= VFP3FPU;
3623 else if (Features[i] == "+vfp4")
3624 FPU |= VFP4FPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003625 else if (Features[i] == "+neon")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003626 FPU |= NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003627 }
3628
3629 // Remove front-end specific options which the backend handles differently.
3630 std::vector<std::string>::iterator it;
3631 it = std::find(Features.begin(), Features.end(), "+soft-float");
3632 if (it != Features.end())
3633 Features.erase(it);
3634 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3635 if (it != Features.end())
3636 Features.erase(it);
3637 }
3638
Douglas Gregore727d212012-01-30 06:38:25 +00003639 virtual bool hasFeature(StringRef Feature) const {
3640 return llvm::StringSwitch<bool>(Feature)
3641 .Case("arm", true)
3642 .Case("softfloat", SoftFloat)
3643 .Case("thumb", IsThumb)
3644 .Case("neon", FPU == NeonFPU && !SoftFloat &&
3645 StringRef(getCPUDefineSuffix(CPU)).startswith("7"))
3646 .Default(false);
3647 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003648 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner5f9e2722011-07-23 10:55:15 +00003649 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbareac7c532009-12-18 18:42:37 +00003650 return llvm::StringSwitch<const char*>(Name)
3651 .Cases("arm8", "arm810", "4")
3652 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3653 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3654 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3655 .Case("ep9312", "4T")
3656 .Cases("arm10tdmi", "arm1020t", "5T")
3657 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3658 .Case("arm926ej-s", "5TEJ")
3659 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3660 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003661 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003662 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003663 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003664 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonfc553452013-03-04 22:37:46 +00003665 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
3666 .Cases("cortex-a9", "cortex-a15", "7A")
Quentin Colombetab137512012-12-21 17:57:47 +00003667 .Case("cortex-r5", "7R")
Bob Wilson336bfa32012-09-29 23:52:50 +00003668 .Case("cortex-a9-mp", "7F")
3669 .Case("swift", "7S")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003670 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00003671 .Case("cortex-m0", "6M")
Joey Gouly4ec8d5b2013-06-26 17:19:48 +00003672 .Case("cortex-a53", "8A")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003673 .Default(0);
3674 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003675 static const char *getCPUProfile(StringRef Name) {
3676 return llvm::StringSwitch<const char*>(Name)
3677 .Cases("cortex-a8", "cortex-a9", "A")
3678 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Quentin Colombetab137512012-12-21 17:57:47 +00003679 .Case("cortex-r5", "R")
Anton Korobeynikov8b0703d2012-09-08 08:22:13 +00003680 .Default("");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003681 }
Daniel Dunbareac7c532009-12-18 18:42:37 +00003682 virtual bool setCPU(const std::string &Name) {
3683 if (!getCPUDefineSuffix(Name))
3684 return false;
3685
3686 CPU = Name;
3687 return true;
3688 }
Chris Lattner33328642009-03-20 15:52:06 +00003689 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003690 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00003691 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00003692 Builder.defineMacro("__arm");
3693 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003694
Chris Lattnerc0f59212009-03-02 22:27:17 +00003695 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00003696 Builder.defineMacro("__ARMEL__");
3697 Builder.defineMacro("__LITTLE_ENDIAN__");
3698 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003699
Chris Lattner5f9e2722011-07-23 10:55:15 +00003700 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00003701 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003702 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3703 StringRef CPUProfile = getCPUProfile(CPU);
3704 if (!CPUProfile.empty())
3705 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3706
Mike Stump437bb4b2009-04-08 02:07:04 +00003707 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003708
Daniel Dunbareac7c532009-12-18 18:42:37 +00003709 // FIXME: It's more complicated than this and we don't really support
3710 // interworking.
3711 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00003712 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003713
David Tweedb16abb12012-10-25 13:33:01 +00003714 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Daniel Dunbar849289e2012-10-22 18:51:13 +00003715 // M-class CPUs on Darwin follow AAPCS, but not EABI.
Daniel Dunbar4d3ee9b2012-10-22 18:56:43 +00003716 if (!(getTriple().isOSDarwin() && CPUProfile == "M"))
Daniel Dunbar849289e2012-10-22 18:51:13 +00003717 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003718 Builder.defineMacro("__ARM_PCS", "1");
3719
David Tweedb16abb12012-10-25 13:33:01 +00003720 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003721 Builder.defineMacro("__ARM_PCS_VFP", "1");
3722 }
Daniel Dunbareac7c532009-12-18 18:42:37 +00003723
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003724 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00003725 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003726
3727 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00003728 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003729
Bob Wilson84f95cf2011-05-13 18:56:03 +00003730 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003731 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00003732 Builder.defineMacro("__THUMBEL__");
3733 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00003734 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00003735 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003736 }
3737
3738 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00003739 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00003740
Bob Wilsoncfaab002012-09-29 23:52:52 +00003741 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramera9992772010-01-09 17:55:51 +00003742 Builder.defineMacro("__VFP_FP__");
Bob Wilsoncfaab002012-09-29 23:52:52 +00003743 if (FPU & VFP2FPU)
3744 Builder.defineMacro("__ARM_VFPV2__");
3745 if (FPU & VFP3FPU)
3746 Builder.defineMacro("__ARM_VFPV3__");
3747 if (FPU & VFP4FPU)
3748 Builder.defineMacro("__ARM_VFPV4__");
3749 }
3750
Daniel Dunbara91320b2009-12-21 23:28:17 +00003751 // This only gets set when Neon instructions are actually available, unlike
3752 // the VFP define, hence the soft float and arch check. This is subtly
3753 // different from gcc, we follow the intent which was that it should be set
3754 // when Neon instructions are actually available.
Bob Wilsoncfaab002012-09-29 23:52:52 +00003755 if ((FPU & NeonFPU) && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00003756 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00003757 }
3758 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3759 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00003760 Records = BuiltinInfo;
3761 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00003762 }
Bob Wilson8b30a932012-01-26 22:14:27 +00003763 virtual bool isCLZForZeroUndef() const { return false; }
Meador Ingec5613b22012-06-16 03:34:49 +00003764 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chieneae5a8202012-10-10 06:56:20 +00003765 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner393ff042008-04-21 18:56:49 +00003766 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003767 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003768 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003769 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003770 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003771 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00003772 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003773 switch (*Name) {
Eric Christophera0dfca12012-08-16 23:50:41 +00003774 default: break;
Nate Begemanad487f42008-04-22 05:03:19 +00003775 case 'l': // r0-r7
3776 case 'h': // r8-r15
3777 case 'w': // VFP Floating point register single precision
3778 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00003779 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00003780 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00003781 case 'Q': // A memory address that is a single base register.
3782 Info.setAllowsMemory();
3783 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00003784 case 'U': // a memory reference...
3785 switch (Name[1]) {
3786 case 'q': // ...ARMV4 ldrsb
3787 case 'v': // ...VFP load/store (reg+constant offset)
3788 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00003789 case 't': // address valid for load/store opaque types wider
Eric Christopher825d3862012-11-14 22:08:59 +00003790 // than 128-bits
Eric Christopherdda231a2011-06-17 01:40:49 +00003791 case 'n': // valid address for Neon doubleword vector load/store
3792 case 'm': // valid address for Neon element and structure load/store
3793 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopher825d3862012-11-14 22:08:59 +00003794 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00003795 Info.setAllowsMemory();
3796 Name++;
3797 return true;
3798 }
Nate Begemanad487f42008-04-22 05:03:19 +00003799 }
Chris Lattner393ff042008-04-21 18:56:49 +00003800 return false;
3801 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00003802 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00003803 std::string R;
3804 switch (*Constraint) {
3805 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00003806 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00003807 Constraint++;
3808 break;
Eric Christopher283f4472011-06-17 00:40:18 +00003809 case 'p': // 'p' should be translated to 'r' by default.
3810 R = std::string("r");
3811 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00003812 default:
3813 return std::string(1, *Constraint);
3814 }
3815 return R;
3816 }
Bill Wendling50d46ca2012-10-25 23:28:48 +00003817 virtual bool validateConstraintModifier(StringRef Constraint,
3818 const char Modifier,
3819 unsigned Size) const {
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00003820 bool isOutput = (Constraint[0] == '=');
Bill Wendling6e6330c2012-11-30 23:46:56 +00003821 bool isInOut = (Constraint[0] == '+');
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00003822
Bill Wendling50d46ca2012-10-25 23:28:48 +00003823 // Strip off constraint modifiers.
3824 while (Constraint[0] == '=' ||
3825 Constraint[0] == '+' ||
3826 Constraint[0] == '&')
3827 Constraint = Constraint.substr(1);
3828
3829 switch (Constraint[0]) {
3830 default: break;
3831 case 'r': {
3832 switch (Modifier) {
3833 default:
Bob Wilson221a8902013-06-03 23:57:13 +00003834 return (isInOut || isOutput || Size <= 32);
Bill Wendling50d46ca2012-10-25 23:28:48 +00003835 case 'q':
3836 // A register of size 32 cannot fit a vector type.
3837 return false;
3838 }
3839 }
3840 }
3841
3842 return true;
3843 }
Chris Lattner393ff042008-04-21 18:56:49 +00003844 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00003845 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00003846 return "";
3847 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00003848
3849 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3850 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
3851 }
Logan Chiena8f7a972013-02-23 04:24:36 +00003852
3853 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
3854 if (RegNo == 0) return 0;
3855 if (RegNo == 1) return 1;
3856 return -1;
3857 }
Chris Lattner393ff042008-04-21 18:56:49 +00003858};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003859
3860const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003861 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003862 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003863 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
3864
3865 // Float registers
3866 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3867 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3868 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003869 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003870
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003871 // Double registers
3872 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3873 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00003874 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3875 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003876
3877 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00003878 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3879 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003880};
3881
3882void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00003883 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003884 Names = GCCRegNames;
3885 NumNames = llvm::array_lengthof(GCCRegNames);
3886}
3887
3888const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003889 { { "a1" }, "r0" },
3890 { { "a2" }, "r1" },
3891 { { "a3" }, "r2" },
3892 { { "a4" }, "r3" },
3893 { { "v1" }, "r4" },
3894 { { "v2" }, "r5" },
3895 { { "v3" }, "r6" },
3896 { { "v4" }, "r7" },
3897 { { "v5" }, "r8" },
3898 { { "v6", "rfp" }, "r9" },
3899 { { "sl" }, "r10" },
3900 { { "fp" }, "r11" },
3901 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00003902 { { "r13" }, "sp" },
3903 { { "r14" }, "lr" },
3904 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003905 // The S, D and Q registers overlap, but aren't really aliases; we
3906 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003907};
3908
3909void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3910 unsigned &NumAliases) const {
3911 Aliases = GCCRegAliases;
3912 NumAliases = llvm::array_lengthof(GCCRegAliases);
3913}
Chris Lattner2752c012010-03-03 19:03:45 +00003914
3915const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00003916#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00003917#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00003918 ALL_LANGUAGES },
Chris Lattner2752c012010-03-03 19:03:45 +00003919#include "clang/Basic/BuiltinsARM.def"
3920};
Chris Lattner393ff042008-04-21 18:56:49 +00003921} // end anonymous namespace.
3922
Eli Friedmana9f54962008-08-20 07:44:10 +00003923namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00003924class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00003925 public DarwinTargetInfo<ARMTargetInfo> {
3926protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00003927 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00003928 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00003929 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00003930 }
Eli Friedmana9f54962008-08-20 07:44:10 +00003931
Torok Edwin5f6c1942009-06-30 17:10:35 +00003932public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003933 DarwinARMTargetInfo(const llvm::Triple &Triple)
3934 : DarwinTargetInfo<ARMTargetInfo>(Triple) {
Daniel Dunbar350b9f32010-05-27 07:00:26 +00003935 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00003936 // iOS always has 64-bit atomic instructions.
3937 // FIXME: This should be based off of the target features in ARMTargetInfo.
3938 MaxAtomicInlineWidth = 64;
John McCallb8b2c9d2013-01-25 22:30:49 +00003939
3940 // Darwin on iOS uses a variant of the ARM C++ ABI.
3941 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar350b9f32010-05-27 07:00:26 +00003942 }
Eli Friedmana9f54962008-08-20 07:44:10 +00003943};
3944} // end anonymous namespace.
3945
Tony Linthicum96319392011-12-12 21:14:55 +00003946
3947namespace {
3948// Hexagon abstract base class
3949class HexagonTargetInfo : public TargetInfo {
3950 static const Builtin::Info BuiltinInfo[];
3951 static const char * const GCCRegNames[];
3952 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3953 std::string CPU;
3954public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003955 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003956 BigEndian = false;
Tony Linthicum96319392011-12-12 21:14:55 +00003957 DescriptionString = ("e-p:32:32:32-"
Anshuman Dasgupta1a090f12013-01-02 21:25:57 +00003958 "i64:64:64-i32:32:32-i16:16:16-i1:32:32-"
Sirish Pande5f9688b2012-05-10 20:19:54 +00003959 "f64:64:64-f32:32:32-a0:0-n32");
Tony Linthicum96319392011-12-12 21:14:55 +00003960
3961 // {} in inline assembly are packet specifiers, not assembly variant
3962 // specifiers.
3963 NoAsmVariants = true;
3964 }
3965
3966 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3967 unsigned &NumRecords) const {
3968 Records = BuiltinInfo;
3969 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
3970 }
3971
3972 virtual bool validateAsmConstraint(const char *&Name,
3973 TargetInfo::ConstraintInfo &Info) const {
3974 return true;
3975 }
3976
3977 virtual void getTargetDefines(const LangOptions &Opts,
3978 MacroBuilder &Builder) const;
3979
Douglas Gregore727d212012-01-30 06:38:25 +00003980 virtual bool hasFeature(StringRef Feature) const {
3981 return Feature == "hexagon";
3982 }
3983
Meador Ingec5613b22012-06-16 03:34:49 +00003984 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3985 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum96319392011-12-12 21:14:55 +00003986 }
3987 virtual void getGCCRegNames(const char * const *&Names,
3988 unsigned &NumNames) const;
3989 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3990 unsigned &NumAliases) const;
3991 virtual const char *getClobbers() const {
3992 return "";
3993 }
Sebastian Pop43115d42012-01-13 20:37:10 +00003994
3995 static const char *getHexagonCPUSuffix(StringRef Name) {
3996 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop43115d42012-01-13 20:37:10 +00003997 .Case("hexagonv4", "4")
Sirish Pande5f9688b2012-05-10 20:19:54 +00003998 .Case("hexagonv5", "5")
Sebastian Pop43115d42012-01-13 20:37:10 +00003999 .Default(0);
4000 }
4001
Tony Linthicum96319392011-12-12 21:14:55 +00004002 virtual bool setCPU(const std::string &Name) {
Sebastian Pop43115d42012-01-13 20:37:10 +00004003 if (!getHexagonCPUSuffix(Name))
4004 return false;
4005
Tony Linthicum96319392011-12-12 21:14:55 +00004006 CPU = Name;
4007 return true;
4008 }
4009};
4010
4011void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4012 MacroBuilder &Builder) const {
4013 Builder.defineMacro("qdsp6");
4014 Builder.defineMacro("__qdsp6", "1");
4015 Builder.defineMacro("__qdsp6__", "1");
4016
4017 Builder.defineMacro("hexagon");
4018 Builder.defineMacro("__hexagon", "1");
4019 Builder.defineMacro("__hexagon__", "1");
4020
4021 if(CPU == "hexagonv1") {
4022 Builder.defineMacro("__HEXAGON_V1__");
4023 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4024 if(Opts.HexagonQdsp6Compat) {
4025 Builder.defineMacro("__QDSP6_V1__");
4026 Builder.defineMacro("__QDSP6_ARCH__", "1");
4027 }
4028 }
4029 else if(CPU == "hexagonv2") {
4030 Builder.defineMacro("__HEXAGON_V2__");
4031 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4032 if(Opts.HexagonQdsp6Compat) {
4033 Builder.defineMacro("__QDSP6_V2__");
4034 Builder.defineMacro("__QDSP6_ARCH__", "2");
4035 }
4036 }
4037 else if(CPU == "hexagonv3") {
4038 Builder.defineMacro("__HEXAGON_V3__");
4039 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4040 if(Opts.HexagonQdsp6Compat) {
4041 Builder.defineMacro("__QDSP6_V3__");
4042 Builder.defineMacro("__QDSP6_ARCH__", "3");
4043 }
4044 }
4045 else if(CPU == "hexagonv4") {
4046 Builder.defineMacro("__HEXAGON_V4__");
4047 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4048 if(Opts.HexagonQdsp6Compat) {
4049 Builder.defineMacro("__QDSP6_V4__");
4050 Builder.defineMacro("__QDSP6_ARCH__", "4");
4051 }
4052 }
Sirish Pande5f9688b2012-05-10 20:19:54 +00004053 else if(CPU == "hexagonv5") {
4054 Builder.defineMacro("__HEXAGON_V5__");
4055 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4056 if(Opts.HexagonQdsp6Compat) {
4057 Builder.defineMacro("__QDSP6_V5__");
4058 Builder.defineMacro("__QDSP6_ARCH__", "5");
4059 }
4060 }
Tony Linthicum96319392011-12-12 21:14:55 +00004061}
4062
4063const char * const HexagonTargetInfo::GCCRegNames[] = {
4064 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4065 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4066 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4067 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4068 "p0", "p1", "p2", "p3",
4069 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4070};
4071
4072void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4073 unsigned &NumNames) const {
4074 Names = GCCRegNames;
4075 NumNames = llvm::array_lengthof(GCCRegNames);
4076}
4077
4078
4079const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4080 { { "sp" }, "r29" },
4081 { { "fp" }, "r30" },
4082 { { "lr" }, "r31" },
4083 };
4084
4085void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4086 unsigned &NumAliases) const {
4087 Aliases = GCCRegAliases;
4088 NumAliases = llvm::array_lengthof(GCCRegAliases);
4089}
4090
4091
4092const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4093#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4094#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4095 ALL_LANGUAGES },
4096#include "clang/Basic/BuiltinsHexagon.def"
4097};
4098}
4099
4100
Reid Spencer5f016e22007-07-11 17:01:13 +00004101namespace {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004102// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4103class SparcTargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00004104 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4105 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004106 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00004107public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004108 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004109
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004110 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00004111 StringRef Name,
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004112 bool Enabled) const {
4113 if (Name == "soft-float")
4114 Features[Name] = Enabled;
4115 else
4116 return false;
4117
4118 return true;
4119 }
4120 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
4121 SoftFloat = false;
4122 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4123 if (Features[i] == "+soft-float")
4124 SoftFloat = true;
4125 }
Chris Lattner33328642009-03-20 15:52:06 +00004126 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004127 MacroBuilder &Builder) const {
4128 DefineStd(Builder, "sparc", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00004129 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004130
4131 if (SoftFloat)
4132 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00004133 }
Douglas Gregore727d212012-01-30 06:38:25 +00004134
4135 virtual bool hasFeature(StringRef Feature) const {
4136 return llvm::StringSwitch<bool>(Feature)
4137 .Case("softfloat", SoftFloat)
4138 .Case("sparc", true)
4139 .Default(false);
4140 }
4141
Gabor Greif26658672008-02-21 16:29:08 +00004142 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4143 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00004144 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00004145 }
Meador Ingec5613b22012-06-16 03:34:49 +00004146 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4147 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif26658672008-02-21 16:29:08 +00004148 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004149 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00004150 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004151 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00004152 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00004153 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00004154 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00004155 // FIXME: Implement!
4156 return false;
Gabor Greif26658672008-02-21 16:29:08 +00004157 }
4158 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00004159 // FIXME: Implement!
4160 return "";
Gabor Greif26658672008-02-21 16:29:08 +00004161 }
4162};
4163
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004164const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattnere957f532009-01-27 01:58:38 +00004165 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4166 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4167 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4168 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4169};
4170
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004171void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4172 unsigned &NumNames) const {
Chris Lattnere957f532009-01-27 01:58:38 +00004173 Names = GCCRegNames;
4174 NumNames = llvm::array_lengthof(GCCRegNames);
4175}
4176
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004177const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004178 { { "g0" }, "r0" },
4179 { { "g1" }, "r1" },
4180 { { "g2" }, "r2" },
4181 { { "g3" }, "r3" },
4182 { { "g4" }, "r4" },
4183 { { "g5" }, "r5" },
4184 { { "g6" }, "r6" },
4185 { { "g7" }, "r7" },
4186 { { "o0" }, "r8" },
4187 { { "o1" }, "r9" },
4188 { { "o2" }, "r10" },
4189 { { "o3" }, "r11" },
4190 { { "o4" }, "r12" },
4191 { { "o5" }, "r13" },
4192 { { "o6", "sp" }, "r14" },
4193 { { "o7" }, "r15" },
4194 { { "l0" }, "r16" },
4195 { { "l1" }, "r17" },
4196 { { "l2" }, "r18" },
4197 { { "l3" }, "r19" },
4198 { { "l4" }, "r20" },
4199 { { "l5" }, "r21" },
4200 { { "l6" }, "r22" },
4201 { { "l7" }, "r23" },
4202 { { "i0" }, "r24" },
4203 { { "i1" }, "r25" },
4204 { { "i2" }, "r26" },
4205 { { "i3" }, "r27" },
4206 { { "i4" }, "r28" },
4207 { { "i5" }, "r29" },
4208 { { "i6", "fp" }, "r30" },
4209 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00004210};
4211
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004212void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4213 unsigned &NumAliases) const {
Chris Lattnere957f532009-01-27 01:58:38 +00004214 Aliases = GCCRegAliases;
4215 NumAliases = llvm::array_lengthof(GCCRegAliases);
4216}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004217
4218// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4219class SparcV8TargetInfo : public SparcTargetInfo {
4220public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004221 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004222 // FIXME: Support Sparc quad-precision long double?
4223 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
4224 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
4225 }
4226
4227 virtual void getTargetDefines(const LangOptions &Opts,
4228 MacroBuilder &Builder) const {
4229 SparcTargetInfo::getTargetDefines(Opts, Builder);
4230 Builder.defineMacro("__sparcv8");
4231 }
4232};
4233
4234// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4235class SparcV9TargetInfo : public SparcTargetInfo {
4236public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004237 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004238 // FIXME: Support Sparc quad-precision long double?
4239 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
4240 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32:64-S128";
Jakob Stoklund Olesenfcec0c92013-05-15 03:22:33 +00004241 // This is an LP64 platform.
4242 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00004243
4244 // OpenBSD uses long long for int64_t and intmax_t.
4245 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4246 IntMaxType = SignedLongLong;
4247 UIntMaxType = UnsignedLongLong;
4248 } else {
4249 IntMaxType = SignedLong;
4250 UIntMaxType = UnsignedLong;
4251 }
4252 Int64Type = IntMaxType;
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004253 }
4254
4255 virtual void getTargetDefines(const LangOptions &Opts,
4256 MacroBuilder &Builder) const {
4257 SparcTargetInfo::getTargetDefines(Opts, Builder);
4258 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesen44f72d32013-04-24 04:36:38 +00004259 Builder.defineMacro("__arch64__");
4260 // Solaris and its derivative AuroraUX don't need these variants, but the
4261 // BSDs do.
4262 if (getTriple().getOS() != llvm::Triple::Solaris &&
4263 getTriple().getOS() != llvm::Triple::AuroraUX) {
4264 Builder.defineMacro("__sparc64__");
4265 Builder.defineMacro("__sparc_v9__");
4266 Builder.defineMacro("__sparcv9__");
4267 }
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004268 }
4269};
4270
Gabor Greif26658672008-02-21 16:29:08 +00004271} // end anonymous namespace.
4272
Eli Friedman01b86682008-08-20 07:28:14 +00004273namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004274class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4275public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004276 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4277 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004278 SizeType = UnsignedInt;
4279 PtrDiffType = SignedInt;
4280 }
4281};
Torok Edwin5f6c1942009-06-30 17:10:35 +00004282class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00004283public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004284 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
4285 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00004286 SizeType = UnsignedInt;
4287 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00004288 }
4289};
4290} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00004291
Chris Lattner2621fd12008-05-08 05:58:21 +00004292namespace {
Ulrich Weigandb8409212013-05-06 16:26:41 +00004293 class SystemZTargetInfo : public TargetInfo {
4294 static const char *const GCCRegNames[];
4295
4296 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004297 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Ulrich Weigandb8409212013-05-06 16:26:41 +00004298 TLSSupported = true;
4299 IntWidth = IntAlign = 32;
4300 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
4301 PointerWidth = PointerAlign = 64;
4302 LongDoubleWidth = 128;
4303 LongDoubleAlign = 64;
4304 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4305 MinGlobalAlign = 16;
4306 DescriptionString = "E-p:64:64:64-i1:8:16-i8:8:16-i16:16-i32:32-i64:64"
4307 "-f32:32-f64:64-f128:64-a0:8:16-n32:64";
4308 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4309 }
4310 virtual void getTargetDefines(const LangOptions &Opts,
4311 MacroBuilder &Builder) const {
4312 Builder.defineMacro("__s390__");
4313 Builder.defineMacro("__s390x__");
4314 Builder.defineMacro("__zarch__");
4315 Builder.defineMacro("__LONG_DOUBLE_128__");
4316 }
4317 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4318 unsigned &NumRecords) const {
4319 // FIXME: Implement.
4320 Records = 0;
4321 NumRecords = 0;
4322 }
4323
4324 virtual void getGCCRegNames(const char *const *&Names,
4325 unsigned &NumNames) const;
4326 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4327 unsigned &NumAliases) const {
4328 // No aliases.
4329 Aliases = 0;
4330 NumAliases = 0;
4331 }
4332 virtual bool validateAsmConstraint(const char *&Name,
4333 TargetInfo::ConstraintInfo &info) const;
4334 virtual const char *getClobbers() const {
4335 // FIXME: Is this really right?
4336 return "";
4337 }
4338 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4339 return TargetInfo::SystemZBuiltinVaList;
4340 }
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00004341 virtual bool setCPU(const std::string &Name) {
4342 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4343 .Case("z10", true)
4344 .Case("z196", true)
4345 .Case("zEC12", true)
4346 .Default(false);
4347
4348 // No need to store the CPU yet. There aren't any CPU-specific
4349 // macros to define.
4350 return CPUKnown;
4351 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00004352 };
4353
4354 const char *const SystemZTargetInfo::GCCRegNames[] = {
4355 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4356 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4357 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
4358 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
4359 };
4360
4361 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
4362 unsigned &NumNames) const {
4363 Names = GCCRegNames;
4364 NumNames = llvm::array_lengthof(GCCRegNames);
4365 }
4366
4367 bool SystemZTargetInfo::
4368 validateAsmConstraint(const char *&Name,
4369 TargetInfo::ConstraintInfo &Info) const {
4370 switch (*Name) {
4371 default:
4372 return false;
4373
4374 case 'a': // Address register
4375 case 'd': // Data register (equivalent to 'r')
4376 case 'f': // Floating-point register
4377 Info.setAllowsRegister();
4378 return true;
4379
4380 case 'I': // Unsigned 8-bit constant
4381 case 'J': // Unsigned 12-bit constant
4382 case 'K': // Signed 16-bit constant
4383 case 'L': // Signed 20-bit displacement (on all targets we support)
4384 case 'M': // 0x7fffffff
4385 return true;
4386
4387 case 'Q': // Memory with base and unsigned 12-bit displacement
4388 case 'R': // Likewise, plus an index
4389 case 'S': // Memory with base and signed 20-bit displacement
4390 case 'T': // Likewise, plus an index
4391 Info.setAllowsMemory();
4392 return true;
4393 }
4394 }
4395}
4396
4397namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004398 class MSP430TargetInfo : public TargetInfo {
4399 static const char * const GCCRegNames[];
4400 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004401 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004402 BigEndian = false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004403 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00004404 IntWidth = 16; IntAlign = 16;
4405 LongWidth = 32; LongLongWidth = 64;
4406 LongAlign = LongLongAlign = 16;
4407 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004408 SuitableAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004409 SizeType = UnsignedInt;
Anton Korobeynikov18a295d2013-07-01 19:42:40 +00004410 IntMaxType = SignedLongLong;
4411 UIntMaxType = UnsignedLongLong;
4412 IntPtrType = SignedInt;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004413 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00004414 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00004415 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004416 }
4417 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004418 MacroBuilder &Builder) const {
4419 Builder.defineMacro("MSP430");
4420 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004421 // FIXME: defines for different 'flavours' of MCU
4422 }
4423 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4424 unsigned &NumRecords) const {
4425 // FIXME: Implement.
4426 Records = 0;
4427 NumRecords = 0;
4428 }
Douglas Gregore727d212012-01-30 06:38:25 +00004429 virtual bool hasFeature(StringRef Feature) const {
4430 return Feature == "msp430";
4431 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004432 virtual void getGCCRegNames(const char * const *&Names,
4433 unsigned &NumNames) const;
4434 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4435 unsigned &NumAliases) const {
4436 // No aliases.
4437 Aliases = 0;
4438 NumAliases = 0;
4439 }
4440 virtual bool validateAsmConstraint(const char *&Name,
4441 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00004442 // No target constraints for now.
4443 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004444 }
4445 virtual const char *getClobbers() const {
4446 // FIXME: Is this really right?
4447 return "";
4448 }
Meador Ingec5613b22012-06-16 03:34:49 +00004449 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004450 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00004451 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004452 }
4453 };
4454
4455 const char * const MSP430TargetInfo::GCCRegNames[] = {
4456 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4457 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4458 };
4459
4460 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4461 unsigned &NumNames) const {
4462 Names = GCCRegNames;
4463 NumNames = llvm::array_lengthof(GCCRegNames);
4464 }
4465}
4466
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00004467namespace {
Eli Friedmanb63decf2009-08-19 20:47:07 +00004468
Mike Stump1eb44332009-09-09 15:08:12 +00004469 // LLVM and Clang cannot be used directly to output native binaries for
4470 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00004471 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00004472 //
4473 // TCE uses the llvm bitcode as input and uses it for generating customized
4474 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00004475 // publicly available in http://tce.cs.tut.fi
4476
Eli Friedman209f5bb2011-10-07 19:51:42 +00004477 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4478 3, // opencl_global
4479 4, // opencl_local
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00004480 5, // opencl_constant
4481 0, // cuda_device
4482 0, // cuda_constant
4483 0 // cuda_shared
Eli Friedman209f5bb2011-10-07 19:51:42 +00004484 };
4485
Eli Friedmanb63decf2009-08-19 20:47:07 +00004486 class TCETargetInfo : public TargetInfo{
4487 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004488 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmanb63decf2009-08-19 20:47:07 +00004489 TLSSupported = false;
4490 IntWidth = 32;
4491 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004492 PointerWidth = 32;
4493 IntAlign = 32;
4494 LongAlign = LongLongAlign = 32;
4495 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004496 SuitableAlign = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004497 SizeType = UnsignedInt;
4498 IntMaxType = SignedLong;
4499 UIntMaxType = UnsignedLong;
4500 IntPtrType = SignedInt;
4501 PtrDiffType = SignedInt;
4502 FloatWidth = 32;
4503 FloatAlign = 32;
4504 DoubleWidth = 32;
4505 DoubleAlign = 32;
4506 LongDoubleWidth = 32;
4507 LongDoubleAlign = 32;
4508 FloatFormat = &llvm::APFloat::IEEEsingle;
4509 DoubleFormat = &llvm::APFloat::IEEEsingle;
4510 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00004511 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
4512 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00004513 "f32:32:32-f64:32:32-v64:32:32-"
4514 "v128:32:32-a0:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00004515 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004516 }
4517
4518 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004519 MacroBuilder &Builder) const {
4520 DefineStd(Builder, "tce", Opts);
4521 Builder.defineMacro("__TCE__");
4522 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00004523 }
Douglas Gregore727d212012-01-30 06:38:25 +00004524 virtual bool hasFeature(StringRef Feature) const {
4525 return Feature == "tce";
4526 }
4527
Eli Friedmanb63decf2009-08-19 20:47:07 +00004528 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4529 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00004530 virtual const char *getClobbers() const {
4531 return "";
4532 }
Meador Ingec5613b22012-06-16 03:34:49 +00004533 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4534 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004535 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00004536 virtual void getGCCRegNames(const char * const *&Names,
4537 unsigned &NumNames) const {}
4538 virtual bool validateAsmConstraint(const char *&Name,
4539 TargetInfo::ConstraintInfo &info) const {
4540 return true;
4541 }
4542 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4543 unsigned &NumAliases) const {}
4544 };
4545}
4546
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004547namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004548class MipsTargetInfoBase : public TargetInfo {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004549 static const Builtin::Info BuiltinInfo[];
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004550 std::string CPU;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004551 bool IsMips16;
Simon Atanasyan321ae792013-04-14 14:07:51 +00004552 bool IsMicromips;
Simon Atanasyand96e3152013-04-14 14:07:30 +00004553 bool IsSingleFloat;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004554 enum MipsFloatABI {
Simon Atanasyand96e3152013-04-14 14:07:30 +00004555 HardFloat, SoftFloat
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004556 } FloatABI;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004557 enum DspRevEnum {
4558 NoDSP, DSP1, DSP2
4559 } DspRev;
Jack Carterc613b672013-08-12 17:20:29 +00004560 bool HasMSA;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004561
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004562protected:
4563 std::string ABI;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004564
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004565public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004566 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
4567 const std::string &CPUStr)
4568 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Jack Carterc613b672013-08-12 17:20:29 +00004569 IsSingleFloat(false), FloatABI(HardFloat), DspRev(NoDSP),
4570 HasMSA(false), ABI(ABIStr) {}
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004571
Eric Christophered734732010-03-02 02:41:08 +00004572 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004573 virtual bool setABI(const std::string &Name) = 0;
Eric Christophered734732010-03-02 02:41:08 +00004574 virtual bool setCPU(const std::string &Name) {
4575 CPU = Name;
4576 return true;
4577 }
Chandler Carruthc3a2e652011-09-28 05:56:05 +00004578 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christophered734732010-03-02 02:41:08 +00004579 Features[ABI] = true;
4580 Features[CPU] = true;
4581 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004582
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004583 virtual void getTargetDefines(const LangOptions &Opts,
4584 MacroBuilder &Builder) const {
Simon Atanasyand4935a02012-08-29 19:14:58 +00004585 DefineStd(Builder, "mips", Opts);
4586 Builder.defineMacro("_mips");
4587 Builder.defineMacro("__REGISTER_PREFIX__", "");
4588
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004589 switch (FloatABI) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004590 case HardFloat:
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00004591 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004592 break;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004593 case SoftFloat:
4594 Builder.defineMacro("__mips_soft_float", Twine(1));
4595 break;
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00004596 }
Simon Atanasyan90913892012-04-05 19:28:31 +00004597
Simon Atanasyand96e3152013-04-14 14:07:30 +00004598 if (IsSingleFloat)
4599 Builder.defineMacro("__mips_single_float", Twine(1));
4600
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004601 if (IsMips16)
4602 Builder.defineMacro("__mips16", Twine(1));
4603
Simon Atanasyan321ae792013-04-14 14:07:51 +00004604 if (IsMicromips)
4605 Builder.defineMacro("__mips_micromips", Twine(1));
4606
Simon Atanasyana1b62272012-07-05 20:16:22 +00004607 switch (DspRev) {
4608 default:
4609 break;
4610 case DSP1:
4611 Builder.defineMacro("__mips_dsp_rev", Twine(1));
4612 Builder.defineMacro("__mips_dsp", Twine(1));
4613 break;
4614 case DSP2:
4615 Builder.defineMacro("__mips_dsp_rev", Twine(2));
4616 Builder.defineMacro("__mips_dspr2", Twine(1));
4617 Builder.defineMacro("__mips_dsp", Twine(1));
4618 break;
4619 }
4620
Jack Carterc613b672013-08-12 17:20:29 +00004621 if (HasMSA)
4622 Builder.defineMacro("__mips_msa", Twine(1));
4623
Simon Atanasyan90913892012-04-05 19:28:31 +00004624 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4625 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4626 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan260e5062012-08-29 15:17:29 +00004627
4628 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4629 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004630 }
4631
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004632 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4633 unsigned &NumRecords) const {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004634 Records = BuiltinInfo;
4635 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004636 }
Douglas Gregore727d212012-01-30 06:38:25 +00004637 virtual bool hasFeature(StringRef Feature) const {
4638 return Feature == "mips";
4639 }
Meador Ingec5613b22012-06-16 03:34:49 +00004640 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4641 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004642 }
4643 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004644 unsigned &NumNames) const {
4645 static const char * const GCCRegNames[] = {
Eric Christopherd1f853d2012-03-27 19:56:11 +00004646 // CPU register names
4647 // Must match second column of GCCRegAliases
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004648 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
4649 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
4650 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopherd1f853d2012-03-27 19:56:11 +00004651 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
4652 // Floating point register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004653 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
4654 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4655 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4656 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopherd1f853d2012-03-27 19:56:11 +00004657 // Hi/lo and condition register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004658 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
4659 "$fcc5","$fcc6","$fcc7"
4660 };
4661 Names = GCCRegNames;
4662 NumNames = llvm::array_lengthof(GCCRegNames);
4663 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004664 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004665 unsigned &NumAliases) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004666 virtual bool validateAsmConstraint(const char *&Name,
4667 TargetInfo::ConstraintInfo &Info) const {
4668 switch (*Name) {
4669 default:
Douglas Gregor21a25162011-11-02 20:52:01 +00004670 return false;
4671
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004672 case 'r': // CPU registers.
4673 case 'd': // Equivalent to "r" unless generating MIPS16 code.
4674 case 'y': // Equivalent to "r", backwards compatibility only.
4675 case 'f': // floating-point registers.
Eric Christopher0ea61642012-04-03 01:16:32 +00004676 case 'c': // $25 for indirect jumps
4677 case 'l': // lo register
4678 case 'x': // hilo register pair
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004679 Info.setAllowsRegister();
4680 return true;
Jack Carter97102302013-03-05 19:10:54 +00004681 case 'R': // An address that can be used in a non-macro load or store
Jack Carterd2ab6d32013-03-04 21:36:11 +00004682 Info.setAllowsMemory();
4683 return true;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004684 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004685 }
4686
4687 virtual const char *getClobbers() const {
4688 // FIXME: Implement!
4689 return "";
4690 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004691
4692 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
4693 StringRef Name,
4694 bool Enabled) const {
Simon Atanasyan8b2a5d22012-04-18 12:00:11 +00004695 if (Name == "soft-float" || Name == "single-float" ||
4696 Name == "o32" || Name == "n32" || Name == "n64" || Name == "eabi" ||
4697 Name == "mips32" || Name == "mips32r2" ||
Simon Atanasyan0b273ef2012-07-05 14:19:39 +00004698 Name == "mips64" || Name == "mips64r2" ||
Simon Atanasyan321ae792013-04-14 14:07:51 +00004699 Name == "mips16" || Name == "micromips" ||
Jack Carterc613b672013-08-12 17:20:29 +00004700 Name == "dsp" || Name == "dspr2" ||
4701 Name == "msa") {
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004702 Features[Name] = Enabled;
4703 return true;
Simon Atanasyane9616a42013-02-27 14:55:49 +00004704 } else if (Name == "32") {
4705 Features["o32"] = Enabled;
4706 return true;
4707 } else if (Name == "64") {
4708 Features["n64"] = Enabled;
4709 return true;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004710 }
4711 return false;
4712 }
4713
4714 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004715 IsMips16 = false;
Simon Atanasyan321ae792013-04-14 14:07:51 +00004716 IsMicromips = false;
Simon Atanasyand96e3152013-04-14 14:07:30 +00004717 IsSingleFloat = false;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004718 FloatABI = HardFloat;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004719 DspRev = NoDSP;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004720
4721 for (std::vector<std::string>::iterator it = Features.begin(),
4722 ie = Features.end(); it != ie; ++it) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004723 if (*it == "+single-float")
Simon Atanasyand96e3152013-04-14 14:07:30 +00004724 IsSingleFloat = true;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004725 else if (*it == "+soft-float")
4726 FloatABI = SoftFloat;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004727 else if (*it == "+mips16")
4728 IsMips16 = true;
Simon Atanasyan321ae792013-04-14 14:07:51 +00004729 else if (*it == "+micromips")
4730 IsMicromips = true;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004731 else if (*it == "+dsp")
4732 DspRev = std::max(DspRev, DSP1);
4733 else if (*it == "+dspr2")
4734 DspRev = std::max(DspRev, DSP2);
Jack Carterc613b672013-08-12 17:20:29 +00004735 else if (*it == "+msa")
4736 HasMSA = true;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004737 }
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004738
4739 // Remove front-end specific option.
4740 std::vector<std::string>::iterator it =
4741 std::find(Features.begin(), Features.end(), "+soft-float");
4742 if (it != Features.end())
4743 Features.erase(it);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004744 }
Logan Chiena8f7a972013-02-23 04:24:36 +00004745
4746 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4747 if (RegNo == 0) return 4;
4748 if (RegNo == 1) return 5;
4749 return -1;
4750 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004751};
4752
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004753const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
4754#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4755#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4756 ALL_LANGUAGES },
4757#include "clang/Basic/BuiltinsMips.def"
4758};
4759
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004760class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004761public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004762 Mips32TargetInfoBase(const llvm::Triple &Triple)
4763 : MipsTargetInfoBase(Triple, "o32", "mips32") {
Akira Hatanaka148735e2011-11-05 01:48:34 +00004764 SizeType = UnsignedInt;
4765 PtrDiffType = SignedInt;
Akira Hatanakadbee9492013-01-18 21:58:11 +00004766 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka148735e2011-11-05 01:48:34 +00004767 }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004768 virtual bool setABI(const std::string &Name) {
4769 if ((Name == "o32") || (Name == "eabi")) {
4770 ABI = Name;
4771 return true;
Simon Atanasyane9616a42013-02-27 14:55:49 +00004772 } else if (Name == "32") {
4773 ABI = "o32";
4774 return true;
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004775 } else
4776 return false;
4777 }
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004778 virtual void getTargetDefines(const LangOptions &Opts,
4779 MacroBuilder &Builder) const {
4780 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004781
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004782 if (ABI == "o32") {
4783 Builder.defineMacro("__mips_o32");
4784 Builder.defineMacro("_ABIO32", "1");
4785 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
4786 }
4787 else if (ABI == "eabi")
4788 Builder.defineMacro("__mips_eabi");
4789 else
David Blaikieb219cfc2011-09-23 05:06:16 +00004790 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004791 }
4792 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4793 unsigned &NumAliases) const {
4794 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4795 { { "at" }, "$1" },
4796 { { "v0" }, "$2" },
4797 { { "v1" }, "$3" },
4798 { { "a0" }, "$4" },
4799 { { "a1" }, "$5" },
4800 { { "a2" }, "$6" },
4801 { { "a3" }, "$7" },
4802 { { "t0" }, "$8" },
4803 { { "t1" }, "$9" },
4804 { { "t2" }, "$10" },
4805 { { "t3" }, "$11" },
4806 { { "t4" }, "$12" },
4807 { { "t5" }, "$13" },
4808 { { "t6" }, "$14" },
4809 { { "t7" }, "$15" },
4810 { { "s0" }, "$16" },
4811 { { "s1" }, "$17" },
4812 { { "s2" }, "$18" },
4813 { { "s3" }, "$19" },
4814 { { "s4" }, "$20" },
4815 { { "s5" }, "$21" },
4816 { { "s6" }, "$22" },
4817 { { "s7" }, "$23" },
4818 { { "t8" }, "$24" },
4819 { { "t9" }, "$25" },
4820 { { "k0" }, "$26" },
4821 { { "k1" }, "$27" },
4822 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00004823 { { "sp","$sp" }, "$29" },
4824 { { "fp","$fp" }, "$30" },
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004825 { { "ra" }, "$31" }
4826 };
4827 Aliases = GCCRegAliases;
4828 NumAliases = llvm::array_lengthof(GCCRegAliases);
4829 }
4830};
4831
4832class Mips32EBTargetInfo : public Mips32TargetInfoBase {
4833public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004834 Mips32EBTargetInfo(const llvm::Triple &Triple)
4835 : Mips32TargetInfoBase(Triple) {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004836 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004837 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004838 }
4839 virtual void getTargetDefines(const LangOptions &Opts,
4840 MacroBuilder &Builder) const {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004841 DefineStd(Builder, "MIPSEB", Opts);
4842 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004843 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004844 }
4845};
4846
4847class Mips32ELTargetInfo : public Mips32TargetInfoBase {
4848public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004849 Mips32ELTargetInfo(const llvm::Triple &Triple)
4850 : Mips32TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004851 BigEndian = false;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004852 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004853 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004854 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004855 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004856 MacroBuilder &Builder) const {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004857 DefineStd(Builder, "MIPSEL", Opts);
4858 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004859 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004860 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004861};
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004862
4863class Mips64TargetInfoBase : public MipsTargetInfoBase {
4864 virtual void SetDescriptionString(const std::string &Name) = 0;
4865public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004866 Mips64TargetInfoBase(const llvm::Triple &Triple)
4867 : MipsTargetInfoBase(Triple, "n64", "mips64") {
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004868 LongWidth = LongAlign = 64;
4869 PointerWidth = PointerAlign = 64;
4870 LongDoubleWidth = LongDoubleAlign = 128;
4871 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnall6e399b42012-12-08 09:06:08 +00004872 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
4873 LongDoubleWidth = LongDoubleAlign = 64;
4874 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4875 }
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004876 SuitableAlign = 128;
Akira Hatanakadbee9492013-01-18 21:58:11 +00004877 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004878 }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004879 virtual bool setABI(const std::string &Name) {
4880 SetDescriptionString(Name);
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004881 if (Name == "n32") {
4882 LongWidth = LongAlign = 32;
4883 PointerWidth = PointerAlign = 32;
Simon Atanasyane9616a42013-02-27 14:55:49 +00004884 ABI = Name;
4885 return true;
4886 } else if (Name == "n64") {
4887 ABI = Name;
4888 return true;
4889 } else if (Name == "64") {
4890 ABI = "n64";
4891 return true;
4892 } else
4893 return false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004894 }
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004895 virtual void getTargetDefines(const LangOptions &Opts,
4896 MacroBuilder &Builder) const {
4897 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004898
Simon Atanasyan600a5132012-08-29 20:50:11 +00004899 Builder.defineMacro("__mips64");
4900 Builder.defineMacro("__mips64__");
4901
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004902 if (ABI == "n32") {
4903 Builder.defineMacro("__mips_n32");
4904 Builder.defineMacro("_ABIN32", "2");
4905 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
4906 }
4907 else if (ABI == "n64") {
4908 Builder.defineMacro("__mips_n64");
4909 Builder.defineMacro("_ABI64", "3");
4910 Builder.defineMacro("_MIPS_SIM", "_ABI64");
4911 }
4912 else
David Blaikieb219cfc2011-09-23 05:06:16 +00004913 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004914 }
4915 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4916 unsigned &NumAliases) const {
4917 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4918 { { "at" }, "$1" },
4919 { { "v0" }, "$2" },
4920 { { "v1" }, "$3" },
4921 { { "a0" }, "$4" },
4922 { { "a1" }, "$5" },
4923 { { "a2" }, "$6" },
4924 { { "a3" }, "$7" },
4925 { { "a4" }, "$8" },
4926 { { "a5" }, "$9" },
4927 { { "a6" }, "$10" },
4928 { { "a7" }, "$11" },
4929 { { "t0" }, "$12" },
4930 { { "t1" }, "$13" },
4931 { { "t2" }, "$14" },
4932 { { "t3" }, "$15" },
4933 { { "s0" }, "$16" },
4934 { { "s1" }, "$17" },
4935 { { "s2" }, "$18" },
4936 { { "s3" }, "$19" },
4937 { { "s4" }, "$20" },
4938 { { "s5" }, "$21" },
4939 { { "s6" }, "$22" },
4940 { { "s7" }, "$23" },
4941 { { "t8" }, "$24" },
4942 { { "t9" }, "$25" },
4943 { { "k0" }, "$26" },
4944 { { "k1" }, "$27" },
4945 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00004946 { { "sp","$sp" }, "$29" },
4947 { { "fp","$fp" }, "$30" },
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004948 { { "ra" }, "$31" }
4949 };
4950 Aliases = GCCRegAliases;
4951 NumAliases = llvm::array_lengthof(GCCRegAliases);
4952 }
4953};
4954
4955class Mips64EBTargetInfo : public Mips64TargetInfoBase {
4956 virtual void SetDescriptionString(const std::string &Name) {
4957 // Change DescriptionString only if ABI is n32.
4958 if (Name == "n32")
4959 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 +00004960 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004961 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004962 }
4963public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004964 Mips64EBTargetInfo(const llvm::Triple &Triple)
4965 : Mips64TargetInfoBase(Triple) {
4966 // Default ABI is n64.
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004967 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 +00004968 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004969 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004970 }
4971 virtual void getTargetDefines(const LangOptions &Opts,
4972 MacroBuilder &Builder) const {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004973 DefineStd(Builder, "MIPSEB", Opts);
4974 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004975 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004976 }
4977};
4978
4979class Mips64ELTargetInfo : public Mips64TargetInfoBase {
4980 virtual void SetDescriptionString(const std::string &Name) {
4981 // Change DescriptionString only if ABI is n32.
4982 if (Name == "n32")
4983 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 +00004984 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004985 "-v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004986 }
4987public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004988 Mips64ELTargetInfo(const llvm::Triple &Triple)
4989 : Mips64TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004990 // Default ABI is n64.
4991 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004992 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 +00004993 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00004994 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004995 }
4996 virtual void getTargetDefines(const LangOptions &Opts,
4997 MacroBuilder &Builder) const {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004998 DefineStd(Builder, "MIPSEL", Opts);
4999 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005000 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005001 }
5002};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005003} // end anonymous namespace.
5004
Ivan Krasinef05abd2011-08-24 20:22:22 +00005005namespace {
5006class PNaClTargetInfo : public TargetInfo {
5007public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005008 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005009 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005010 this->UserLabelPrefix = "";
5011 this->LongAlign = 32;
5012 this->LongWidth = 32;
5013 this->PointerAlign = 32;
5014 this->PointerWidth = 32;
5015 this->IntMaxType = TargetInfo::SignedLongLong;
5016 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5017 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00005018 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00005019 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00005020 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00005021 this->SizeType = TargetInfo::UnsignedInt;
5022 this->PtrDiffType = TargetInfo::SignedInt;
5023 this->IntPtrType = TargetInfo::SignedInt;
Eli Benderskyc0783dc2013-04-08 21:31:01 +00005024 this->RegParmMax = 0; // Disallow regparm
Ivan Krasinef05abd2011-08-24 20:22:22 +00005025 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
5026 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
5027 }
5028
Chandler Carruthc3a2e652011-09-28 05:56:05 +00005029 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00005030 }
5031 virtual void getArchDefines(const LangOptions &Opts,
5032 MacroBuilder &Builder) const {
5033 Builder.defineMacro("__le32__");
5034 Builder.defineMacro("__pnacl__");
5035 }
5036 virtual void getTargetDefines(const LangOptions &Opts,
5037 MacroBuilder &Builder) const {
Jan Wen Voungdde3bdb2012-03-29 00:05:59 +00005038 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasinef05abd2011-08-24 20:22:22 +00005039 getArchDefines(Opts, Builder);
5040 }
Douglas Gregore727d212012-01-30 06:38:25 +00005041 virtual bool hasFeature(StringRef Feature) const {
5042 return Feature == "pnacl";
5043 }
Ivan Krasinef05abd2011-08-24 20:22:22 +00005044 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5045 unsigned &NumRecords) const {
5046 }
Meador Ingec5613b22012-06-16 03:34:49 +00005047 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5048 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005049 }
5050 virtual void getGCCRegNames(const char * const *&Names,
5051 unsigned &NumNames) const;
5052 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5053 unsigned &NumAliases) const;
5054 virtual bool validateAsmConstraint(const char *&Name,
5055 TargetInfo::ConstraintInfo &Info) const {
5056 return false;
5057 }
5058
5059 virtual const char *getClobbers() const {
5060 return "";
5061 }
5062};
5063
5064void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5065 unsigned &NumNames) const {
5066 Names = NULL;
5067 NumNames = 0;
5068}
5069
5070void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5071 unsigned &NumAliases) const {
5072 Aliases = NULL;
5073 NumAliases = 0;
5074}
5075} // end anonymous namespace.
5076
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005077namespace {
5078 static const unsigned SPIRAddrSpaceMap[] = {
5079 1, // opencl_global
5080 3, // opencl_local
5081 2, // opencl_constant
5082 0, // cuda_device
5083 0, // cuda_constant
5084 0 // cuda_shared
5085 };
5086 class SPIRTargetInfo : public TargetInfo {
5087 static const char * const GCCRegNames[];
5088 static const Builtin::Info BuiltinInfo[];
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005089 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005090 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005091 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5092 "SPIR target must use unknown OS");
5093 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5094 "SPIR target must use unknown environment type");
5095 BigEndian = false;
5096 TLSSupported = false;
5097 LongWidth = LongAlign = 64;
5098 AddrSpaceMap = &SPIRAddrSpaceMap;
5099 // Define available target features
5100 // These must be defined in sorted order!
5101 NoAsmVariants = true;
5102 }
5103 virtual void getTargetDefines(const LangOptions &Opts,
5104 MacroBuilder &Builder) const {
5105 DefineStd(Builder, "SPIR", Opts);
5106 }
5107 virtual bool hasFeature(StringRef Feature) const {
5108 return Feature == "spir";
5109 }
5110
5111 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5112 unsigned &NumRecords) const {}
5113 virtual const char *getClobbers() const {
5114 return "";
5115 }
5116 virtual void getGCCRegNames(const char * const *&Names,
5117 unsigned &NumNames) const {}
5118 virtual bool validateAsmConstraint(const char *&Name,
5119 TargetInfo::ConstraintInfo &info) const {
5120 return true;
5121 }
5122 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5123 unsigned &NumAliases) const {}
5124 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5125 return TargetInfo::VoidPtrBuiltinVaList;
5126 }
5127 };
5128
5129
5130 class SPIR32TargetInfo : public SPIRTargetInfo {
5131 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005132 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005133 PointerWidth = PointerAlign = 32;
5134 SizeType = TargetInfo::UnsignedInt;
5135 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5136 DescriptionString
Guy Benyeif3ddf632013-03-07 13:06:10 +00005137 = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005138 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
5139 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
5140 "v512:512:512-v1024:1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00005141 }
5142 virtual void getTargetDefines(const LangOptions &Opts,
5143 MacroBuilder &Builder) const {
5144 DefineStd(Builder, "SPIR32", Opts);
5145 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005146 };
5147
5148 class SPIR64TargetInfo : public SPIRTargetInfo {
5149 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005150 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005151 PointerWidth = PointerAlign = 64;
5152 SizeType = TargetInfo::UnsignedLong;
5153 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
5154 DescriptionString
Guy Benyeif3ddf632013-03-07 13:06:10 +00005155 = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005156 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
5157 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
5158 "v512:512:512-v1024:1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00005159 }
5160 virtual void getTargetDefines(const LangOptions &Opts,
5161 MacroBuilder &Builder) const {
5162 DefineStd(Builder, "SPIR64", Opts);
5163 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005164 };
5165}
5166
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005167namespace {
5168class XCoreTargetInfo : public TargetInfo {
5169 static const Builtin::Info BuiltinInfo[];
5170public:
5171 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5172 BigEndian = false;
5173 NoAsmVariants = true;
5174 LongLongAlign = 32;
5175 SuitableAlign = 32;
5176 DoubleAlign = LongDoubleAlign = 32;
5177 UseZeroLengthBitfieldAlignment = true;
5178 DescriptionString = "e-p:32:32:32-a0:0:32-n32"
5179 "-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32"
5180 "-f16:16:32-f32:32:32-f64:32:32";
5181 }
5182 virtual void getTargetDefines(const LangOptions &Opts,
5183 MacroBuilder &Builder) const {
5184 Builder.defineMacro("__XS1B__");
5185 }
5186 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5187 unsigned &NumRecords) const {
5188 Records = BuiltinInfo;
5189 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5190 }
5191 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5192 return TargetInfo::VoidPtrBuiltinVaList;
5193 }
5194 virtual const char *getClobbers() const {
5195 return "";
5196 }
5197 virtual void getGCCRegNames(const char * const *&Names,
5198 unsigned &NumNames) const {
5199 static const char * const GCCRegNames[] = {
5200 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5201 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5202 };
5203 Names = GCCRegNames;
5204 NumNames = llvm::array_lengthof(GCCRegNames);
5205 }
5206 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5207 unsigned &NumAliases) const {
5208 Aliases = NULL;
5209 NumAliases = 0;
5210 }
5211 virtual bool validateAsmConstraint(const char *&Name,
5212 TargetInfo::ConstraintInfo &Info) const {
5213 return false;
5214 }
5215};
5216
5217const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
5218#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5219#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5220 ALL_LANGUAGES },
5221#include "clang/Basic/BuiltinsXCore.def"
5222};
5223} // end anonymous namespace.
5224
Ivan Krasinef05abd2011-08-24 20:22:22 +00005225
Reid Spencer5f016e22007-07-11 17:01:13 +00005226//===----------------------------------------------------------------------===//
5227// Driver code
5228//===----------------------------------------------------------------------===//
5229
Benjamin Kramer9df08232013-06-29 16:37:14 +00005230static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005231 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00005232
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005233 switch (Triple.getArch()) {
5234 default:
5235 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00005236
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005237 case llvm::Triple::xcore:
5238 return new XCoreTargetInfo(Triple);
5239
Tony Linthicum96319392011-12-12 21:14:55 +00005240 case llvm::Triple::hexagon:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005241 return new HexagonTargetInfo(Triple);
Tony Linthicum96319392011-12-12 21:14:55 +00005242
Tim Northoverc264e162013-01-31 12:13:10 +00005243 case llvm::Triple::aarch64:
5244 switch (os) {
5245 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005246 return new LinuxTargetInfo<AArch64TargetInfo>(Triple);
Tim Northoverc264e162013-01-31 12:13:10 +00005247 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005248 return new AArch64TargetInfo(Triple);
Tim Northoverc264e162013-01-31 12:13:10 +00005249 }
5250
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005251 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00005252 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005253 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00005254 return new DarwinARMTargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005255
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005256 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00005257 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005258 return new LinuxTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005259 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005260 return new FreeBSDTargetInfo<ARMTargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005261 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005262 return new NetBSDTargetInfo<ARMTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005263 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005264 return new OpenBSDTargetInfo<ARMTargetInfo>(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00005265 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005266 return new BitrigTargetInfo<ARMTargetInfo>(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00005267 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005268 return new RTEMSTargetInfo<ARMTargetInfo>(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005269 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005270 return new NaClTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005271 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005272 return new ARMTargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005273 }
Eli Friedman61538a72008-05-20 14:21:01 +00005274
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005275 case llvm::Triple::msp430:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005276 return new MSP430TargetInfo(Triple);
Eli Friedman61538a72008-05-20 14:21:01 +00005277
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005278 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005279 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005280 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005281 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005282 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005283 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005284 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005285 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005286 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005287 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005288 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005289 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005290 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005291
5292 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005293 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005294 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005295 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005296 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005297 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005298 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005299 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005300 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005301 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005302 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005303 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005304 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005305
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005306 case llvm::Triple::mips64:
5307 switch (os) {
5308 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005309 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005310 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005311 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005312 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005313 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005314 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005315 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005316 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005317 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005318 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005319 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005320 }
5321
5322 case llvm::Triple::mips64el:
5323 switch (os) {
5324 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005325 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005326 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005327 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005328 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005329 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005330 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005331 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005332 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005333 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005334 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005335 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005336 }
5337
Ivan Krasinef05abd2011-08-24 20:22:22 +00005338 case llvm::Triple::le32:
5339 switch (os) {
Eli Bendersky441d9f72012-12-04 18:38:10 +00005340 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005341 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasinef05abd2011-08-24 20:22:22 +00005342 default:
5343 return NULL;
5344 }
5345
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005346 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005347 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00005348 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005349 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005350 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005351 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005352 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005353 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005354 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005355 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005356 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005357 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005358 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005359 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005360 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005361 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005362 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005363
5364 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005365 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00005366 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005367 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005368 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005369 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005370 case llvm::Triple::Lv2:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005371 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005372 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005373 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005374 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005375 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005376 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005377 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005378 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005379
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00005380 case llvm::Triple::ppc64le:
5381 switch (os) {
5382 case llvm::Triple::Linux:
5383 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
5384 default:
5385 return new PPC64TargetInfo(Triple);
5386 }
5387
Peter Collingbourneedb66f32012-05-20 23:28:41 +00005388 case llvm::Triple::nvptx:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005389 return new NVPTX32TargetInfo(Triple);
Peter Collingbourneedb66f32012-05-20 23:28:41 +00005390 case llvm::Triple::nvptx64:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005391 return new NVPTX64TargetInfo(Triple);
Peter Collingbourneedb66f32012-05-20 23:28:41 +00005392
Eli Friedman6505a292012-10-12 23:32:00 +00005393 case llvm::Triple::r600:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005394 return new R600TargetInfo(Triple);
Eli Friedman6505a292012-10-12 23:32:00 +00005395
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005396 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005397 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005398 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005399 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005400 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005401 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005402 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005403 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005404 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005405 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005406 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005407 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005408 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005409 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005410 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005411 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005412 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005413
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005414 case llvm::Triple::sparcv9:
5415 switch (os) {
5416 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005417 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005418 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005419 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005420 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005421 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005422 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005423 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005424 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005425 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005426 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005427 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005428 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005429 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005430 }
5431
Ulrich Weigandb8409212013-05-06 16:26:41 +00005432 case llvm::Triple::systemz:
5433 switch (os) {
5434 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005435 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00005436 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005437 return new SystemZTargetInfo(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00005438 }
5439
Eli Friedmanb63decf2009-08-19 20:47:07 +00005440 case llvm::Triple::tce:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005441 return new TCETargetInfo(Triple);
Eli Friedmanb63decf2009-08-19 20:47:07 +00005442
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005443 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005444 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00005445 return new DarwinI386TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005446
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005447 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00005448 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005449 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005450 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005451 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005452 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005453 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005454 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005455 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005456 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005457 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00005458 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005459 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005460 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005461 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner38e317d2010-07-07 16:01:42 +00005462 case llvm::Triple::Minix:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005463 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005464 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005465 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005466 case llvm::Triple::Cygwin:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005467 return new CygwinX86_32TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005468 case llvm::Triple::MinGW32:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005469 return new MinGWX86_32TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005470 case llvm::Triple::Win32:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005471 return new VisualStudioWindowsX86_32TargetInfo(Triple);
Chris Lattner86ed3a32010-04-11 19:29:39 +00005472 case llvm::Triple::Haiku:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005473 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00005474 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005475 return new RTEMSX86_32TargetInfo(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005476 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005477 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005478 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005479 return new X86_32TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005480 }
5481
5482 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005483 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
Benjamin Kramer9df08232013-06-29 16:37:14 +00005484 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005485
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005486 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00005487 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005488 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005489 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005490 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner7a7ca282010-01-09 05:41:14 +00005491 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005492 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005493 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005494 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005495 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005496 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00005497 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005498 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005499 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005500 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005501 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005502 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00005503 case llvm::Triple::MinGW32:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005504 return new MinGWX86_64TargetInfo(Triple);
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00005505 case llvm::Triple::Win32: // This is what Triple.h supports now.
Benjamin Kramer9df08232013-06-29 16:37:14 +00005506 return new VisualStudioWindowsX86_64TargetInfo(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005507 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005508 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005509 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005510 return new X86_64TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005511 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005512
5513 case llvm::Triple::spir: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005514 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00005515 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005516 return NULL;
Benjamin Kramer9df08232013-06-29 16:37:14 +00005517 return new SPIR32TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005518 }
5519 case llvm::Triple::spir64: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005520 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00005521 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005522 return NULL;
Benjamin Kramer9df08232013-06-29 16:37:14 +00005523 return new SPIR64TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005524 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005525 }
Reid Spencer5f016e22007-07-11 17:01:13 +00005526}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005527
5528/// CreateTargetInfo - Return the target info object for the specified target
5529/// triple.
David Blaikied6471f72011-09-25 23:23:43 +00005530TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregor49a87542012-11-16 04:24:59 +00005531 TargetOptions *Opts) {
5532 llvm::Triple Triple(Opts->Triple);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005533
5534 // Construct the target
Benjamin Kramer9df08232013-06-29 16:37:14 +00005535 OwningPtr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005536 if (!Target) {
5537 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5538 return 0;
5539 }
Douglas Gregor9a022bb2012-10-15 16:45:32 +00005540 Target->setTargetOpts(Opts);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005541
Daniel Dunbareac7c532009-12-18 18:42:37 +00005542 // Set the target CPU if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00005543 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5544 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbareac7c532009-12-18 18:42:37 +00005545 return 0;
5546 }
5547
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005548 // Set the target ABI if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00005549 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5550 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005551 return 0;
5552 }
5553
Charles Davis98b7c5c2010-06-11 01:06:47 +00005554 // Set the target C++ ABI.
Douglas Gregor49a87542012-11-16 04:24:59 +00005555 if (!Opts->CXXABI.empty() && !Target->setCXXABI(Opts->CXXABI)) {
5556 Diags.Report(diag::err_target_unknown_cxxabi) << Opts->CXXABI;
Charles Davis98b7c5c2010-06-11 01:06:47 +00005557 return 0;
5558 }
5559
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005560 // Compute the default target features, we need the target to handle this
5561 // because features may have dependencies on one another.
5562 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00005563 Target->getDefaultFeatures(Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005564
5565 // Apply the user specified deltas.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005566 // First the enables.
Douglas Gregor57016dd2012-10-16 23:40:58 +00005567 for (std::vector<std::string>::const_iterator
Douglas Gregor49a87542012-11-16 04:24:59 +00005568 it = Opts->FeaturesAsWritten.begin(),
5569 ie = Opts->FeaturesAsWritten.end();
Douglas Gregor57016dd2012-10-16 23:40:58 +00005570 it != ie; ++it) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005571 const char *Name = it->c_str();
5572
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005573 if (Name[0] != '+')
5574 continue;
5575
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005576 // Apply the feature via the target.
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005577 if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
5578 Diags.Report(diag::err_target_invalid_feature) << Name;
5579 return 0;
5580 }
5581 }
5582
5583 // Then the disables.
Douglas Gregor57016dd2012-10-16 23:40:58 +00005584 for (std::vector<std::string>::const_iterator
Douglas Gregor49a87542012-11-16 04:24:59 +00005585 it = Opts->FeaturesAsWritten.begin(),
5586 ie = Opts->FeaturesAsWritten.end();
Douglas Gregor57016dd2012-10-16 23:40:58 +00005587 it != ie; ++it) {
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005588 const char *Name = it->c_str();
5589
5590 if (Name[0] == '+')
5591 continue;
5592
5593 // Apply the feature via the target.
5594 if (Name[0] != '-' ||
5595 !Target->setFeatureEnabled(Features, Name + 1, false)) {
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005596 Diags.Report(diag::err_target_invalid_feature) << Name;
5597 return 0;
5598 }
5599 }
5600
5601 // Add the features to the compile options.
5602 //
5603 // FIXME: If we are completely confident that we have the right set, we only
5604 // need to pass the minuses.
Douglas Gregor49a87542012-11-16 04:24:59 +00005605 Opts->Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005606 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5607 ie = Features.end(); it != ie; ++it)
Douglas Gregor49a87542012-11-16 04:24:59 +00005608 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
5609 Target->HandleTargetFeatures(Opts->Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005610
5611 return Target.take();
5612}