blob: 00431c2a0d6f5adbb58929a4edfd221feec9d3ef [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
Sylvestre Ledru3309a782013-09-05 13:47:07 +0000281// GNU/kFreeBSD Target
282template<typename Target>
283class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
284protected:
285 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
286 MacroBuilder &Builder) const {
287 // GNU/kFreeBSD defines; list based off of gcc output
288
289 DefineStd(Builder, "unix", Opts);
290 Builder.defineMacro("__FreeBSD_kernel__");
291 Builder.defineMacro("__GLIBC__");
292 Builder.defineMacro("__ELF__");
293 if (Opts.POSIXThreads)
294 Builder.defineMacro("_REENTRANT");
295 if (Opts.CPlusPlus)
296 Builder.defineMacro("_GNU_SOURCE");
297 }
298public:
Sylvestre Ledrudeb77992013-09-05 13:58:07 +0000299 KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru3309a782013-09-05 13:47:07 +0000300 this->UserLabelPrefix = "";
301 }
302};
303
Chris Lattner38e317d2010-07-07 16:01:42 +0000304// Minix Target
305template<typename Target>
306class MinixTargetInfo : public OSTargetInfo<Target> {
307protected:
308 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
309 MacroBuilder &Builder) const {
310 // Minix defines
311
312 Builder.defineMacro("__minix", "3");
313 Builder.defineMacro("_EM_WSIZE", "4");
314 Builder.defineMacro("_EM_PSIZE", "4");
315 Builder.defineMacro("_EM_SSIZE", "2");
316 Builder.defineMacro("_EM_LSIZE", "4");
317 Builder.defineMacro("_EM_FSIZE", "4");
318 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman6d402dc2011-12-08 23:54:21 +0000319 Builder.defineMacro("__ELF__");
Chris Lattner38e317d2010-07-07 16:01:42 +0000320 DefineStd(Builder, "unix", Opts);
321 }
322public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000323 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
324 this->UserLabelPrefix = "";
325 }
Chris Lattner38e317d2010-07-07 16:01:42 +0000326};
327
Torok Edwin5f6c1942009-06-30 17:10:35 +0000328// Linux target
329template<typename Target>
330class LinuxTargetInfo : public OSTargetInfo<Target> {
331protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000332 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000333 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000334 // Linux defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000335 DefineStd(Builder, "unix", Opts);
336 DefineStd(Builder, "linux", Opts);
337 Builder.defineMacro("__gnu_linux__");
338 Builder.defineMacro("__ELF__");
Logan Chien94a71422012-09-02 09:30:11 +0000339 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov32064032012-04-26 12:08:09 +0000340 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000341 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000342 Builder.defineMacro("_REENTRANT");
Douglas Gregor2b003fd2010-04-21 05:52:38 +0000343 if (Opts.CPlusPlus)
344 Builder.defineMacro("_GNU_SOURCE");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000345 }
346public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000347 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000348 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000349 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000350 }
Benjamin Kramer86d18c52011-10-15 17:53:33 +0000351
352 virtual const char *getStaticInitSectionSpecifier() const {
353 return ".text.startup";
354 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000355};
356
Chris Lattnerb62bb282009-07-13 20:29:08 +0000357// NetBSD Target
358template<typename Target>
359class NetBSDTargetInfo : public OSTargetInfo<Target> {
360protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000361 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000362 MacroBuilder &Builder) const {
Chris Lattnerb62bb282009-07-13 20:29:08 +0000363 // NetBSD defines; list based off of gcc output
Benjamin Kramera9992772010-01-09 17:55:51 +0000364 Builder.defineMacro("__NetBSD__");
365 Builder.defineMacro("__unix__");
366 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000367 if (Opts.POSIXThreads)
Benjamin Kramera9992772010-01-09 17:55:51 +0000368 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerb62bb282009-07-13 20:29:08 +0000369 }
370public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000371 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
372 this->UserLabelPrefix = "";
373 }
Chris Lattnerb62bb282009-07-13 20:29:08 +0000374};
375
Torok Edwin5f6c1942009-06-30 17:10:35 +0000376// OpenBSD Target
377template<typename Target>
378class OpenBSDTargetInfo : public OSTargetInfo<Target> {
379protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000380 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000381 MacroBuilder &Builder) const {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000382 // OpenBSD defines; list based off of gcc output
383
Benjamin Kramera9992772010-01-09 17:55:51 +0000384 Builder.defineMacro("__OpenBSD__");
385 DefineStd(Builder, "unix", Opts);
386 Builder.defineMacro("__ELF__");
Daniel Dunbar5345c392009-09-03 04:54:28 +0000387 if (Opts.POSIXThreads)
Chris Lattner4ddcf3b2012-04-25 06:12:24 +0000388 Builder.defineMacro("_REENTRANT");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000389 }
390public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000391 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
392 this->UserLabelPrefix = "";
393 this->TLSSupported = false;
Eli Friedman62d829a2011-12-15 02:15:56 +0000394
Eli Friedman62d829a2011-12-15 02:15:56 +0000395 switch (Triple.getArch()) {
396 default:
397 case llvm::Triple::x86:
398 case llvm::Triple::x86_64:
399 case llvm::Triple::arm:
Eric Christopher825d3862012-11-14 22:08:59 +0000400 case llvm::Triple::sparc:
Eli Friedman62d829a2011-12-15 02:15:56 +0000401 this->MCountName = "__mcount";
402 break;
403 case llvm::Triple::mips64:
404 case llvm::Triple::mips64el:
405 case llvm::Triple::ppc:
Eric Christopher825d3862012-11-14 22:08:59 +0000406 case llvm::Triple::sparcv9:
Eli Friedman62d829a2011-12-15 02:15:56 +0000407 this->MCountName = "_mcount";
408 break;
409 }
410 }
Torok Edwin5f6c1942009-06-30 17:10:35 +0000411};
412
Eli Friedman42f74f22012-08-08 23:57:20 +0000413// Bitrig Target
414template<typename Target>
415class BitrigTargetInfo : public OSTargetInfo<Target> {
416protected:
417 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
418 MacroBuilder &Builder) const {
419 // Bitrig defines; list based off of gcc output
420
421 Builder.defineMacro("__Bitrig__");
422 DefineStd(Builder, "unix", Opts);
423 Builder.defineMacro("__ELF__");
424 if (Opts.POSIXThreads)
425 Builder.defineMacro("_REENTRANT");
426 }
427public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000428 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
429 this->UserLabelPrefix = "";
430 this->TLSSupported = false;
431 this->MCountName = "__mcount";
Eli Friedman42f74f22012-08-08 23:57:20 +0000432 }
433};
434
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000435// PSP Target
436template<typename Target>
437class PSPTargetInfo : public OSTargetInfo<Target> {
438protected:
439 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000440 MacroBuilder &Builder) const {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000441 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramera9992772010-01-09 17:55:51 +0000442 Builder.defineMacro("PSP");
443 Builder.defineMacro("_PSP");
444 Builder.defineMacro("__psp__");
445 Builder.defineMacro("__ELF__");
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000446 }
447public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000448 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan84423a82009-11-15 10:22:07 +0000449 this->UserLabelPrefix = "";
450 }
451};
452
John Thompson3f6918a2009-11-19 17:18:50 +0000453// PS3 PPU Target
454template<typename Target>
455class PS3PPUTargetInfo : public OSTargetInfo<Target> {
456protected:
457 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000458 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000459 // PS3 PPU defines.
John Thompsonfb457972010-03-25 16:18:32 +0000460 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000461 Builder.defineMacro("__PPU__");
462 Builder.defineMacro("__CELLOS_LV2__");
463 Builder.defineMacro("__ELF__");
464 Builder.defineMacro("__LP32__");
John Thompson8e6065a2010-06-24 22:44:13 +0000465 Builder.defineMacro("_ARCH_PPC64");
466 Builder.defineMacro("__powerpc64__");
John Thompson3f6918a2009-11-19 17:18:50 +0000467 }
468public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000469 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompson3f6918a2009-11-19 17:18:50 +0000470 this->UserLabelPrefix = "";
Nick Lewycky99520702011-12-16 22:32:39 +0000471 this->LongWidth = this->LongAlign = 32;
472 this->PointerWidth = this->PointerAlign = 32;
John Thompson8e6065a2010-06-24 22:44:13 +0000473 this->IntMaxType = TargetInfo::SignedLongLong;
474 this->UIntMaxType = TargetInfo::UnsignedLongLong;
475 this->Int64Type = TargetInfo::SignedLongLong;
John Thompsonec387af2009-12-18 14:21:08 +0000476 this->SizeType = TargetInfo::UnsignedInt;
John Thompson8e6065a2010-06-24 22:44:13 +0000477 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 +0000478 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompson3f6918a2009-11-19 17:18:50 +0000479 }
480};
481
482// FIXME: Need a real SPU target.
483// PS3 SPU Target
484template<typename Target>
485class PS3SPUTargetInfo : public OSTargetInfo<Target> {
486protected:
487 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000488 MacroBuilder &Builder) const {
John Thompson3f6918a2009-11-19 17:18:50 +0000489 // PS3 PPU defines.
Benjamin Kramera9992772010-01-09 17:55:51 +0000490 Builder.defineMacro("__SPU__");
491 Builder.defineMacro("__ELF__");
John Thompson3f6918a2009-11-19 17:18:50 +0000492 }
493public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000494 PS3SPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompson3f6918a2009-11-19 17:18:50 +0000495 this->UserLabelPrefix = "";
496 }
497};
498
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000499// AuroraUX target
500template<typename Target>
501class AuroraUXTargetInfo : public OSTargetInfo<Target> {
502protected:
503 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000504 MacroBuilder &Builder) const {
505 DefineStd(Builder, "sun", Opts);
506 DefineStd(Builder, "unix", Opts);
507 Builder.defineMacro("__ELF__");
508 Builder.defineMacro("__svr4__");
509 Builder.defineMacro("__SVR4");
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000510 }
511public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000512 AuroraUXTargetInfo(const llvm::Triple &Triple)
513 : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +0000514 this->UserLabelPrefix = "";
515 this->WCharType = this->SignedLong;
516 // FIXME: WIntType should be SignedLong
517 }
518};
519
Torok Edwin5f6c1942009-06-30 17:10:35 +0000520// Solaris target
521template<typename Target>
522class SolarisTargetInfo : public OSTargetInfo<Target> {
523protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +0000524 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +0000525 MacroBuilder &Builder) const {
526 DefineStd(Builder, "sun", Opts);
527 DefineStd(Builder, "unix", Opts);
528 Builder.defineMacro("__ELF__");
529 Builder.defineMacro("__svr4__");
530 Builder.defineMacro("__SVR4");
David Chisnall165329c2012-02-28 17:10:04 +0000531 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
532 // newer, but to 500 for everything else. feature_test.h has a check to
533 // ensure that you are not using C99 with an old version of X/Open or C89
534 // with a new version.
535 if (Opts.C99 || Opts.C11)
536 Builder.defineMacro("_XOPEN_SOURCE", "600");
537 else
538 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnallb4f0bd62012-03-02 10:49:52 +0000539 if (Opts.CPlusPlus)
David Chisnall165329c2012-02-28 17:10:04 +0000540 Builder.defineMacro("__C99FEATURES__");
David Chisnall48fad492012-02-17 18:35:11 +0000541 Builder.defineMacro("_LARGEFILE_SOURCE");
542 Builder.defineMacro("_LARGEFILE64_SOURCE");
543 Builder.defineMacro("__EXTENSIONS__");
David Chisnall165329c2012-02-28 17:10:04 +0000544 Builder.defineMacro("_REENTRANT");
Torok Edwin5f6c1942009-06-30 17:10:35 +0000545 }
546public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000547 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwin5f6c1942009-06-30 17:10:35 +0000548 this->UserLabelPrefix = "";
David Chisnallfb027842012-03-28 18:04:14 +0000549 this->WCharType = this->SignedInt;
Torok Edwin5f6c1942009-06-30 17:10:35 +0000550 // FIXME: WIntType should be SignedLong
551 }
552};
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000553
554// Windows target
555template<typename Target>
556class WindowsTargetInfo : public OSTargetInfo<Target> {
557protected:
558 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
559 MacroBuilder &Builder) const {
Michael J. Spencera764e832010-10-21 08:22:51 +0000560 Builder.defineMacro("_WIN32");
561 }
562 void getVisualStudioDefines(const LangOptions &Opts,
563 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000564 if (Opts.CPlusPlus) {
565 if (Opts.RTTI)
566 Builder.defineMacro("_CPPRTTI");
567
568 if (Opts.Exceptions)
569 Builder.defineMacro("_CPPUNWIND");
570 }
571
572 if (!Opts.CharIsSigned)
573 Builder.defineMacro("_CHAR_UNSIGNED");
574
575 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
576 // but it works for now.
577 if (Opts.POSIXThreads)
578 Builder.defineMacro("_MT");
Michael J. Spencera764e832010-10-21 08:22:51 +0000579
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000580 if (Opts.MSCVersion != 0)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000581 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000582
Francois Pichet62ec1f22011-09-17 17:15:52 +0000583 if (Opts.MicrosoftExt) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000584 Builder.defineMacro("_MSC_EXTENSIONS");
585
Richard Smith80ad52f2013-01-02 11:42:31 +0000586 if (Opts.CPlusPlus11) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000587 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
588 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
589 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
590 }
591 }
592
593 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000594 }
595
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000596public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000597 WindowsTargetInfo(const llvm::Triple &Triple)
598 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencerdae4ac42010-10-21 05:21:48 +0000599};
600
Derek Schuff7da46f92012-10-11 16:55:58 +0000601template <typename Target>
602class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramer9df08232013-06-29 16:37:14 +0000603protected:
Derek Schuff7da46f92012-10-11 16:55:58 +0000604 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
605 MacroBuilder &Builder) const {
606 if (Opts.POSIXThreads)
607 Builder.defineMacro("_REENTRANT");
608 if (Opts.CPlusPlus)
609 Builder.defineMacro("_GNU_SOURCE");
610
611 DefineStd(Builder, "unix", Opts);
612 Builder.defineMacro("__ELF__");
613 Builder.defineMacro("__native_client__");
614 }
Benjamin Kramer9df08232013-06-29 16:37:14 +0000615
616public:
617 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff7da46f92012-10-11 16:55:58 +0000618 this->UserLabelPrefix = "";
619 this->LongAlign = 32;
620 this->LongWidth = 32;
621 this->PointerAlign = 32;
622 this->PointerWidth = 32;
623 this->IntMaxType = TargetInfo::SignedLongLong;
624 this->UIntMaxType = TargetInfo::UnsignedLongLong;
625 this->Int64Type = TargetInfo::SignedLongLong;
626 this->DoubleAlign = 64;
627 this->LongDoubleWidth = 64;
628 this->LongDoubleAlign = 64;
629 this->SizeType = TargetInfo::UnsignedInt;
630 this->PtrDiffType = TargetInfo::SignedInt;
631 this->IntPtrType = TargetInfo::SignedInt;
Eli Benderskyc0783dc2013-04-08 21:31:01 +0000632 // RegParmMax is inherited from the underlying architecture
Derek Schuff7da46f92012-10-11 16:55:58 +0000633 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
634 this->DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
635 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
636 }
Derek Schuff263366f2012-10-16 22:30:41 +0000637 virtual typename Target::CallingConvCheckResult checkCallingConvention(
638 CallingConv CC) const {
639 return CC == CC_PnaclCall ? Target::CCCR_OK :
640 Target::checkCallingConvention(CC);
641 }
Derek Schuff7da46f92012-10-11 16:55:58 +0000642};
Mike Stump1eb44332009-09-09 15:08:12 +0000643} // end anonymous namespace.
Torok Edwin5f6c1942009-06-30 17:10:35 +0000644
Chris Lattnerd29b6302008-10-05 21:50:58 +0000645//===----------------------------------------------------------------------===//
Eli Friedmane4277982008-08-20 23:11:40 +0000646// Specific target implementations.
647//===----------------------------------------------------------------------===//
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000648
Eli Friedmane4277982008-08-20 23:11:40 +0000649namespace {
650// PPC abstract base class
651class PPCTargetInfo : public TargetInfo {
652 static const Builtin::Info BuiltinInfo[];
653 static const char * const GCCRegNames[];
654 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel02a84272012-06-11 22:35:19 +0000655 std::string CPU;
Eli Friedmane4277982008-08-20 23:11:40 +0000656public:
Benjamin Kramer9df08232013-06-29 16:37:14 +0000657 PPCTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000658 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber6e1d2ea2012-01-31 02:07:33 +0000659 LongDoubleWidth = LongDoubleAlign = 128;
660 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
661 }
Eli Friedman15b91762009-06-05 07:05:05 +0000662
Hal Finkel39d5fa12012-07-03 16:51:04 +0000663 /// \brief Flags for architecture specific defines.
664 typedef enum {
665 ArchDefineNone = 0,
666 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
667 ArchDefinePpcgr = 1 << 1,
668 ArchDefinePpcsq = 1 << 2,
669 ArchDefine440 = 1 << 3,
670 ArchDefine603 = 1 << 4,
671 ArchDefine604 = 1 << 5,
672 ArchDefinePwr4 = 1 << 6,
Bill Schmidt2821e182013-02-01 20:23:10 +0000673 ArchDefinePwr5 = 1 << 7,
674 ArchDefinePwr5x = 1 << 8,
675 ArchDefinePwr6 = 1 << 9,
676 ArchDefinePwr6x = 1 << 10,
677 ArchDefinePwr7 = 1 << 11,
678 ArchDefineA2 = 1 << 12,
679 ArchDefineA2q = 1 << 13
Hal Finkel39d5fa12012-07-03 16:51:04 +0000680 } ArchDefineTypes;
681
Bill Schmidt2821e182013-02-01 20:23:10 +0000682 // Note: GCC recognizes the following additional cpus:
683 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
684 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
685 // titan, rs64.
Hal Finkel02a84272012-06-11 22:35:19 +0000686 virtual bool setCPU(const std::string &Name) {
687 bool CPUKnown = llvm::StringSwitch<bool>(Name)
688 .Case("generic", true)
689 .Case("440", true)
690 .Case("450", true)
691 .Case("601", true)
692 .Case("602", true)
693 .Case("603", true)
694 .Case("603e", true)
695 .Case("603ev", true)
696 .Case("604", true)
697 .Case("604e", true)
698 .Case("620", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000699 .Case("630", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000700 .Case("g3", true)
701 .Case("7400", true)
702 .Case("g4", true)
703 .Case("7450", true)
704 .Case("g4+", true)
705 .Case("750", true)
706 .Case("970", true)
707 .Case("g5", true)
708 .Case("a2", true)
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000709 .Case("a2q", true)
Hal Finkel7de32962012-09-18 22:25:03 +0000710 .Case("e500mc", true)
711 .Case("e5500", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000712 .Case("power3", true)
713 .Case("pwr3", true)
714 .Case("power4", true)
715 .Case("pwr4", true)
716 .Case("power5", true)
717 .Case("pwr5", true)
718 .Case("power5x", true)
719 .Case("pwr5x", true)
720 .Case("power6", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000721 .Case("pwr6", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000722 .Case("power6x", true)
723 .Case("pwr6x", true)
724 .Case("power7", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000725 .Case("pwr7", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000726 .Case("powerpc", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000727 .Case("ppc", true)
Bill Schmidt2821e182013-02-01 20:23:10 +0000728 .Case("powerpc64", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000729 .Case("ppc64", true)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000730 .Case("powerpc64le", true)
731 .Case("ppc64le", true)
Hal Finkel02a84272012-06-11 22:35:19 +0000732 .Default(false);
733
734 if (CPUKnown)
735 CPU = Name;
736
737 return CPUKnown;
738 }
739
Eli Friedmane4277982008-08-20 23:11:40 +0000740 virtual void getTargetBuiltins(const Builtin::Info *&Records,
741 unsigned &NumRecords) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000742 Records = BuiltinInfo;
Eli Friedmane4277982008-08-20 23:11:40 +0000743 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +0000744 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000745
Bob Wilson9f1c49c2012-01-28 18:02:29 +0000746 virtual bool isCLZForZeroUndef() const { return false; }
747
Chris Lattner33328642009-03-20 15:52:06 +0000748 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000749 MacroBuilder &Builder) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000750
Bill Schmidt199402b2013-02-01 02:14:03 +0000751 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
752
Douglas Gregore727d212012-01-30 06:38:25 +0000753 virtual bool hasFeature(StringRef Feature) const;
754
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000755 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +0000756 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000757 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +0000758 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000759 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +0000760 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +0000761 switch (*Name) {
Anders Carlssond04c6e22007-11-27 04:11:28 +0000762 default: return false;
763 case 'O': // Zero
John Thompson8e6065a2010-06-24 22:44:13 +0000764 break;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000765 case 'b': // Base register
766 case 'f': // Floating point register
Chris Lattner44def072009-04-26 07:16:29 +0000767 Info.setAllowsRegister();
John Thompson8e6065a2010-06-24 22:44:13 +0000768 break;
769 // FIXME: The following are added to allow parsing.
770 // I just took a guess at what the actions should be.
771 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer20249a12010-10-21 03:16:25 +0000772 case 'd': // Floating point register (containing 64-bit value)
John Thompson8e6065a2010-06-24 22:44:13 +0000773 case 'v': // Altivec vector register
774 Info.setAllowsRegister();
775 break;
776 case 'w':
777 switch (Name[1]) {
Michael J. Spencer20249a12010-10-21 03:16:25 +0000778 case 'd':// VSX vector register to hold vector double data
779 case 'f':// VSX vector register to hold vector float data
780 case 's':// VSX vector register to hold scalar float data
781 case 'a':// Any VSX register
John Thompson8e6065a2010-06-24 22:44:13 +0000782 break;
783 default:
784 return false;
785 }
786 Info.setAllowsRegister();
787 Name++; // Skip over 'w'.
788 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000789 case 'h': // `MQ', `CTR', or `LINK' register
790 case 'q': // `MQ' register
791 case 'c': // `CTR' register
792 case 'l': // `LINK' register
793 case 'x': // `CR' register (condition register) number 0
794 case 'y': // `CR' register (condition register)
795 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson8e6065a2010-06-24 22:44:13 +0000796 Info.setAllowsRegister();
797 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000798 case 'I': // Signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000799 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer20249a12010-10-21 03:16:25 +0000800 // (use `L' instead for SImode constants)
801 case 'K': // Unsigned 16-bit constant
802 case 'L': // Signed 16-bit constant shifted left 16 bits
803 case 'M': // Constant larger than 31
804 case 'N': // Exact power of 2
805 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson8e6065a2010-06-24 22:44:13 +0000806 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000807 // register with one instruction per word
John Thompson8e6065a2010-06-24 22:44:13 +0000808 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer20249a12010-10-21 03:16:25 +0000809 // into a register using three instructions
John Thompson8e6065a2010-06-24 22:44:13 +0000810 break;
811 case 'm': // Memory operand. Note that on PowerPC targets, m can
812 // include addresses that update the base register. It
813 // is therefore only safe to use `m' in an asm statement
814 // if that asm statement accesses the operand exactly once.
815 // The asm statement must also use `%U<opno>' as a
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000816 // placeholder for the "update" flag in the corresponding
Michael J. Spencer20249a12010-10-21 03:16:25 +0000817 // load or store instruction. For example:
John Thompson8e6065a2010-06-24 22:44:13 +0000818 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer20249a12010-10-21 03:16:25 +0000819 // is correct but:
John Thompson8e6065a2010-06-24 22:44:13 +0000820 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
821 // is not. Use es rather than m if you don't want the base
Michael J. Spencer20249a12010-10-21 03:16:25 +0000822 // register to be updated.
823 case 'e':
John Thompson56b6eca2010-06-25 00:02:05 +0000824 if (Name[1] != 's')
825 return false;
Sebastian Redl5005a6c2010-08-17 22:42:34 +0000826 // es: A "stable" memory operand; that is, one which does not
John Thompson8e6065a2010-06-24 22:44:13 +0000827 // include any automodification of the base register. Unlike
828 // `m', this constraint can be used in asm statements that
829 // might access the operand several times, or that might not
John Thompson56b6eca2010-06-25 00:02:05 +0000830 // access it at all.
John Thompson8e6065a2010-06-24 22:44:13 +0000831 Info.setAllowsMemory();
John Thompson56b6eca2010-06-25 00:02:05 +0000832 Name++; // Skip over 'e'.
John Thompson8e6065a2010-06-24 22:44:13 +0000833 break;
834 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer20249a12010-10-21 03:16:25 +0000835 // usually better to use `m' or `es' in asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000836 case 'Z': // Memory operand that is an indexed or indirect from a
837 // register (it is usually better to use `m' or `es' in
Michael J. Spencer20249a12010-10-21 03:16:25 +0000838 // asm statements)
John Thompson8e6065a2010-06-24 22:44:13 +0000839 Info.setAllowsMemory();
840 Info.setAllowsRegister();
841 break;
Michael J. Spencer20249a12010-10-21 03:16:25 +0000842 case 'R': // AIX TOC entry
John Thompson8e6065a2010-06-24 22:44:13 +0000843 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer20249a12010-10-21 03:16:25 +0000844 // register (`p' is preferable for asm statements)
845 case 'S': // Constant suitable as a 64-bit mask operand
846 case 'T': // Constant suitable as a 32-bit mask operand
847 case 'U': // System V Release 4 small data area reference
John Thompson8e6065a2010-06-24 22:44:13 +0000848 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer20249a12010-10-21 03:16:25 +0000849 // instructions
850 case 'W': // Vector constant that does not require memory
851 case 'j': // Vector constant that is all zeros.
John Thompson8e6065a2010-06-24 22:44:13 +0000852 break;
853 // End FIXME.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000854 }
John Thompson8e6065a2010-06-24 22:44:13 +0000855 return true;
Anders Carlssond04c6e22007-11-27 04:11:28 +0000856 }
Eli Friedmane4277982008-08-20 23:11:40 +0000857 virtual const char *getClobbers() const {
858 return "";
Anders Carlssond04c6e22007-11-27 04:11:28 +0000859 }
Adhemerval Zanellab0fc94c2013-01-22 20:02:45 +0000860 int getEHDataRegisterNumber(unsigned RegNo) const {
861 if (RegNo == 0) return 3;
862 if (RegNo == 1) return 4;
863 return -1;
864 }
Eli Friedmane4277982008-08-20 23:11:40 +0000865};
Anders Carlssond04c6e22007-11-27 04:11:28 +0000866
Eli Friedmane4277982008-08-20 23:11:40 +0000867const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000868#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000869#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000870 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +0000871#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmane4277982008-08-20 23:11:40 +0000872};
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000873
874
Chris Lattnerc0f59212009-03-02 22:27:17 +0000875/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
876/// #defines that are not tied to a specific subtarget.
Chris Lattner33328642009-03-20 15:52:06 +0000877void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +0000878 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +0000879 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +0000880 Builder.defineMacro("__ppc__");
Chandler Carruthc6fa1152013-06-25 11:13:47 +0000881 Builder.defineMacro("__PPC__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000882 Builder.defineMacro("_ARCH_PPC");
Chris Lattnere03ae302010-02-16 18:14:57 +0000883 Builder.defineMacro("__powerpc__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000884 Builder.defineMacro("__POWERPC__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000885 if (PointerWidth == 64) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000886 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnere03ae302010-02-16 18:14:57 +0000887 Builder.defineMacro("__powerpc64__");
Benjamin Kramera9992772010-01-09 17:55:51 +0000888 Builder.defineMacro("__ppc64__");
Chandler Carruthc6fa1152013-06-25 11:13:47 +0000889 Builder.defineMacro("__PPC64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +0000890 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000891
Chris Lattnerc0f59212009-03-02 22:27:17 +0000892 // Target properties.
Bill Schmidtea7fb0c2013-07-26 01:36:11 +0000893 if (getTriple().getArch() == llvm::Triple::ppc64le) {
894 Builder.defineMacro("_LITTLE_ENDIAN");
895 Builder.defineMacro("__LITTLE_ENDIAN__");
896 } else {
897 if (getTriple().getOS() != llvm::Triple::NetBSD &&
898 getTriple().getOS() != llvm::Triple::OpenBSD)
899 Builder.defineMacro("_BIG_ENDIAN");
900 Builder.defineMacro("__BIG_ENDIAN__");
901 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000902
Chris Lattnerc0f59212009-03-02 22:27:17 +0000903 // Subtarget options.
Benjamin Kramera9992772010-01-09 17:55:51 +0000904 Builder.defineMacro("__NATURAL_ALIGNMENT__");
905 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikova7c47172009-05-03 13:42:53 +0000906
Chris Lattnerc0f59212009-03-02 22:27:17 +0000907 // FIXME: Should be controlled by command line option.
Roman Divackyb2f6f472013-07-03 19:45:54 +0000908 if (LongDoubleWidth == 128)
909 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer20249a12010-10-21 03:16:25 +0000910
John Thompson3f6918a2009-11-19 17:18:50 +0000911 if (Opts.AltiVec) {
Benjamin Kramera9992772010-01-09 17:55:51 +0000912 Builder.defineMacro("__VEC__", "10206");
913 Builder.defineMacro("__ALTIVEC__");
John Thompson3f6918a2009-11-19 17:18:50 +0000914 }
Hal Finkel02a84272012-06-11 22:35:19 +0000915
916 // CPU identification.
Hal Finkel39d5fa12012-07-03 16:51:04 +0000917 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
918 .Case("440", ArchDefineName)
919 .Case("450", ArchDefineName | ArchDefine440)
920 .Case("601", ArchDefineName)
921 .Case("602", ArchDefineName | ArchDefinePpcgr)
922 .Case("603", ArchDefineName | ArchDefinePpcgr)
923 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
924 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
925 .Case("604", ArchDefineName | ArchDefinePpcgr)
926 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
927 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt2821e182013-02-01 20:23:10 +0000928 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000929 .Case("7400", ArchDefineName | ArchDefinePpcgr)
930 .Case("7450", ArchDefineName | ArchDefinePpcgr)
931 .Case("750", ArchDefineName | ArchDefinePpcgr)
932 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
933 | ArchDefinePpcsq)
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000934 .Case("a2", ArchDefineA2)
935 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt2821e182013-02-01 20:23:10 +0000936 .Case("pwr3", ArchDefinePpcgr)
937 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
938 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
939 | ArchDefinePpcsq)
940 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
941 | ArchDefinePpcgr | ArchDefinePpcsq)
942 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
943 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
944 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
945 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
946 | ArchDefinePpcsq)
947 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
948 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
949 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
950 .Case("power3", ArchDefinePpcgr)
951 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
952 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
953 | ArchDefinePpcsq)
954 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
955 | ArchDefinePpcgr | ArchDefinePpcsq)
956 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
957 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
958 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
959 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
960 | ArchDefinePpcsq)
961 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
962 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
963 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000964 .Default(ArchDefineNone);
965
966 if (defs & ArchDefineName)
967 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
968 if (defs & ArchDefinePpcgr)
969 Builder.defineMacro("_ARCH_PPCGR");
970 if (defs & ArchDefinePpcsq)
971 Builder.defineMacro("_ARCH_PPCSQ");
972 if (defs & ArchDefine440)
Hal Finkel02a84272012-06-11 22:35:19 +0000973 Builder.defineMacro("_ARCH_440");
Hal Finkel39d5fa12012-07-03 16:51:04 +0000974 if (defs & ArchDefine603)
975 Builder.defineMacro("_ARCH_603");
976 if (defs & ArchDefine604)
977 Builder.defineMacro("_ARCH_604");
Bill Schmidt2821e182013-02-01 20:23:10 +0000978 if (defs & ArchDefinePwr4)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000979 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt2821e182013-02-01 20:23:10 +0000980 if (defs & ArchDefinePwr5)
Hal Finkel39d5fa12012-07-03 16:51:04 +0000981 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt2821e182013-02-01 20:23:10 +0000982 if (defs & ArchDefinePwr5x)
983 Builder.defineMacro("_ARCH_PWR5X");
984 if (defs & ArchDefinePwr6)
Hal Finkel02a84272012-06-11 22:35:19 +0000985 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt2821e182013-02-01 20:23:10 +0000986 if (defs & ArchDefinePwr6x)
987 Builder.defineMacro("_ARCH_PWR6X");
988 if (defs & ArchDefinePwr7)
989 Builder.defineMacro("_ARCH_PWR7");
Hal Finkel5ccd3d02013-02-01 05:53:33 +0000990 if (defs & ArchDefineA2)
991 Builder.defineMacro("_ARCH_A2");
992 if (defs & ArchDefineA2q) {
993 Builder.defineMacro("_ARCH_A2Q");
994 Builder.defineMacro("_ARCH_QP");
995 }
996
997 if (getTriple().getVendor() == llvm::Triple::BGQ) {
998 Builder.defineMacro("__bg__");
999 Builder.defineMacro("__THW_BLUEGENE__");
1000 Builder.defineMacro("__bgq__");
1001 Builder.defineMacro("__TOS_BGQ__");
1002 }
Bill Schmidt2821e182013-02-01 20:23:10 +00001003
1004 // FIXME: The following are not yet generated here by Clang, but are
1005 // generated by GCC:
1006 //
1007 // _SOFT_FLOAT_
1008 // __RECIP_PRECISION__
1009 // __APPLE_ALTIVEC__
1010 // __VSX__
1011 // __RECIP__
1012 // __RECIPF__
1013 // __RSQRTE__
1014 // __RSQRTEF__
1015 // _SOFT_DOUBLE_
1016 // __NO_LWSYNC__
1017 // __HAVE_BSWAP__
1018 // __LONGDOUBLE128
1019 // __CMODEL_MEDIUM__
1020 // __CMODEL_LARGE__
1021 // _CALL_SYSV
1022 // _CALL_DARWIN
1023 // __NO_FPRS__
Bill Schmidt199402b2013-02-01 02:14:03 +00001024}
1025
1026void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1027 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1028 .Case("7400", true)
1029 .Case("g4", true)
1030 .Case("7450", true)
1031 .Case("g4+", true)
1032 .Case("970", true)
1033 .Case("g5", true)
1034 .Case("pwr6", true)
1035 .Case("pwr7", true)
1036 .Case("ppc64", true)
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001037 .Case("ppc64le", true)
Bill Schmidt199402b2013-02-01 02:14:03 +00001038 .Default(false);
Hal Finkel3c6aaeb2013-02-01 18:44:19 +00001039
1040 Features["qpx"] = (CPU == "a2q");
Bill Schmidt199402b2013-02-01 02:14:03 +00001041}
1042
Douglas Gregore727d212012-01-30 06:38:25 +00001043bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1044 return Feature == "powerpc";
1045}
Chris Lattner393ff042008-04-21 18:56:49 +00001046
Douglas Gregore727d212012-01-30 06:38:25 +00001047
Eli Friedmane4277982008-08-20 23:11:40 +00001048const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnere94e0d42009-09-16 05:05:27 +00001049 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1050 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1051 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1052 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1053 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1054 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1055 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1056 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmane4277982008-08-20 23:11:40 +00001057 "mq", "lr", "ctr", "ap",
Chris Lattnere94e0d42009-09-16 05:05:27 +00001058 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmane4277982008-08-20 23:11:40 +00001059 "xer",
Chris Lattnere94e0d42009-09-16 05:05:27 +00001060 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1061 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1062 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1063 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmane4277982008-08-20 23:11:40 +00001064 "vrsave", "vscr",
1065 "spe_acc", "spefscr",
1066 "sfp"
1067};
Reid Spencer5f016e22007-07-11 17:01:13 +00001068
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001069void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmane4277982008-08-20 23:11:40 +00001070 unsigned &NumNames) const {
1071 Names = GCCRegNames;
1072 NumNames = llvm::array_lengthof(GCCRegNames);
1073}
Reid Spencer5f016e22007-07-11 17:01:13 +00001074
Eli Friedmane4277982008-08-20 23:11:40 +00001075const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1076 // While some of these aliases do map to different registers
1077 // they still share the same register name.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001078 { { "0" }, "r0" },
1079 { { "1"}, "r1" },
1080 { { "2" }, "r2" },
1081 { { "3" }, "r3" },
1082 { { "4" }, "r4" },
1083 { { "5" }, "r5" },
1084 { { "6" }, "r6" },
1085 { { "7" }, "r7" },
1086 { { "8" }, "r8" },
1087 { { "9" }, "r9" },
1088 { { "10" }, "r10" },
1089 { { "11" }, "r11" },
1090 { { "12" }, "r12" },
1091 { { "13" }, "r13" },
1092 { { "14" }, "r14" },
1093 { { "15" }, "r15" },
1094 { { "16" }, "r16" },
1095 { { "17" }, "r17" },
1096 { { "18" }, "r18" },
1097 { { "19" }, "r19" },
1098 { { "20" }, "r20" },
1099 { { "21" }, "r21" },
1100 { { "22" }, "r22" },
1101 { { "23" }, "r23" },
1102 { { "24" }, "r24" },
1103 { { "25" }, "r25" },
1104 { { "26" }, "r26" },
1105 { { "27" }, "r27" },
1106 { { "28" }, "r28" },
1107 { { "29" }, "r29" },
1108 { { "30" }, "r30" },
1109 { { "31" }, "r31" },
1110 { { "fr0" }, "f0" },
1111 { { "fr1" }, "f1" },
1112 { { "fr2" }, "f2" },
1113 { { "fr3" }, "f3" },
1114 { { "fr4" }, "f4" },
1115 { { "fr5" }, "f5" },
1116 { { "fr6" }, "f6" },
1117 { { "fr7" }, "f7" },
1118 { { "fr8" }, "f8" },
1119 { { "fr9" }, "f9" },
Mike Stump10880392009-09-17 21:15:00 +00001120 { { "fr10" }, "f10" },
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00001121 { { "fr11" }, "f11" },
1122 { { "fr12" }, "f12" },
1123 { { "fr13" }, "f13" },
1124 { { "fr14" }, "f14" },
1125 { { "fr15" }, "f15" },
1126 { { "fr16" }, "f16" },
1127 { { "fr17" }, "f17" },
1128 { { "fr18" }, "f18" },
1129 { { "fr19" }, "f19" },
1130 { { "fr20" }, "f20" },
1131 { { "fr21" }, "f21" },
1132 { { "fr22" }, "f22" },
1133 { { "fr23" }, "f23" },
1134 { { "fr24" }, "f24" },
1135 { { "fr25" }, "f25" },
1136 { { "fr26" }, "f26" },
1137 { { "fr27" }, "f27" },
1138 { { "fr28" }, "f28" },
1139 { { "fr29" }, "f29" },
1140 { { "fr30" }, "f30" },
1141 { { "fr31" }, "f31" },
1142 { { "cc" }, "cr0" },
Eli Friedmane4277982008-08-20 23:11:40 +00001143};
1144
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001145void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmane4277982008-08-20 23:11:40 +00001146 unsigned &NumAliases) const {
1147 Aliases = GCCRegAliases;
1148 NumAliases = llvm::array_lengthof(GCCRegAliases);
1149}
1150} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00001151
1152namespace {
Eli Friedmane4277982008-08-20 23:11:40 +00001153class PPC32TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001154public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001155 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eli Friedmaned855cb2008-08-21 00:13:15 +00001156 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 +00001157 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnere03ae302010-02-16 18:14:57 +00001158
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001159 switch (getTriple().getOS()) {
Nico Weber6e1d2ea2012-01-31 02:07:33 +00001160 case llvm::Triple::Linux:
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001161 case llvm::Triple::FreeBSD:
1162 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001163 SizeType = UnsignedInt;
Hal Finkel178a9b82012-03-02 20:54:36 +00001164 PtrDiffType = SignedInt;
1165 IntPtrType = SignedInt;
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001166 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +00001167 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +00001168 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +00001169 }
Roman Divackye3d175d2012-03-13 16:53:54 +00001170
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001171 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1172 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001173 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001174 }
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001175
1176 // PPC32 supports atomics up to 4 bytes.
1177 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001178 }
1179
Meador Ingec5613b22012-06-16 03:34:49 +00001180 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001181 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Ingec5613b22012-06-16 03:34:49 +00001182 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedmaned855cb2008-08-21 00:13:15 +00001183 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001184};
1185} // end anonymous namespace.
1186
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00001187// Note: ABI differences may eventually require us to have a separate
1188// TargetInfo for little endian.
Reid Spencer5f016e22007-07-11 17:01:13 +00001189namespace {
Eli Friedmane4277982008-08-20 23:11:40 +00001190class PPC64TargetInfo : public PPCTargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00001191public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001192 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00001193 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00001194 IntMaxType = SignedLong;
1195 UIntMaxType = UnsignedLong;
1196 Int64Type = SignedLong;
Roman Divackye3d175d2012-03-13 16:53:54 +00001197
Roman Divackyefe9c0d2012-03-13 19:20:17 +00001198 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1199 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divackye3d175d2012-03-13 16:53:54 +00001200 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Bill Schmidtdbaf4bc2012-10-29 14:59:24 +00001201 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 +00001202 "i64:64:64-f32:32:32-f64:64:64-"
Bill Schmidtdbaf4bc2012-10-29 14:59:24 +00001203 "v128:128:128-n32:64";
1204 } else
1205 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1206 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
1207 "v128:128:128-n32:64";
Benjamin Kramer7baa7112012-11-17 17:30:55 +00001208
1209 // PPC64 supports atomics up to 8 bytes.
1210 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerf291b102008-05-09 06:17:04 +00001211 }
Meador Ingec5613b22012-06-16 03:34:49 +00001212 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1213 return TargetInfo::CharPtrBuiltinVaList;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001214 }
Eli Friedmane4277982008-08-20 23:11:40 +00001215};
1216} // end anonymous namespace.
1217
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001218
1219namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +00001220class DarwinPPC32TargetInfo :
1221 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001222public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001223 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1224 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001225 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +00001226 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
David Fangb5afadd2013-05-16 17:51:48 +00001227 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001228 LongLongAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001229 SuitableAlign = 128;
Anton Yartsev9bc23ba2012-01-17 22:40:00 +00001230 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1231 "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
Roman Divackyc81f2a22011-01-06 08:27:10 +00001232 }
Meador Ingec5613b22012-06-16 03:34:49 +00001233 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1234 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001235 }
1236};
1237
1238class DarwinPPC64TargetInfo :
1239 public DarwinTargetInfo<PPC64TargetInfo> {
1240public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001241 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1242 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001243 HasAlignMac68kSupport = true;
Nick Lewycky9bddf432011-12-21 04:25:47 +00001244 SuitableAlign = 128;
Bill Schmidtdbaf4bc2012-10-29 14:59:24 +00001245 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1246 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Daniel Dunbar4c6a2262010-05-30 00:07:30 +00001247 }
1248};
1249} // end anonymous namespace.
1250
Reid Spencer5f016e22007-07-11 17:01:13 +00001251namespace {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001252 static const unsigned NVPTXAddrSpaceMap[] = {
1253 1, // opencl_global
1254 3, // opencl_local
1255 4, // opencl_constant
1256 1, // cuda_device
1257 4, // cuda_constant
1258 3, // cuda_shared
1259 };
1260 class NVPTXTargetInfo : public TargetInfo {
1261 static const char * const GCCRegNames[];
Justin Holewinski2c585b92012-05-24 17:43:12 +00001262 static const Builtin::Info BuiltinInfo[];
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001263 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001264 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001265 BigEndian = false;
1266 TLSSupported = false;
1267 LongWidth = LongAlign = 64;
1268 AddrSpaceMap = &NVPTXAddrSpaceMap;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001269 // Define available target features
1270 // These must be defined in sorted order!
Justin Holewinski9903e942012-07-11 15:34:55 +00001271 NoAsmVariants = true;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001272 }
1273 virtual void getTargetDefines(const LangOptions &Opts,
1274 MacroBuilder &Builder) const {
1275 Builder.defineMacro("__PTX__");
Justin Holewinski2c585b92012-05-24 17:43:12 +00001276 Builder.defineMacro("__NVPTX__");
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001277 }
1278 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1279 unsigned &NumRecords) const {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001280 Records = BuiltinInfo;
1281 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001282 }
1283 virtual bool hasFeature(StringRef Feature) const {
Justin Holewinski2c585b92012-05-24 17:43:12 +00001284 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001285 }
1286
1287 virtual void getGCCRegNames(const char * const *&Names,
1288 unsigned &NumNames) const;
1289 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1290 unsigned &NumAliases) const {
1291 // No aliases.
1292 Aliases = 0;
1293 NumAliases = 0;
1294 }
1295 virtual bool validateAsmConstraint(const char *&Name,
Justin Holewinski0ac428e2013-06-21 18:51:24 +00001296 TargetInfo::ConstraintInfo &Info) const {
1297 switch (*Name) {
1298 default: return false;
1299 case 'c':
1300 case 'h':
1301 case 'r':
1302 case 'l':
1303 case 'f':
1304 case 'd':
1305 Info.setAllowsRegister();
1306 return true;
1307 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001308 }
1309 virtual const char *getClobbers() const {
1310 // FIXME: Is this really right?
1311 return "";
1312 }
Meador Ingec5613b22012-06-16 03:34:49 +00001313 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001314 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00001315 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001316 }
1317 virtual bool setCPU(const std::string &Name) {
Justin Holewinskiaffa3af2013-03-30 14:38:26 +00001318 bool Valid = llvm::StringSwitch<bool>(Name)
1319 .Case("sm_20", true)
1320 .Case("sm_21", true)
1321 .Case("sm_30", true)
1322 .Case("sm_35", true)
1323 .Default(false);
1324
1325 return Valid;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001326 }
Justin Holewinski2c585b92012-05-24 17:43:12 +00001327 };
1328
1329 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1330#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1331#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1332 ALL_LANGUAGES },
1333#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001334 };
1335
1336 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1337 "r0"
1338 };
1339
1340 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1341 unsigned &NumNames) const {
1342 Names = GCCRegNames;
1343 NumNames = llvm::array_lengthof(GCCRegNames);
1344 }
1345
1346 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1347 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001348 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001349 PointerWidth = PointerAlign = 32;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001350 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001351 DescriptionString
1352 = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1353 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1354 "n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001355 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001356 };
1357
1358 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1359 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001360 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001361 PointerWidth = PointerAlign = 64;
Justin Holewinski2c585b92012-05-24 17:43:12 +00001362 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001363 DescriptionString
1364 = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1365 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1366 "n16:32:64";
Justin Holewinski2c585b92012-05-24 17:43:12 +00001367 }
Peter Collingbourneedb66f32012-05-20 23:28:41 +00001368 };
1369}
1370
1371namespace {
Eli Friedman6505a292012-10-12 23:32:00 +00001372
1373static const unsigned R600AddrSpaceMap[] = {
1374 1, // opencl_global
1375 3, // opencl_local
1376 2, // opencl_constant
1377 1, // cuda_device
1378 2, // cuda_constant
1379 3 // cuda_shared
1380};
1381
Tom Stellardfd075912013-03-04 17:40:53 +00001382static const char *DescriptionStringR600 =
1383 "e"
1384 "-p:32:32:32"
1385 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32"
1386 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1387 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1388 "-n32:64";
1389
1390static const char *DescriptionStringR600DoubleOps =
1391 "e"
1392 "-p:32:32:32"
1393 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64"
1394 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1395 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1396 "-n32:64";
1397
1398static const char *DescriptionStringSI =
1399 "e"
1400 "-p:64:64:64"
Tom Stellard9a3d2bd2013-08-27 00:55:26 +00001401 "-p3:32:32:32"
Tom Stellardfd075912013-03-04 17:40:53 +00001402 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64"
1403 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1404 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1405 "-n32:64";
1406
Eli Friedman6505a292012-10-12 23:32:00 +00001407class R600TargetInfo : public TargetInfo {
Tom Stellardfd075912013-03-04 17:40:53 +00001408 /// \brief The GPU profiles supported by the R600 target.
1409 enum GPUKind {
1410 GK_NONE,
1411 GK_R600,
1412 GK_R600_DOUBLE_OPS,
1413 GK_R700,
1414 GK_R700_DOUBLE_OPS,
1415 GK_EVERGREEN,
1416 GK_EVERGREEN_DOUBLE_OPS,
1417 GK_NORTHERN_ISLANDS,
1418 GK_CAYMAN,
1419 GK_SOUTHERN_ISLANDS
1420 } GPU;
1421
Eli Friedman6505a292012-10-12 23:32:00 +00001422public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001423 R600TargetInfo(const llvm::Triple &Triple)
1424 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardfd075912013-03-04 17:40:53 +00001425 DescriptionString = DescriptionStringR600;
Eli Friedman6505a292012-10-12 23:32:00 +00001426 AddrSpaceMap = &R600AddrSpaceMap;
1427 }
1428
1429 virtual const char * getClobbers() const {
1430 return "";
1431 }
1432
1433 virtual void getGCCRegNames(const char * const *&Names,
1434 unsigned &numNames) const {
1435 Names = NULL;
1436 numNames = 0;
1437 }
1438
1439 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1440 unsigned &NumAliases) const {
1441 Aliases = NULL;
1442 NumAliases = 0;
1443 }
1444
1445 virtual bool validateAsmConstraint(const char *&Name,
1446 TargetInfo::ConstraintInfo &info) const {
1447 return true;
1448 }
1449
1450 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1451 unsigned &NumRecords) const {
1452 Records = NULL;
1453 NumRecords = 0;
1454 }
1455
1456
1457 virtual void getTargetDefines(const LangOptions &Opts,
1458 MacroBuilder &Builder) const {
1459 Builder.defineMacro("__R600__");
1460 }
1461
1462 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1463 return TargetInfo::CharPtrBuiltinVaList;
1464 }
1465
Tom Stellardfd075912013-03-04 17:40:53 +00001466 virtual bool setCPU(const std::string &Name) {
1467 GPU = llvm::StringSwitch<GPUKind>(Name)
1468 .Case("r600" , GK_R600)
1469 .Case("rv610", GK_R600)
1470 .Case("rv620", GK_R600)
1471 .Case("rv630", GK_R600)
1472 .Case("rv635", GK_R600)
1473 .Case("rs780", GK_R600)
1474 .Case("rs880", GK_R600)
1475 .Case("rv670", GK_R600_DOUBLE_OPS)
1476 .Case("rv710", GK_R700)
1477 .Case("rv730", GK_R700)
1478 .Case("rv740", GK_R700_DOUBLE_OPS)
1479 .Case("rv770", GK_R700_DOUBLE_OPS)
1480 .Case("palm", GK_EVERGREEN)
1481 .Case("cedar", GK_EVERGREEN)
1482 .Case("sumo", GK_EVERGREEN)
1483 .Case("sumo2", GK_EVERGREEN)
1484 .Case("redwood", GK_EVERGREEN)
1485 .Case("juniper", GK_EVERGREEN)
1486 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1487 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1488 .Case("barts", GK_NORTHERN_ISLANDS)
1489 .Case("turks", GK_NORTHERN_ISLANDS)
1490 .Case("caicos", GK_NORTHERN_ISLANDS)
1491 .Case("cayman", GK_CAYMAN)
1492 .Case("aruba", GK_CAYMAN)
Tom Stellard3b848ec2013-04-01 20:56:49 +00001493 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardfd075912013-03-04 17:40:53 +00001494 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1495 .Case("verde", GK_SOUTHERN_ISLANDS)
1496 .Case("oland", GK_SOUTHERN_ISLANDS)
1497 .Default(GK_NONE);
1498
1499 if (GPU == GK_NONE) {
1500 return false;
1501 }
1502
1503 // Set the correct data layout
1504 switch (GPU) {
1505 case GK_NONE:
1506 case GK_R600:
1507 case GK_R700:
1508 case GK_EVERGREEN:
1509 case GK_NORTHERN_ISLANDS:
1510 DescriptionString = DescriptionStringR600;
1511 break;
1512 case GK_R600_DOUBLE_OPS:
1513 case GK_R700_DOUBLE_OPS:
1514 case GK_EVERGREEN_DOUBLE_OPS:
1515 case GK_CAYMAN:
1516 DescriptionString = DescriptionStringR600DoubleOps;
1517 break;
1518 case GK_SOUTHERN_ISLANDS:
1519 DescriptionString = DescriptionStringSI;
1520 break;
1521 }
1522
1523 return true;
1524 }
Eli Friedman6505a292012-10-12 23:32:00 +00001525};
1526
1527} // end anonymous namespace
1528
1529namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00001530// Namespace for x86 abstract base class
1531const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001532#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001533#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001534 ALL_LANGUAGES },
Chris Lattner6b15cdc2009-06-14 01:05:48 +00001535#include "clang/Basic/BuiltinsX86.def"
Eli Friedman618234a2008-08-20 02:34:37 +00001536};
Eli Friedman61538a72008-05-20 14:21:01 +00001537
Nuno Lopes2550d702009-12-23 17:49:57 +00001538static const char* const GCCRegNames[] = {
Eli Friedman618234a2008-08-20 02:34:37 +00001539 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1540 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001541 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman618234a2008-08-20 02:34:37 +00001542 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1543 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1544 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001545 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopherc5f9a012011-12-02 02:12:16 +00001546 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1547 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman618234a2008-08-20 02:34:37 +00001548};
1549
Eric Christophercfd323d2011-06-21 00:05:20 +00001550const TargetInfo::AddlRegName AddlRegNames[] = {
1551 { { "al", "ah", "eax", "rax" }, 0 },
1552 { { "bl", "bh", "ebx", "rbx" }, 3 },
1553 { { "cl", "ch", "ecx", "rcx" }, 2 },
1554 { { "dl", "dh", "edx", "rdx" }, 1 },
1555 { { "esi", "rsi" }, 4 },
1556 { { "edi", "rdi" }, 5 },
1557 { { "esp", "rsp" }, 7 },
1558 { { "ebp", "rbp" }, 6 },
Eli Friedman618234a2008-08-20 02:34:37 +00001559};
1560
1561// X86 target abstract base class; x86-32 and x86-64 are very close, so
1562// most of the implementation can be shared.
1563class X86TargetInfo : public TargetInfo {
Chris Lattner84f0ea82009-03-02 22:40:39 +00001564 enum X86SSEEnum {
Craig Topperb7a95d22013-08-21 03:59:22 +00001565 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner84f0ea82009-03-02 22:40:39 +00001566 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001567 enum MMX3DNowEnum {
1568 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1569 } MMX3DNowLevel;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00001570 enum XOPEnum {
1571 NoXOP,
1572 SSE4A,
1573 FMA4,
1574 XOP
1575 } XOPLevel;
Anders Carlsson9b0fb622010-01-27 03:47:49 +00001576
Eric Christophereea12d12010-04-02 23:50:19 +00001577 bool HasAES;
Craig Topper3c0bc152012-05-31 05:18:48 +00001578 bool HasPCLMUL;
Craig Topper31ceea02011-12-25 05:06:45 +00001579 bool HasLZCNT;
Benjamin Kramer84f30802012-07-07 09:39:18 +00001580 bool HasRDRND;
Craig Topper31ceea02011-12-25 05:06:45 +00001581 bool HasBMI;
1582 bool HasBMI2;
Craig Toppere14e08b2011-12-29 16:10:46 +00001583 bool HasPOPCNT;
Michael Liao463eb892012-11-10 05:17:46 +00001584 bool HasRTM;
Michael Liao72339a02013-03-26 17:52:08 +00001585 bool HasPRFCHW;
Michael Liao1bfc28c2013-03-29 05:17:55 +00001586 bool HasRDSEED;
Craig Topper2ae95072012-06-03 21:46:30 +00001587 bool HasFMA;
Manman Ren146e5a42012-10-11 00:59:55 +00001588 bool HasF16C;
Craig Topperbca2c4f2013-08-21 05:29:10 +00001589 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Bruno Cardoso Lopes7377ed92010-08-04 22:29:13 +00001590
Chandler Carruth499d9722011-09-28 08:55:34 +00001591 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1592 ///
1593 /// Each enumeration represents a particular CPU supported by Clang. These
1594 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1595 enum CPUKind {
1596 CK_Generic,
1597
1598 /// \name i386
1599 /// i386-generation processors.
1600 //@{
1601 CK_i386,
1602 //@}
1603
1604 /// \name i486
1605 /// i486-generation processors.
1606 //@{
1607 CK_i486,
1608 CK_WinChipC6,
1609 CK_WinChip2,
1610 CK_C3,
1611 //@}
1612
1613 /// \name i586
1614 /// i586-generation processors, P5 microarchitecture based.
1615 //@{
1616 CK_i586,
1617 CK_Pentium,
1618 CK_PentiumMMX,
1619 //@}
1620
1621 /// \name i686
1622 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1623 //@{
1624 CK_i686,
1625 CK_PentiumPro,
1626 CK_Pentium2,
1627 CK_Pentium3,
1628 CK_Pentium3M,
1629 CK_PentiumM,
1630 CK_C3_2,
1631
1632 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1633 /// Clang however has some logic to suport this.
1634 // FIXME: Warn, deprecate, and potentially remove this.
1635 CK_Yonah,
1636 //@}
1637
1638 /// \name Netburst
Chandler Carruth83450aa2011-09-28 18:17:30 +00001639 /// Netburst microarchitecture based processors.
Chandler Carruth499d9722011-09-28 08:55:34 +00001640 //@{
1641 CK_Pentium4,
1642 CK_Pentium4M,
1643 CK_Prescott,
1644 CK_Nocona,
1645 //@}
1646
1647 /// \name Core
1648 /// Core microarchitecture based processors.
1649 //@{
1650 CK_Core2,
1651
1652 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1653 /// codename which GCC no longer accepts as an option to -march, but Clang
1654 /// has some logic for recognizing it.
1655 // FIXME: Warn, deprecate, and potentially remove this.
1656 CK_Penryn,
1657 //@}
1658
1659 /// \name Atom
1660 /// Atom processors
1661 //@{
1662 CK_Atom,
Benjamin Kramerb98ce372013-08-30 14:05:34 +00001663 CK_SLM,
Chandler Carruth499d9722011-09-28 08:55:34 +00001664 //@}
1665
1666 /// \name Nehalem
1667 /// Nehalem microarchitecture based processors.
1668 //@{
1669 CK_Corei7,
1670 CK_Corei7AVX,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001671 CK_CoreAVXi,
Craig Topper2b03bb02011-12-17 19:55:21 +00001672 CK_CoreAVX2,
Chandler Carruth499d9722011-09-28 08:55:34 +00001673 //@}
1674
Craig Topper10c2c682013-08-20 07:09:39 +00001675 /// \name Knights Landing
1676 /// Knights Landing processor.
1677 CK_KNL,
1678
Chandler Carruth499d9722011-09-28 08:55:34 +00001679 /// \name K6
1680 /// K6 architecture processors.
1681 //@{
1682 CK_K6,
1683 CK_K6_2,
1684 CK_K6_3,
1685 //@}
1686
1687 /// \name K7
1688 /// K7 architecture processors.
1689 //@{
1690 CK_Athlon,
1691 CK_AthlonThunderbird,
1692 CK_Athlon4,
1693 CK_AthlonXP,
1694 CK_AthlonMP,
1695 //@}
1696
1697 /// \name K8
1698 /// K8 architecture processors.
1699 //@{
1700 CK_Athlon64,
1701 CK_Athlon64SSE3,
1702 CK_AthlonFX,
1703 CK_K8,
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001704 CK_K8SSE3,
Chandler Carruth499d9722011-09-28 08:55:34 +00001705 CK_Opteron,
1706 CK_OpteronSSE3,
Roman Divacky01c770d2011-10-30 07:48:46 +00001707 CK_AMDFAM10,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001708 //@}
Chandler Carruth499d9722011-09-28 08:55:34 +00001709
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001710 /// \name Bobcat
1711 /// Bobcat architecture processors.
1712 //@{
1713 CK_BTVER1,
Benjamin Kramer63063f52013-05-03 10:47:15 +00001714 CK_BTVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001715 //@}
1716
1717 /// \name Bulldozer
1718 /// Bulldozer architecture processors.
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001719 //@{
1720 CK_BDVER1,
1721 CK_BDVER2,
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001722 //@}
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001723
Chandler Carruth499d9722011-09-28 08:55:34 +00001724 /// This specification is deprecated and will be removed in the future.
1725 /// Users should prefer \see CK_K8.
1726 // FIXME: Warn on this when the CPU is set to it.
1727 CK_x86_64,
1728 //@}
1729
1730 /// \name Geode
1731 /// Geode processors.
1732 //@{
1733 CK_Geode
1734 //@}
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001735 } CPU;
Chandler Carruth499d9722011-09-28 08:55:34 +00001736
Rafael Espindola5389b842013-08-21 21:59:03 +00001737 enum FPMathKind {
1738 FP_Default,
1739 FP_SSE,
1740 FP_387
1741 } FPMath;
1742
Eli Friedman618234a2008-08-20 02:34:37 +00001743public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00001744 X86TargetInfo(const llvm::Triple &Triple)
1745 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00001746 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1747 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
1748 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasFMA(false),
Craig Topperbca2c4f2013-08-21 05:29:10 +00001749 HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Rafael Espindola5389b842013-08-21 21:59:03 +00001750 HasAVX512PF(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00001751 BigEndian = false;
Eli Friedman618234a2008-08-20 02:34:37 +00001752 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Reid Spencer5f016e22007-07-11 17:01:13 +00001753 }
Benjamin Kramerb4066692011-12-28 15:47:06 +00001754 virtual unsigned getFloatEvalMethod() const {
1755 // X87 evaluates with 80 bits "long double" precision.
1756 return SSELevel == NoSSE ? 2 : 0;
1757 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001758 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1759 unsigned &NumRecords) const {
Eli Friedman618234a2008-08-20 02:34:37 +00001760 Records = BuiltinInfo;
1761 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Reid Spencer5f016e22007-07-11 17:01:13 +00001762 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001763 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman618234a2008-08-20 02:34:37 +00001764 unsigned &NumNames) const {
1765 Names = GCCRegNames;
1766 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson3346ae62007-11-24 23:38:12 +00001767 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00001768 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +00001769 unsigned &NumAliases) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001770 Aliases = 0;
1771 NumAliases = 0;
1772 }
1773 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
Eric Christopher825d3862012-11-14 22:08:59 +00001774 unsigned &NumNames) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001775 Names = AddlRegNames;
1776 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +00001777 }
Anders Carlsson066d2ea2009-02-28 17:11:49 +00001778 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman618234a2008-08-20 02:34:37 +00001779 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings002333f2011-06-07 23:45:05 +00001780 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssond04c6e22007-11-27 04:11:28 +00001781 virtual const char *getClobbers() const {
Eli Friedman618234a2008-08-20 02:34:37 +00001782 return "~{dirflag},~{fpsr},~{flags}";
1783 }
Chris Lattner33328642009-03-20 15:52:06 +00001784 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00001785 MacroBuilder &Builder) const;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00001786 void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1787 bool Enabled) const;
1788 void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1789 bool Enabled) const;
1790 void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1791 bool Enabled) const;
Rafael Espindolaade7cd42013-08-20 15:30:32 +00001792 virtual void setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00001793 StringRef Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00001794 bool Enabled) const;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001795 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregore727d212012-01-30 06:38:25 +00001796 virtual bool hasFeature(StringRef Feature) const;
Rafael Espindola5389b842013-08-21 21:59:03 +00001797 virtual bool HandleTargetFeatures(std::vector<std::string> &Features,
1798 DiagnosticsEngine &Diags);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001799 virtual const char* getABI() const {
Derek Schuffbabaf312012-10-11 15:52:22 +00001800 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001801 return "avx";
Derek Schuffbabaf312012-10-11 15:52:22 +00001802 else if (getTriple().getArch() == llvm::Triple::x86 &&
1803 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanee1ad992011-12-02 00:11:43 +00001804 return "no-mmx";
1805 return "";
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001806 }
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001807 virtual bool setCPU(const std::string &Name) {
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001808 CPU = llvm::StringSwitch<CPUKind>(Name)
1809 .Case("i386", CK_i386)
1810 .Case("i486", CK_i486)
1811 .Case("winchip-c6", CK_WinChipC6)
1812 .Case("winchip2", CK_WinChip2)
1813 .Case("c3", CK_C3)
1814 .Case("i586", CK_i586)
1815 .Case("pentium", CK_Pentium)
1816 .Case("pentium-mmx", CK_PentiumMMX)
1817 .Case("i686", CK_i686)
1818 .Case("pentiumpro", CK_PentiumPro)
1819 .Case("pentium2", CK_Pentium2)
1820 .Case("pentium3", CK_Pentium3)
1821 .Case("pentium3m", CK_Pentium3M)
1822 .Case("pentium-m", CK_PentiumM)
1823 .Case("c3-2", CK_C3_2)
1824 .Case("yonah", CK_Yonah)
1825 .Case("pentium4", CK_Pentium4)
1826 .Case("pentium4m", CK_Pentium4M)
1827 .Case("prescott", CK_Prescott)
1828 .Case("nocona", CK_Nocona)
1829 .Case("core2", CK_Core2)
1830 .Case("penryn", CK_Penryn)
1831 .Case("atom", CK_Atom)
Benjamin Kramerb98ce372013-08-30 14:05:34 +00001832 .Case("slm", CK_SLM)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001833 .Case("corei7", CK_Corei7)
1834 .Case("corei7-avx", CK_Corei7AVX)
1835 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper2b03bb02011-12-17 19:55:21 +00001836 .Case("core-avx2", CK_CoreAVX2)
Craig Topper10c2c682013-08-20 07:09:39 +00001837 .Case("knl", CK_KNL)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001838 .Case("k6", CK_K6)
1839 .Case("k6-2", CK_K6_2)
1840 .Case("k6-3", CK_K6_3)
1841 .Case("athlon", CK_Athlon)
1842 .Case("athlon-tbird", CK_AthlonThunderbird)
1843 .Case("athlon-4", CK_Athlon4)
1844 .Case("athlon-xp", CK_AthlonXP)
1845 .Case("athlon-mp", CK_AthlonMP)
1846 .Case("athlon64", CK_Athlon64)
1847 .Case("athlon64-sse3", CK_Athlon64SSE3)
1848 .Case("athlon-fx", CK_AthlonFX)
1849 .Case("k8", CK_K8)
1850 .Case("k8-sse3", CK_K8SSE3)
1851 .Case("opteron", CK_Opteron)
1852 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky01c770d2011-10-30 07:48:46 +00001853 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001854 .Case("btver1", CK_BTVER1)
Benjamin Kramer63063f52013-05-03 10:47:15 +00001855 .Case("btver2", CK_BTVER2)
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001856 .Case("bdver1", CK_BDVER1)
1857 .Case("bdver2", CK_BDVER2)
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001858 .Case("x86-64", CK_x86_64)
1859 .Case("geode", CK_Geode)
1860 .Default(CK_Generic);
1861
Chandler Carruth26a39142011-09-28 09:45:08 +00001862 // Perform any per-CPU checks necessary to determine if this CPU is
1863 // acceptable.
1864 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1865 // invalid without explaining *why*.
1866 switch (CPU) {
1867 case CK_Generic:
1868 // No processor selected!
1869 return false;
1870
1871 case CK_i386:
1872 case CK_i486:
1873 case CK_WinChipC6:
1874 case CK_WinChip2:
1875 case CK_C3:
1876 case CK_i586:
1877 case CK_Pentium:
1878 case CK_PentiumMMX:
1879 case CK_i686:
1880 case CK_PentiumPro:
1881 case CK_Pentium2:
1882 case CK_Pentium3:
1883 case CK_Pentium3M:
1884 case CK_PentiumM:
1885 case CK_Yonah:
1886 case CK_C3_2:
1887 case CK_Pentium4:
1888 case CK_Pentium4M:
1889 case CK_Prescott:
1890 case CK_K6:
1891 case CK_K6_2:
1892 case CK_K6_3:
1893 case CK_Athlon:
1894 case CK_AthlonThunderbird:
1895 case CK_Athlon4:
1896 case CK_AthlonXP:
1897 case CK_AthlonMP:
1898 case CK_Geode:
1899 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffbabaf312012-10-11 15:52:22 +00001900 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth26a39142011-09-28 09:45:08 +00001901 return false;
1902
1903 // Fallthrough
1904 case CK_Nocona:
1905 case CK_Core2:
1906 case CK_Penryn:
1907 case CK_Atom:
Benjamin Kramerb98ce372013-08-30 14:05:34 +00001908 case CK_SLM:
Chandler Carruth26a39142011-09-28 09:45:08 +00001909 case CK_Corei7:
1910 case CK_Corei7AVX:
1911 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00001912 case CK_CoreAVX2:
Craig Topper10c2c682013-08-20 07:09:39 +00001913 case CK_KNL:
Chandler Carruth26a39142011-09-28 09:45:08 +00001914 case CK_Athlon64:
1915 case CK_Athlon64SSE3:
1916 case CK_AthlonFX:
1917 case CK_K8:
1918 case CK_K8SSE3:
1919 case CK_Opteron:
1920 case CK_OpteronSSE3:
Roman Divacky01c770d2011-10-30 07:48:46 +00001921 case CK_AMDFAM10:
Benjamin Kramer5660aa62012-01-10 11:50:18 +00001922 case CK_BTVER1:
Benjamin Kramer63063f52013-05-03 10:47:15 +00001923 case CK_BTVER2:
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00001924 case CK_BDVER1:
1925 case CK_BDVER2:
Chandler Carruth26a39142011-09-28 09:45:08 +00001926 case CK_x86_64:
1927 return true;
1928 }
Chandler Carruth5b7803d2011-09-28 10:49:06 +00001929 llvm_unreachable("Unhandled CPU kind");
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00001930 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00001931
Rafael Espindola5389b842013-08-21 21:59:03 +00001932 virtual bool setFPMath(StringRef Name);
1933
Aaron Ballman82bfa192012-10-02 14:26:08 +00001934 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
1935 // We accept all non-ARM calling conventions
1936 return (CC == CC_X86ThisCall ||
1937 CC == CC_X86FastCall ||
Peter Collingbourne7728cdd2013-02-23 00:06:18 +00001938 CC == CC_X86StdCall ||
1939 CC == CC_C ||
Guy Benyei38980082012-12-25 08:53:55 +00001940 CC == CC_X86Pascal ||
1941 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00001942 }
1943
Aaron Ballmanfff32482012-12-09 17:45:41 +00001944 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
1945 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00001946 }
Reid Spencer5f016e22007-07-11 17:01:13 +00001947};
Chris Lattner3daed522009-03-02 22:20:04 +00001948
Rafael Espindola5389b842013-08-21 21:59:03 +00001949bool X86TargetInfo::setFPMath(StringRef Name) {
1950 if (Name == "387") {
1951 FPMath = FP_387;
1952 return true;
1953 }
1954 if (Name == "sse") {
1955 FPMath = FP_SSE;
1956 return true;
1957 }
1958 return false;
1959}
1960
Chandler Carruthc3a2e652011-09-28 05:56:05 +00001961void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001962 // FIXME: This *really* should not be here.
1963
1964 // X86_64 always has SSE2.
Derek Schuffbabaf312012-10-11 15:52:22 +00001965 if (getTriple().getArch() == llvm::Triple::x86_64)
Eli Friedman612db2a2012-11-17 01:16:19 +00001966 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00001967
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001968 switch (CPU) {
1969 case CK_Generic:
1970 case CK_i386:
1971 case CK_i486:
1972 case CK_i586:
1973 case CK_Pentium:
1974 case CK_i686:
1975 case CK_PentiumPro:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001976 break;
1977 case CK_PentiumMMX:
1978 case CK_Pentium2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001979 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001980 break;
1981 case CK_Pentium3:
1982 case CK_Pentium3M:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001983 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001984 break;
1985 case CK_PentiumM:
1986 case CK_Pentium4:
1987 case CK_Pentium4M:
1988 case CK_x86_64:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001989 setFeatureEnabled(Features, "sse2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001990 break;
1991 case CK_Yonah:
1992 case CK_Prescott:
1993 case CK_Nocona:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001994 setFeatureEnabled(Features, "sse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001995 break;
1996 case CK_Core2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00001997 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00001998 break;
1999 case CK_Penryn:
Benjamin Kramerb3453a82012-01-04 14:36:57 +00002000 setFeatureEnabled(Features, "sse4.1", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002001 break;
2002 case CK_Atom:
Chandler Carruth49defe62011-09-28 10:36:46 +00002003 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002004 break;
2005 case CK_Corei7:
Benjamin Kramerb98ce372013-08-30 14:05:34 +00002006 case CK_SLM:
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002007 setFeatureEnabled(Features, "sse4.2", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002008 break;
2009 case CK_Corei7AVX:
Benjamin Kramer84f30802012-07-07 09:39:18 +00002010 setFeatureEnabled(Features, "avx", true);
2011 setFeatureEnabled(Features, "aes", true);
2012 setFeatureEnabled(Features, "pclmul", true);
2013 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002014 case CK_CoreAVXi:
Craig Topperfd936302012-04-26 07:31:30 +00002015 setFeatureEnabled(Features, "avx", true);
Roman Divackybcaa3b82011-04-05 20:32:44 +00002016 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00002017 setFeatureEnabled(Features, "pclmul", true);
Benjamin Kramer84f30802012-07-07 09:39:18 +00002018 setFeatureEnabled(Features, "rdrnd", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002019 setFeatureEnabled(Features, "f16c", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002020 break;
Craig Topper2b03bb02011-12-17 19:55:21 +00002021 case CK_CoreAVX2:
Craig Topperfd936302012-04-26 07:31:30 +00002022 setFeatureEnabled(Features, "avx2", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00002023 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00002024 setFeatureEnabled(Features, "pclmul", true);
Craig Topper31ceea02011-12-25 05:06:45 +00002025 setFeatureEnabled(Features, "lzcnt", true);
Benjamin Kramer84f30802012-07-07 09:39:18 +00002026 setFeatureEnabled(Features, "rdrnd", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002027 setFeatureEnabled(Features, "f16c", true);
Craig Topper31ceea02011-12-25 05:06:45 +00002028 setFeatureEnabled(Features, "bmi", true);
2029 setFeatureEnabled(Features, "bmi2", true);
Michael Liao463eb892012-11-10 05:17:46 +00002030 setFeatureEnabled(Features, "rtm", true);
Craig Topper2ae95072012-06-03 21:46:30 +00002031 setFeatureEnabled(Features, "fma", true);
Craig Topper2b03bb02011-12-17 19:55:21 +00002032 break;
Craig Topper10c2c682013-08-20 07:09:39 +00002033 case CK_KNL:
Craig Topperbca2c4f2013-08-21 05:29:10 +00002034 setFeatureEnabled(Features, "avx512f", true);
2035 setFeatureEnabled(Features, "avx512cd", true);
2036 setFeatureEnabled(Features, "avx512er", true);
2037 setFeatureEnabled(Features, "avx512pf", true);
Craig Topper10c2c682013-08-20 07:09:39 +00002038 setFeatureEnabled(Features, "aes", true);
2039 setFeatureEnabled(Features, "pclmul", true);
2040 setFeatureEnabled(Features, "lzcnt", true);
2041 setFeatureEnabled(Features, "rdrnd", true);
2042 setFeatureEnabled(Features, "f16c", true);
2043 setFeatureEnabled(Features, "bmi", true);
2044 setFeatureEnabled(Features, "bmi2", true);
2045 setFeatureEnabled(Features, "rtm", true);
2046 setFeatureEnabled(Features, "fma", true);
2047 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002048 case CK_K6:
2049 case CK_WinChipC6:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002050 setFeatureEnabled(Features, "mmx", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002051 break;
2052 case CK_K6_2:
2053 case CK_K6_3:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002054 case CK_WinChip2:
2055 case CK_C3:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002056 setFeatureEnabled(Features, "3dnow", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002057 break;
Chandler Carruth49defe62011-09-28 10:36:46 +00002058 case CK_Athlon:
2059 case CK_AthlonThunderbird:
2060 case CK_Geode:
2061 setFeatureEnabled(Features, "3dnowa", true);
2062 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002063 case CK_Athlon4:
2064 case CK_AthlonXP:
2065 case CK_AthlonMP:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002066 setFeatureEnabled(Features, "sse", true);
2067 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002068 break;
2069 case CK_K8:
2070 case CK_Opteron:
2071 case CK_Athlon64:
2072 case CK_AthlonFX:
Mike Stump1eb44332009-09-09 15:08:12 +00002073 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002074 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002075 break;
2076 case CK_K8SSE3:
2077 case CK_OpteronSSE3:
2078 case CK_Athlon64SSE3:
Roman Divacky80b32b82011-10-30 13:47:56 +00002079 setFeatureEnabled(Features, "sse3", true);
2080 setFeatureEnabled(Features, "3dnowa", true);
2081 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00002082 case CK_AMDFAM10:
Roman Divackyc8b09a12010-12-29 13:28:29 +00002083 setFeatureEnabled(Features, "sse3", true);
Roman Divacky80b32b82011-10-30 13:47:56 +00002084 setFeatureEnabled(Features, "sse4a", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00002085 setFeatureEnabled(Features, "3dnowa", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002086 setFeatureEnabled(Features, "lzcnt", true);
2087 setFeatureEnabled(Features, "popcnt", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002088 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002089 case CK_BTVER1:
2090 setFeatureEnabled(Features, "ssse3", true);
2091 setFeatureEnabled(Features, "sse4a", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002092 setFeatureEnabled(Features, "lzcnt", true);
2093 setFeatureEnabled(Features, "popcnt", true);
Craig Topper90ea0362012-05-30 05:54:54 +00002094 break;
Benjamin Kramer63063f52013-05-03 10:47:15 +00002095 case CK_BTVER2:
2096 setFeatureEnabled(Features, "avx", true);
2097 setFeatureEnabled(Features, "sse4a", true);
2098 setFeatureEnabled(Features, "lzcnt", true);
2099 setFeatureEnabled(Features, "aes", true);
2100 setFeatureEnabled(Features, "pclmul", true);
2101 setFeatureEnabled(Features, "bmi", true);
2102 setFeatureEnabled(Features, "f16c", true);
2103 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002104 case CK_BDVER1:
Craig Topperb6af69e2012-06-09 22:24:14 +00002105 setFeatureEnabled(Features, "xop", true);
Eli Friedmanfaf35382012-11-17 01:43:10 +00002106 setFeatureEnabled(Features, "lzcnt", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002107 setFeatureEnabled(Features, "aes", true);
Craig Topper3c0bc152012-05-31 05:18:48 +00002108 setFeatureEnabled(Features, "pclmul", true);
Eli Friedmanf5824992012-11-26 21:57:28 +00002109 break;
Eli Friedmanfaf35382012-11-17 01:43:10 +00002110 case CK_BDVER2:
2111 setFeatureEnabled(Features, "xop", true);
2112 setFeatureEnabled(Features, "lzcnt", true);
2113 setFeatureEnabled(Features, "aes", true);
2114 setFeatureEnabled(Features, "pclmul", true);
2115 setFeatureEnabled(Features, "bmi", true);
2116 setFeatureEnabled(Features, "fma", true);
2117 setFeatureEnabled(Features, "f16c", true);
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002118 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002119 case CK_C3_2:
Daniel Dunbar3ac79042009-05-06 21:56:32 +00002120 setFeatureEnabled(Features, "sse", true);
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002121 break;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002122 }
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002123}
2124
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002125void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
2126 X86SSEEnum Level, bool Enabled) const {
2127 if (Enabled) {
2128 switch (Level) {
Craig Topperb7a95d22013-08-21 03:59:22 +00002129 case AVX512F:
2130 Features["avx512f"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002131 case AVX2:
2132 Features["avx2"] = true;
2133 case AVX:
2134 Features["avx"] = true;
2135 case SSE42:
Craig Topper89a5e792013-09-10 06:55:47 +00002136 Features["sse4.2"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002137 case SSE41:
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002138 Features["sse4.1"] = true;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002139 case SSSE3:
2140 Features["ssse3"] = true;
2141 case SSE3:
2142 Features["sse3"] = true;
2143 case SSE2:
2144 Features["sse2"] = true;
2145 case SSE1:
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002146 Features["sse"] = true;
2147 case NoSSE:
2148 break;
2149 }
2150 return;
2151 }
2152
2153 switch (Level) {
2154 case NoSSE:
2155 case SSE1:
2156 Features["sse"] = false;
2157 case SSE2:
2158 Features["sse2"] = false;
2159 case SSE3:
2160 Features["sse3"] = false;
2161 setXOPLevel(Features, NoXOP, false);
2162 case SSSE3:
2163 Features["ssse3"] = false;
2164 case SSE41:
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002165 Features["sse4.1"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002166 case SSE42:
Craig Topper89a5e792013-09-10 06:55:47 +00002167 Features["sse4.2"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002168 case AVX:
2169 Features["fma"] = Features["avx"] = false;
Rafael Espindola29f26de2013-08-21 13:28:02 +00002170 setXOPLevel(Features, FMA4, false);
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002171 case AVX2:
2172 Features["avx2"] = false;
Craig Topperb7a95d22013-08-21 03:59:22 +00002173 case AVX512F:
Craig Topperbca2c4f2013-08-21 05:29:10 +00002174 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2175 Features["avx512pf"] = false;
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002176 }
2177}
2178
2179void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
2180 MMX3DNowEnum Level, bool Enabled) const {
2181 if (Enabled) {
2182 switch (Level) {
2183 case AMD3DNowAthlon:
2184 Features["3dnowa"] = true;
2185 case AMD3DNow:
2186 Features["3dnow"] = true;
2187 case MMX:
2188 Features["mmx"] = true;
2189 case NoMMX3DNow:
2190 break;
2191 }
2192 return;
2193 }
2194
2195 switch (Level) {
2196 case NoMMX3DNow:
2197 case MMX:
2198 Features["mmx"] = false;
2199 case AMD3DNow:
2200 Features["3dnow"] = false;
2201 case AMD3DNowAthlon:
2202 Features["3dnowa"] = false;
2203 }
2204}
2205
2206void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2207 bool Enabled) const {
2208 if (Enabled) {
2209 switch (Level) {
2210 case XOP:
2211 Features["xop"] = true;
2212 case FMA4:
2213 Features["fma4"] = true;
2214 setSSELevel(Features, AVX, true);
2215 case SSE4A:
2216 Features["sse4a"] = true;
2217 setSSELevel(Features, SSE3, true);
2218 case NoXOP:
2219 break;
2220 }
2221 return;
2222 }
2223
2224 switch (Level) {
2225 case NoXOP:
2226 case SSE4A:
2227 Features["sse4a"] = false;
2228 case FMA4:
2229 Features["fma4"] = false;
2230 case XOP:
2231 Features["xop"] = false;
2232 }
2233}
2234
Rafael Espindolaade7cd42013-08-20 15:30:32 +00002235void X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer713575a2012-03-05 15:10:44 +00002236 StringRef Name,
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002237 bool Enabled) const {
Eric Christopherd39ebe22010-03-04 02:26:37 +00002238 // FIXME: This *really* should not be here. We need some way of translating
2239 // options into llvm subtarget features.
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002240 if (Name == "sse4")
2241 Name = "sse4.2";
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002242
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002243 Features[Name] = Enabled;
Rafael Espindola53ac3d82011-11-27 20:00:43 +00002244
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002245 if (Name == "mmx")
2246 setMMXLevel(Features, MMX, Enabled);
2247 else if (Name == "sse")
2248 setSSELevel(Features, SSE1, Enabled);
2249 else if (Name == "sse2")
2250 setSSELevel(Features, SSE2, Enabled);
2251 else if (Name == "sse3")
2252 setSSELevel(Features, SSE3, Enabled);
2253 else if (Name == "ssse3")
2254 setSSELevel(Features, SSSE3, Enabled);
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002255 else if (Name == "sse4.2")
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002256 setSSELevel(Features, SSE42, Enabled);
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002257 else if (Name == "sse4.1")
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002258 setSSELevel(Features, SSE41, Enabled);
2259 else if (Name == "3dnow")
2260 setMMXLevel(Features, AMD3DNow, Enabled);
2261 else if (Name == "3dnowa")
2262 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
2263 else if (Name == "aes") {
2264 if (Enabled)
2265 setSSELevel(Features, SSE2, Enabled);
2266 } else if (Name == "pclmul") {
2267 if (Enabled)
2268 setSSELevel(Features, SSE2, Enabled);
2269 } else if (Name == "avx")
2270 setSSELevel(Features, AVX, Enabled);
2271 else if (Name == "avx2")
2272 setSSELevel(Features, AVX2, Enabled);
Craig Topperbca2c4f2013-08-21 05:29:10 +00002273 else if (Name == "avx512f")
Craig Topperb7a95d22013-08-21 03:59:22 +00002274 setSSELevel(Features, AVX512F, Enabled);
Craig Topperbca2c4f2013-08-21 05:29:10 +00002275 else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
2276 if (Enabled)
2277 setSSELevel(Features, AVX512F, Enabled);
2278 } else if (Name == "fma") {
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002279 if (Enabled)
2280 setSSELevel(Features, AVX, Enabled);
2281 } else if (Name == "fma4") {
2282 setXOPLevel(Features, FMA4, Enabled);
2283 } else if (Name == "xop") {
2284 setXOPLevel(Features, XOP, Enabled);
2285 } else if (Name == "sse4a") {
2286 setXOPLevel(Features, SSE4A, Enabled);
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002287 }
Daniel Dunbar17ca3632009-05-06 21:07:50 +00002288}
2289
Daniel Dunbar868bd0a2009-05-06 03:16:41 +00002290/// HandleTargetOptions - Perform initialization based on the user
2291/// configured set of features.
Rafael Espindola5389b842013-08-21 21:59:03 +00002292bool X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features,
2293 DiagnosticsEngine &Diags) {
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002294 // Remember the maximum enabled sselevel.
2295 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2296 // Ignore disabled features.
2297 if (Features[i][0] == '-')
2298 continue;
2299
Benjamin Kramer713575a2012-03-05 15:10:44 +00002300 StringRef Feature = StringRef(Features[i]).substr(1);
2301
2302 if (Feature == "aes") {
Eric Christophereea12d12010-04-02 23:50:19 +00002303 HasAES = true;
2304 continue;
2305 }
2306
Craig Topper3c0bc152012-05-31 05:18:48 +00002307 if (Feature == "pclmul") {
2308 HasPCLMUL = true;
2309 continue;
2310 }
2311
Benjamin Kramer713575a2012-03-05 15:10:44 +00002312 if (Feature == "lzcnt") {
Craig Topper31ceea02011-12-25 05:06:45 +00002313 HasLZCNT = true;
2314 continue;
2315 }
2316
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002317 if (Feature == "rdrnd") {
Benjamin Kramer84f30802012-07-07 09:39:18 +00002318 HasRDRND = true;
2319 continue;
2320 }
2321
Benjamin Kramer713575a2012-03-05 15:10:44 +00002322 if (Feature == "bmi") {
Craig Topper31ceea02011-12-25 05:06:45 +00002323 HasBMI = true;
2324 continue;
2325 }
2326
Benjamin Kramer713575a2012-03-05 15:10:44 +00002327 if (Feature == "bmi2") {
Craig Topper31ceea02011-12-25 05:06:45 +00002328 HasBMI2 = true;
2329 continue;
2330 }
2331
Benjamin Kramer713575a2012-03-05 15:10:44 +00002332 if (Feature == "popcnt") {
Craig Toppere14e08b2011-12-29 16:10:46 +00002333 HasPOPCNT = true;
2334 continue;
2335 }
2336
Michael Liao463eb892012-11-10 05:17:46 +00002337 if (Feature == "rtm") {
2338 HasRTM = true;
2339 continue;
2340 }
2341
Michael Liao72339a02013-03-26 17:52:08 +00002342 if (Feature == "prfchw") {
2343 HasPRFCHW = true;
2344 continue;
2345 }
2346
Michael Liao1bfc28c2013-03-29 05:17:55 +00002347 if (Feature == "rdseed") {
2348 HasRDSEED = true;
2349 continue;
2350 }
2351
Craig Topper2ae95072012-06-03 21:46:30 +00002352 if (Feature == "fma") {
2353 HasFMA = true;
2354 continue;
2355 }
2356
Manman Ren146e5a42012-10-11 00:59:55 +00002357 if (Feature == "f16c") {
2358 HasF16C = true;
2359 continue;
2360 }
2361
Craig Topperbca2c4f2013-08-21 05:29:10 +00002362 if (Feature == "avx512cd") {
2363 HasAVX512CD = true;
2364 continue;
2365 }
2366
2367 if (Feature == "avx512er") {
2368 HasAVX512ER = true;
2369 continue;
2370 }
2371
2372 if (Feature == "avx512pf") {
2373 HasAVX512PF = true;
2374 continue;
2375 }
2376
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002377 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer713575a2012-03-05 15:10:44 +00002378 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topperbca2c4f2013-08-21 05:29:10 +00002379 .Case("avx512f", AVX512F)
Craig Topper05fe4b52012-01-09 09:19:09 +00002380 .Case("avx2", AVX2)
2381 .Case("avx", AVX)
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002382 .Case("sse4.2", SSE42)
2383 .Case("sse4.1", SSE41)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002384 .Case("ssse3", SSSE3)
Nuno Lopes33d3bca2010-03-12 10:20:09 +00002385 .Case("sse3", SSE3)
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002386 .Case("sse2", SSE2)
2387 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002388 .Default(NoSSE);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002389 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer20249a12010-10-21 03:16:25 +00002390
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002391 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer713575a2012-03-05 15:10:44 +00002392 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002393 .Case("3dnowa", AMD3DNowAthlon)
2394 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002395 .Case("mmx", MMX)
2396 .Default(NoMMX3DNow);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002397 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002398
2399 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2400 .Case("xop", XOP)
2401 .Case("fma4", FMA4)
2402 .Case("sse4a", SSE4A)
2403 .Default(NoXOP);
2404 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar29a790b2009-11-11 09:38:56 +00002405 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002406
Craig Topper89a5e792013-09-10 06:55:47 +00002407 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2408 // Can't do this earlier because we need to be able to explicitly enable
2409 // popcnt and still disable sse4.2.
2410 if (!HasPOPCNT && SSELevel >= SSE42 &&
2411 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2412 HasPOPCNT = true;
2413 Features.push_back("+popcnt");
2414 }
2415
Rafael Espindola5389b842013-08-21 21:59:03 +00002416 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2417 // matches the selected sse level.
2418 if (FPMath == FP_SSE && SSELevel < SSE1) {
2419 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2420 return false;
2421 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2422 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2423 return false;
2424 }
2425
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002426 // Don't tell the backend if we're turning off mmx; it will end up disabling
2427 // SSE, which we don't want.
Craig Topper56bed972013-09-11 06:48:53 +00002428 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2429 // then enable MMX.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002430 std::vector<std::string>::iterator it;
2431 it = std::find(Features.begin(), Features.end(), "-mmx");
2432 if (it != Features.end())
2433 Features.erase(it);
Craig Topper56bed972013-09-11 06:48:53 +00002434 else if (SSELevel > NoSSE)
2435 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindola5389b842013-08-21 21:59:03 +00002436 return true;
Chris Lattner3daed522009-03-02 22:20:04 +00002437}
Chris Lattnerc0f59212009-03-02 22:27:17 +00002438
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002439/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2440/// definitions for this particular subtarget.
Chris Lattner33328642009-03-20 15:52:06 +00002441void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002442 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00002443 // Target identification.
Derek Schuffbabaf312012-10-11 15:52:22 +00002444 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramera9992772010-01-09 17:55:51 +00002445 Builder.defineMacro("__amd64__");
2446 Builder.defineMacro("__amd64");
2447 Builder.defineMacro("__x86_64");
2448 Builder.defineMacro("__x86_64__");
Chris Lattnerc0f59212009-03-02 22:27:17 +00002449 } else {
Benjamin Kramera9992772010-01-09 17:55:51 +00002450 DefineStd(Builder, "i386", Opts);
Chris Lattnerc0f59212009-03-02 22:27:17 +00002451 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002452
Chris Lattnerc0f59212009-03-02 22:27:17 +00002453 // Subtarget options.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002454 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2455 // truly should be based on -mtune options.
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002456 switch (CPU) {
2457 case CK_Generic:
2458 break;
2459 case CK_i386:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002460 // The rest are coming from the i386 define above.
2461 Builder.defineMacro("__tune_i386__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002462 break;
2463 case CK_i486:
2464 case CK_WinChipC6:
2465 case CK_WinChip2:
2466 case CK_C3:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002467 defineCPUMacros(Builder, "i486");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002468 break;
Chandler Carruthf17ba332011-09-28 09:45:05 +00002469 case CK_PentiumMMX:
2470 Builder.defineMacro("__pentium_mmx__");
2471 Builder.defineMacro("__tune_pentium_mmx__");
2472 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002473 case CK_i586:
2474 case CK_Pentium:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002475 defineCPUMacros(Builder, "i586");
2476 defineCPUMacros(Builder, "pentium");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002477 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002478 case CK_Pentium3:
2479 case CK_Pentium3M:
2480 case CK_PentiumM:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002481 Builder.defineMacro("__tune_pentium3__");
2482 // Fallthrough
2483 case CK_Pentium2:
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002484 case CK_C3_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002485 Builder.defineMacro("__tune_pentium2__");
2486 // Fallthrough
2487 case CK_PentiumPro:
2488 Builder.defineMacro("__tune_i686__");
2489 Builder.defineMacro("__tune_pentiumpro__");
2490 // Fallthrough
2491 case CK_i686:
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002492 Builder.defineMacro("__i686");
2493 Builder.defineMacro("__i686__");
2494 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2495 Builder.defineMacro("__pentiumpro");
2496 Builder.defineMacro("__pentiumpro__");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002497 break;
2498 case CK_Pentium4:
2499 case CK_Pentium4M:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002500 defineCPUMacros(Builder, "pentium4");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002501 break;
2502 case CK_Yonah:
2503 case CK_Prescott:
2504 case CK_Nocona:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002505 defineCPUMacros(Builder, "nocona");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002506 break;
2507 case CK_Core2:
2508 case CK_Penryn:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002509 defineCPUMacros(Builder, "core2");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002510 break;
2511 case CK_Atom:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002512 defineCPUMacros(Builder, "atom");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002513 break;
Benjamin Kramerb98ce372013-08-30 14:05:34 +00002514 case CK_SLM:
2515 defineCPUMacros(Builder, "slm");
2516 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002517 case CK_Corei7:
2518 case CK_Corei7AVX:
2519 case CK_CoreAVXi:
Craig Topper2b03bb02011-12-17 19:55:21 +00002520 case CK_CoreAVX2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002521 defineCPUMacros(Builder, "corei7");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002522 break;
Craig Topper10c2c682013-08-20 07:09:39 +00002523 case CK_KNL:
2524 defineCPUMacros(Builder, "knl");
2525 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002526 case CK_K6_2:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002527 Builder.defineMacro("__k6_2__");
2528 Builder.defineMacro("__tune_k6_2__");
2529 // Fallthrough
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002530 case CK_K6_3:
Chandler Carruthf17ba332011-09-28 09:45:05 +00002531 if (CPU != CK_K6_2) { // In case of fallthrough
2532 // FIXME: GCC may be enabling these in cases where some other k6
2533 // architecture is specified but -m3dnow is explicitly provided. The
2534 // exact semantics need to be determined and emulated here.
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002535 Builder.defineMacro("__k6_3__");
2536 Builder.defineMacro("__tune_k6_3__");
2537 }
Chandler Carruthf17ba332011-09-28 09:45:05 +00002538 // Fallthrough
2539 case CK_K6:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002540 defineCPUMacros(Builder, "k6");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002541 break;
2542 case CK_Athlon:
2543 case CK_AthlonThunderbird:
2544 case CK_Athlon4:
2545 case CK_AthlonXP:
2546 case CK_AthlonMP:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002547 defineCPUMacros(Builder, "athlon");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002548 if (SSELevel != NoSSE) {
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002549 Builder.defineMacro("__athlon_sse__");
Chandler Carruth53bf4f92011-09-28 09:54:11 +00002550 Builder.defineMacro("__tune_athlon_sse__");
2551 }
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002552 break;
2553 case CK_K8:
2554 case CK_K8SSE3:
2555 case CK_x86_64:
2556 case CK_Opteron:
2557 case CK_OpteronSSE3:
2558 case CK_Athlon64:
2559 case CK_Athlon64SSE3:
2560 case CK_AthlonFX:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002561 defineCPUMacros(Builder, "k8");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002562 break;
Roman Divacky01c770d2011-10-30 07:48:46 +00002563 case CK_AMDFAM10:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002564 defineCPUMacros(Builder, "amdfam10");
Roman Divacky01c770d2011-10-30 07:48:46 +00002565 break;
Benjamin Kramer5660aa62012-01-10 11:50:18 +00002566 case CK_BTVER1:
2567 defineCPUMacros(Builder, "btver1");
2568 break;
Benjamin Kramer63063f52013-05-03 10:47:15 +00002569 case CK_BTVER2:
2570 defineCPUMacros(Builder, "btver2");
2571 break;
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002572 case CK_BDVER1:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002573 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002574 break;
2575 case CK_BDVER2:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002576 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer61ea4fe2011-12-01 18:23:59 +00002577 break;
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002578 case CK_Geode:
Benjamin Kramer448f68d2012-01-10 11:50:09 +00002579 defineCPUMacros(Builder, "geode");
Chandler Carruthd9d3ddf2011-09-28 08:55:37 +00002580 break;
Chandler Carruthf6cf1c22011-09-28 02:59:25 +00002581 }
Chris Lattner84f0ea82009-03-02 22:40:39 +00002582
Chandler Carruth88c75b02011-09-28 09:54:07 +00002583 // Target properties.
2584 Builder.defineMacro("__LITTLE_ENDIAN__");
2585 Builder.defineMacro("__REGISTER_PREFIX__", "");
2586
Chris Lattner54175442009-04-19 17:32:33 +00002587 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2588 // functions in glibc header files that use FP Stack inline asm which the
2589 // backend can't deal with (PR879).
Benjamin Kramera9992772010-01-09 17:55:51 +00002590 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002591
Chandler Carruth88c75b02011-09-28 09:54:07 +00002592 if (HasAES)
2593 Builder.defineMacro("__AES__");
2594
Craig Topper3c0bc152012-05-31 05:18:48 +00002595 if (HasPCLMUL)
2596 Builder.defineMacro("__PCLMUL__");
2597
Craig Topper31ceea02011-12-25 05:06:45 +00002598 if (HasLZCNT)
2599 Builder.defineMacro("__LZCNT__");
2600
Benjamin Kramer84f30802012-07-07 09:39:18 +00002601 if (HasRDRND)
2602 Builder.defineMacro("__RDRND__");
2603
Craig Topper31ceea02011-12-25 05:06:45 +00002604 if (HasBMI)
2605 Builder.defineMacro("__BMI__");
2606
2607 if (HasBMI2)
2608 Builder.defineMacro("__BMI2__");
2609
Craig Toppere14e08b2011-12-29 16:10:46 +00002610 if (HasPOPCNT)
2611 Builder.defineMacro("__POPCNT__");
2612
Michael Liao463eb892012-11-10 05:17:46 +00002613 if (HasRTM)
2614 Builder.defineMacro("__RTM__");
2615
Michael Liao72339a02013-03-26 17:52:08 +00002616 if (HasPRFCHW)
2617 Builder.defineMacro("__PRFCHW__");
2618
Michael Liao1bfc28c2013-03-29 05:17:55 +00002619 if (HasRDSEED)
2620 Builder.defineMacro("__RDSEED__");
2621
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002622 switch (XOPLevel) {
2623 case XOP:
2624 Builder.defineMacro("__XOP__");
2625 case FMA4:
Craig Topper6a511e12011-12-30 07:33:42 +00002626 Builder.defineMacro("__FMA4__");
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002627 case SSE4A:
2628 Builder.defineMacro("__SSE4A__");
2629 case NoXOP:
2630 break;
2631 }
Craig Topper6a511e12011-12-30 07:33:42 +00002632
Craig Topper2ae95072012-06-03 21:46:30 +00002633 if (HasFMA)
2634 Builder.defineMacro("__FMA__");
2635
Manman Ren146e5a42012-10-11 00:59:55 +00002636 if (HasF16C)
2637 Builder.defineMacro("__F16C__");
2638
Craig Topperbca2c4f2013-08-21 05:29:10 +00002639 if (HasAVX512CD)
2640 Builder.defineMacro("__AVX512CD__");
2641 if (HasAVX512ER)
2642 Builder.defineMacro("__AVX512ER__");
2643 if (HasAVX512PF)
2644 Builder.defineMacro("__AVX512PF__");
2645
Chris Lattner84f0ea82009-03-02 22:40:39 +00002646 // Each case falls through to the previous one here.
2647 switch (SSELevel) {
Craig Topperb7a95d22013-08-21 03:59:22 +00002648 case AVX512F:
Craig Topper42f98732013-08-20 07:39:54 +00002649 Builder.defineMacro("__AVX512F__");
Craig Topper05fe4b52012-01-09 09:19:09 +00002650 case AVX2:
2651 Builder.defineMacro("__AVX2__");
2652 case AVX:
2653 Builder.defineMacro("__AVX__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002654 case SSE42:
Benjamin Kramera9992772010-01-09 17:55:51 +00002655 Builder.defineMacro("__SSE4_2__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002656 case SSE41:
Benjamin Kramera9992772010-01-09 17:55:51 +00002657 Builder.defineMacro("__SSE4_1__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002658 case SSSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002659 Builder.defineMacro("__SSSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002660 case SSE3:
Benjamin Kramera9992772010-01-09 17:55:51 +00002661 Builder.defineMacro("__SSE3__");
Chris Lattner84f0ea82009-03-02 22:40:39 +00002662 case SSE2:
Benjamin Kramera9992772010-01-09 17:55:51 +00002663 Builder.defineMacro("__SSE2__");
2664 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner84f0ea82009-03-02 22:40:39 +00002665 case SSE1:
Benjamin Kramera9992772010-01-09 17:55:51 +00002666 Builder.defineMacro("__SSE__");
2667 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002668 case NoSSE:
Chris Lattner84f0ea82009-03-02 22:40:39 +00002669 break;
2670 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00002671
Derek Schuffbabaf312012-10-11 15:52:22 +00002672 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002673 switch (SSELevel) {
Craig Topperb7a95d22013-08-21 03:59:22 +00002674 case AVX512F:
Craig Topper05fe4b52012-01-09 09:19:09 +00002675 case AVX2:
2676 case AVX:
Michael J. Spencera764e832010-10-21 08:22:51 +00002677 case SSE42:
2678 case SSE41:
2679 case SSSE3:
2680 case SSE3:
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002681 case SSE2:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002682 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002683 break;
2684 case SSE1:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002685 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002686 break;
2687 default:
Chris Lattner5f9e2722011-07-23 10:55:15 +00002688 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002689 }
2690 }
2691
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002692 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002693 switch (MMX3DNowLevel) {
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002694 case AMD3DNowAthlon:
2695 Builder.defineMacro("__3dNOW_A__");
2696 case AMD3DNow:
2697 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00002698 case MMX:
2699 Builder.defineMacro("__MMX__");
2700 case NoMMX3DNow:
Anders Carlsson9b0fb622010-01-27 03:47:49 +00002701 break;
2702 }
Michael J. Spencerd1b33942013-04-04 23:53:43 +00002703
2704 if (CPU >= CK_i486) {
2705 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2706 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2707 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2708 }
2709 if (CPU >= CK_i586)
2710 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerc0f59212009-03-02 22:27:17 +00002711}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002712
Douglas Gregore727d212012-01-30 06:38:25 +00002713bool X86TargetInfo::hasFeature(StringRef Feature) const {
2714 return llvm::StringSwitch<bool>(Feature)
2715 .Case("aes", HasAES)
2716 .Case("avx", SSELevel >= AVX)
2717 .Case("avx2", SSELevel >= AVX2)
Craig Topperb7a95d22013-08-21 03:59:22 +00002718 .Case("avx512f", SSELevel >= AVX512F)
Craig Topperbca2c4f2013-08-21 05:29:10 +00002719 .Case("avx512cd", HasAVX512CD)
2720 .Case("avx512er", HasAVX512ER)
2721 .Case("avx512pf", HasAVX512PF)
Douglas Gregore727d212012-01-30 06:38:25 +00002722 .Case("bmi", HasBMI)
2723 .Case("bmi2", HasBMI2)
Craig Topper2ae95072012-06-03 21:46:30 +00002724 .Case("fma", HasFMA)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002725 .Case("fma4", XOPLevel >= FMA4)
Douglas Gregore727d212012-01-30 06:38:25 +00002726 .Case("lzcnt", HasLZCNT)
Benjamin Kramer84f30802012-07-07 09:39:18 +00002727 .Case("rdrnd", HasRDRND)
Douglas Gregore727d212012-01-30 06:38:25 +00002728 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2729 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2730 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3c0bc152012-05-31 05:18:48 +00002731 .Case("pclmul", HasPCLMUL)
Douglas Gregore727d212012-01-30 06:38:25 +00002732 .Case("popcnt", HasPOPCNT)
Michael Liao463eb892012-11-10 05:17:46 +00002733 .Case("rtm", HasRTM)
Michael Liao72339a02013-03-26 17:52:08 +00002734 .Case("prfchw", HasPRFCHW)
Michael Liao1bfc28c2013-03-29 05:17:55 +00002735 .Case("rdseed", HasRDSEED)
Douglas Gregore727d212012-01-30 06:38:25 +00002736 .Case("sse", SSELevel >= SSE1)
2737 .Case("sse2", SSELevel >= SSE2)
2738 .Case("sse3", SSELevel >= SSE3)
2739 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola81cde9e2013-08-23 20:21:37 +00002740 .Case("sse4.1", SSELevel >= SSE41)
2741 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002742 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregore727d212012-01-30 06:38:25 +00002743 .Case("x86", true)
Derek Schuffbabaf312012-10-11 15:52:22 +00002744 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2745 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolaf6fe72b2013-08-20 13:44:29 +00002746 .Case("xop", XOPLevel >= XOP)
Manman Ren146e5a42012-10-11 00:59:55 +00002747 .Case("f16c", HasF16C)
Douglas Gregore727d212012-01-30 06:38:25 +00002748 .Default(false);
2749}
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002750
Eli Friedman618234a2008-08-20 02:34:37 +00002751bool
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002752X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00002753 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00002754 switch (*Name) {
Eli Friedman618234a2008-08-20 02:34:37 +00002755 default: return false;
Dale Johannesen545be512010-08-24 22:33:12 +00002756 case 'Y': // first letter of a pair:
2757 switch (*(Name+1)) {
2758 default: return false;
2759 case '0': // First SSE register.
2760 case 't': // Any SSE register, when SSE2 is enabled.
2761 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2762 case 'm': // any MMX register, when inter-unit moves enabled.
2763 break; // falls through to setAllowsRegister.
2764 }
Eli Friedman618234a2008-08-20 02:34:37 +00002765 case 'a': // eax.
2766 case 'b': // ebx.
2767 case 'c': // ecx.
2768 case 'd': // edx.
2769 case 'S': // esi.
2770 case 'D': // edi.
2771 case 'A': // edx:eax.
Dale Johannesen545be512010-08-24 22:33:12 +00002772 case 'f': // any x87 floating point stack register.
Eli Friedman618234a2008-08-20 02:34:37 +00002773 case 't': // top of floating point stack.
2774 case 'u': // second from top of floating point stack.
2775 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlssonfce09342008-10-06 00:41:45 +00002776 case 'y': // Any MMX register.
Anders Carlssona7406d42008-10-06 19:17:39 +00002777 case 'x': // Any SSE register.
Eli Friedman618234a2008-08-20 02:34:37 +00002778 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen545be512010-08-24 22:33:12 +00002779 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2780 case 'l': // "Index" registers: any general register that can be used as an
2781 // index in a base+index memory access.
2782 Info.setAllowsRegister();
2783 return true;
2784 case 'C': // SSE floating point constant.
2785 case 'G': // x87 floating point constant.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002786 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002787 // x86_64 instructions.
Anton Korobeynikova7c47172009-05-03 13:42:53 +00002788 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlsson79bc64c2009-01-24 18:03:09 +00002789 // x86_64 instructions.
Eli Friedman618234a2008-08-20 02:34:37 +00002790 return true;
2791 }
2792}
2793
Dale Johannesenf6e2c202010-10-29 23:12:32 +00002794
Eli Friedman618234a2008-08-20 02:34:37 +00002795std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00002796X86TargetInfo::convertConstraint(const char *&Constraint) const {
2797 switch (*Constraint) {
Eli Friedman618234a2008-08-20 02:34:37 +00002798 case 'a': return std::string("{ax}");
2799 case 'b': return std::string("{bx}");
2800 case 'c': return std::string("{cx}");
2801 case 'd': return std::string("{dx}");
2802 case 'S': return std::string("{si}");
2803 case 'D': return std::string("{di}");
Dale Johannesencee55012010-10-22 21:07:10 +00002804 case 'p': // address
2805 return std::string("im");
Eli Friedman618234a2008-08-20 02:34:37 +00002806 case 't': // top of floating point stack.
2807 return std::string("{st}");
2808 case 'u': // second from top of floating point stack.
2809 return std::string("{st(1)}"); // second from top of floating point stack.
2810 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00002811 return std::string(1, *Constraint);
Eli Friedman618234a2008-08-20 02:34:37 +00002812 }
2813}
Eli Friedman618234a2008-08-20 02:34:37 +00002814} // end anonymous namespace
Reid Spencer5f016e22007-07-11 17:01:13 +00002815
2816namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00002817// X86-32 generic target
2818class X86_32TargetInfo : public X86TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +00002819public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002820 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00002821 DoubleAlign = LongLongAlign = 32;
2822 LongDoubleWidth = 96;
2823 LongDoubleAlign = 32;
Nick Lewycky9bddf432011-12-21 04:25:47 +00002824 SuitableAlign = 128;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002825 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2826 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames567c6002011-10-11 00:52:51 +00002827 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman1afabd92009-03-29 20:31:09 +00002828 SizeType = UnsignedInt;
2829 PtrDiffType = SignedInt;
2830 IntPtrType = SignedInt;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00002831 RegParmMax = 3;
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00002832
2833 // Use fpret for all types.
2834 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2835 (1 << TargetInfo::Double) |
2836 (1 << TargetInfo::LongDouble));
Eli Friedman2be46072011-10-14 20:59:01 +00002837
2838 // x86-32 has atomics up to 8 bytes
2839 // FIXME: Check that we actually have cmpxchg8b before setting
2840 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2841 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman618234a2008-08-20 02:34:37 +00002842 }
Meador Ingec5613b22012-06-16 03:34:49 +00002843 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2844 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman618234a2008-08-20 02:34:37 +00002845 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00002846
Chris Lattner21fb98e2009-09-23 06:06:36 +00002847 int getEHDataRegisterNumber(unsigned RegNo) const {
2848 if (RegNo == 0) return 0;
2849 if (RegNo == 1) return 2;
2850 return -1;
2851 }
Bill Wendling68fd6082012-11-12 06:42:51 +00002852 virtual bool validateInputSize(StringRef Constraint,
2853 unsigned Size) const {
2854 switch (Constraint[0]) {
2855 default: break;
2856 case 'a':
2857 case 'b':
2858 case 'c':
2859 case 'd':
Bill Wendlingf634bdf2012-11-12 18:52:32 +00002860 return Size <= 32;
Bill Wendling68fd6082012-11-12 06:42:51 +00002861 }
2862
2863 return true;
2864 }
Eli Friedman618234a2008-08-20 02:34:37 +00002865};
2866} // end anonymous namespace
2867
2868namespace {
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00002869class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2870public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002871 NetBSDI386TargetInfo(const llvm::Triple &Triple)
2872 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger42378be2012-01-06 18:32:26 +00002873
2874 virtual unsigned getFloatEvalMethod() const {
2875 // NetBSD defaults to "double" rounding
2876 return 1;
2877 }
2878};
2879} // end anonymous namespace
2880
2881namespace {
Eli Friedman624c1462009-07-05 18:47:56 +00002882class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2883public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002884 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
2885 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman624c1462009-07-05 18:47:56 +00002886 SizeType = UnsignedLong;
2887 IntPtrType = SignedLong;
Eli Friedman6036ebe2009-07-05 22:31:18 +00002888 PtrDiffType = SignedLong;
Eli Friedman624c1462009-07-05 18:47:56 +00002889 }
2890};
2891} // end anonymous namespace
2892
2893namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00002894class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
2895public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002896 BitrigI386TargetInfo(const llvm::Triple &Triple)
2897 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman42f74f22012-08-08 23:57:20 +00002898 SizeType = UnsignedLong;
2899 IntPtrType = SignedLong;
2900 PtrDiffType = SignedLong;
2901 }
2902};
2903} // end anonymous namespace
2904
2905namespace {
Torok Edwin5f6c1942009-06-30 17:10:35 +00002906class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman618234a2008-08-20 02:34:37 +00002907public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002908 DarwinI386TargetInfo(const llvm::Triple &Triple)
2909 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman618234a2008-08-20 02:34:37 +00002910 LongDoubleWidth = 128;
2911 LongDoubleAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00002912 SuitableAlign = 128;
Chad Rosierf9e9af72012-07-13 23:57:43 +00002913 MaxVectorAlign = 256;
Eli Friedman1afabd92009-03-29 20:31:09 +00002914 SizeType = UnsignedLong;
2915 IntPtrType = SignedLong;
Eli Friedmaned855cb2008-08-21 00:13:15 +00002916 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2917 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002918 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbar613fd672010-05-27 00:35:16 +00002919 HasAlignMac68kSupport = true;
Torok Edwinb0a5b242009-06-30 17:00:25 +00002920 }
2921
Eli Friedman618234a2008-08-20 02:34:37 +00002922};
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00002923} // end anonymous namespace
2924
2925namespace {
Eli Friedman29a30502008-08-21 01:40:19 +00002926// x86-32 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00002927class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman29a30502008-08-21 01:40:19 +00002928public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002929 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
2930 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmanb030f022009-04-19 21:38:35 +00002931 TLSSupported = false;
Chris Lattner85de9e72009-06-24 17:12:15 +00002932 WCharType = UnsignedShort;
Eli Friedman9c2f84e2009-06-08 21:16:17 +00002933 DoubleAlign = LongLongAlign = 64;
2934 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 +00002935 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00002936 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedman29a30502008-08-21 01:40:19 +00002937 }
Michael J. Spencera764e832010-10-21 08:22:51 +00002938 virtual void getTargetDefines(const LangOptions &Opts,
2939 MacroBuilder &Builder) const {
2940 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2941 }
2942};
2943} // end anonymous namespace
2944
2945namespace {
2946
2947// x86-32 Windows Visual Studio target
2948class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2949public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002950 VisualStudioWindowsX86_32TargetInfo(const llvm::Triple &Triple)
2951 : WindowsX86_32TargetInfo(Triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00002952 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencera764e832010-10-21 08:22:51 +00002953 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2954 }
2955 virtual void getTargetDefines(const LangOptions &Opts,
2956 MacroBuilder &Builder) const {
2957 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2958 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2959 // The value of the following reflects processor type.
2960 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2961 // We lost the original triple, so we use the default.
2962 Builder.defineMacro("_M_IX86", "600");
2963 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002964};
2965} // end anonymous namespace
2966
2967namespace {
2968// x86-32 MinGW target
2969class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2970public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002971 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
2972 : WindowsX86_32TargetInfo(Triple) {}
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002973 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00002974 MacroBuilder &Builder) const {
2975 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00002976 DefineStd(Builder, "WIN32", Opts);
2977 DefineStd(Builder, "WINNT", Opts);
2978 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00002979 Builder.defineMacro("__MSVCRT__");
2980 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002981
2982 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2983 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00002984 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00002985 // Provide "as-is" __declspec.
2986 Builder.defineMacro("__declspec", "__declspec");
2987 else
2988 // Provide alias of __attribute__ like mingw32-gcc.
2989 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00002990 }
2991};
2992} // end anonymous namespace
2993
2994namespace {
2995// x86-32 Cygwin target
2996class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2997public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00002998 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
2999 : X86_32TargetInfo(Triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003000 TLSSupported = false;
3001 WCharType = UnsignedShort;
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003002 DoubleAlign = LongLongAlign = 64;
3003 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3004 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003005 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003006 }
3007 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003008 MacroBuilder &Builder) const {
3009 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumie72f4d92012-12-14 10:17:26 +00003010 Builder.defineMacro("_X86_");
Benjamin Kramera9992772010-01-09 17:55:51 +00003011 Builder.defineMacro("__CYGWIN__");
3012 Builder.defineMacro("__CYGWIN32__");
3013 DefineStd(Builder, "unix", Opts);
Douglas Gregor2b003fd2010-04-21 05:52:38 +00003014 if (Opts.CPlusPlus)
3015 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanabc4e322009-06-08 06:11:14 +00003016 }
Eli Friedman29a30502008-08-21 01:40:19 +00003017};
3018} // end anonymous namespace
3019
3020namespace {
Chris Lattner86ed3a32010-04-11 19:29:39 +00003021// x86-32 Haiku target
3022class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3023public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003024 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattner86ed3a32010-04-11 19:29:39 +00003025 SizeType = UnsignedLong;
Chris Lattnerfe1ea7b2010-04-22 17:48:00 +00003026 IntPtrType = SignedLong;
3027 PtrDiffType = SignedLong;
Eli Friedman6902e412012-11-27 02:58:24 +00003028 ProcessIDType = SignedLong;
Rafael Espindola19ddda82010-11-09 16:41:02 +00003029 this->UserLabelPrefix = "";
Benjamin Krameref7bcea2012-11-08 12:59:15 +00003030 this->TLSSupported = false;
Eli Friedmana7e68452010-08-22 01:00:03 +00003031 }
Chris Lattner86ed3a32010-04-11 19:29:39 +00003032 virtual void getTargetDefines(const LangOptions &Opts,
3033 MacroBuilder &Builder) const {
3034 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3035 Builder.defineMacro("__INTEL__");
3036 Builder.defineMacro("__HAIKU__");
3037 }
3038};
3039} // end anonymous namespace
3040
Douglas Gregordca52262011-07-01 22:41:14 +00003041// RTEMS Target
3042template<typename Target>
3043class RTEMSTargetInfo : public OSTargetInfo<Target> {
3044protected:
3045 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3046 MacroBuilder &Builder) const {
3047 // RTEMS defines; list based off of gcc output
3048
Douglas Gregordca52262011-07-01 22:41:14 +00003049 Builder.defineMacro("__rtems__");
3050 Builder.defineMacro("__ELF__");
3051 }
Benjamin Kramer9df08232013-06-29 16:37:14 +00003052
Douglas Gregordca52262011-07-01 22:41:14 +00003053public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003054 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3055 this->UserLabelPrefix = "";
Douglas Gregordca52262011-07-01 22:41:14 +00003056
Benjamin Kramer9df08232013-06-29 16:37:14 +00003057 switch (Triple.getArch()) {
3058 default:
3059 case llvm::Triple::x86:
3060 // this->MCountName = ".mcount";
3061 break;
3062 case llvm::Triple::mips:
3063 case llvm::Triple::mipsel:
3064 case llvm::Triple::ppc:
3065 case llvm::Triple::ppc64:
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00003066 case llvm::Triple::ppc64le:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003067 // this->MCountName = "_mcount";
3068 break;
3069 case llvm::Triple::arm:
3070 // this->MCountName = "__mcount";
3071 break;
Douglas Gregordca52262011-07-01 22:41:14 +00003072 }
Benjamin Kramer9df08232013-06-29 16:37:14 +00003073 }
Douglas Gregordca52262011-07-01 22:41:14 +00003074};
3075
3076namespace {
3077// x86-32 RTEMS target
3078class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3079public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003080 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregordca52262011-07-01 22:41:14 +00003081 SizeType = UnsignedLong;
3082 IntPtrType = SignedLong;
3083 PtrDiffType = SignedLong;
3084 this->UserLabelPrefix = "";
3085 }
3086 virtual void getTargetDefines(const LangOptions &Opts,
3087 MacroBuilder &Builder) const {
3088 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3089 Builder.defineMacro("__INTEL__");
3090 Builder.defineMacro("__rtems__");
3091 }
3092};
3093} // end anonymous namespace
3094
Chris Lattner86ed3a32010-04-11 19:29:39 +00003095namespace {
Eli Friedman618234a2008-08-20 02:34:37 +00003096// x86-64 generic target
3097class X86_64TargetInfo : public X86TargetInfo {
3098public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003099 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Chris Lattnerf291b102008-05-09 06:17:04 +00003100 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +00003101 LongDoubleWidth = 128;
3102 LongDoubleAlign = 128;
Rafael Espindola6deecb02010-06-04 23:15:27 +00003103 LargeArrayMinWidth = 128;
3104 LargeArrayAlign = 128;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003105 SuitableAlign = 128;
Chris Lattner06ebe862009-02-05 07:32:46 +00003106 IntMaxType = SignedLong;
3107 UIntMaxType = UnsignedLong;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003108 Int64Type = SignedLong;
Anton Korobeynikov264a76c2009-04-03 23:38:25 +00003109 RegParmMax = 6;
Chris Lattner06ebe862009-02-05 07:32:46 +00003110
Eli Friedmaned855cb2008-08-21 00:13:15 +00003111 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3112 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003113 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbardacf9dd2010-07-14 23:39:36 +00003114
3115 // Use fpret only for long double.
3116 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman2be46072011-10-14 20:59:01 +00003117
Anders Carlssoneea64802011-10-31 16:27:11 +00003118 // Use fp2ret for _Complex long double.
3119 ComplexLongDoubleUsesFP2Ret = true;
3120
Eli Friedman2be46072011-10-14 20:59:01 +00003121 // x86-64 has atomics up to 16 bytes.
3122 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3123 // on CPUs with cmpxchg16b
3124 MaxAtomicPromoteWidth = 128;
3125 MaxAtomicInlineWidth = 64;
Reid Spencer5f016e22007-07-11 17:01:13 +00003126 }
Meador Ingec5613b22012-06-16 03:34:49 +00003127 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3128 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson3346ae62007-11-24 23:38:12 +00003129 }
Michael J. Spencer237cf582010-10-18 07:10:59 +00003130
Chris Lattner21fb98e2009-09-23 06:06:36 +00003131 int getEHDataRegisterNumber(unsigned RegNo) const {
3132 if (RegNo == 0) return 0;
3133 if (RegNo == 1) return 1;
3134 return -1;
3135 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00003136
3137 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
Charles Davise8519c32013-08-30 04:39:01 +00003138 return (CC == CC_C ||
3139 CC == CC_IntelOclBicc ||
3140 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003141 }
3142
Aaron Ballmanfff32482012-12-09 17:45:41 +00003143 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
3144 return CC_C;
Aaron Ballman82bfa192012-10-02 14:26:08 +00003145 }
3146
Eli Friedman618234a2008-08-20 02:34:37 +00003147};
3148} // end anonymous namespace
3149
3150namespace {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003151// x86-64 Windows target
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003152class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003153public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003154 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3155 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003156 TLSSupported = false;
3157 WCharType = UnsignedShort;
Mike Stumpa55cce82009-10-08 23:00:00 +00003158 LongWidth = LongAlign = 32;
Michael J. Spencer237cf582010-10-18 07:10:59 +00003159 DoubleAlign = LongLongAlign = 64;
Nate Begemandbf8ea42010-07-21 02:02:56 +00003160 IntMaxType = SignedLongLong;
3161 UIntMaxType = UnsignedLongLong;
3162 Int64Type = SignedLongLong;
Cameron Esfahani1484e0d2010-09-15 00:28:12 +00003163 SizeType = UnsignedLongLong;
3164 PtrDiffType = SignedLongLong;
3165 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00003166 this->UserLabelPrefix = "";
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003167 }
3168 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003169 MacroBuilder &Builder) const {
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003170 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003171 Builder.defineMacro("_WIN64");
Michael J. Spencera764e832010-10-21 08:22:51 +00003172 }
Meador Ingec5613b22012-06-16 03:34:49 +00003173 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3174 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumi79521992011-01-17 22:56:23 +00003175 }
Charles Davise8519c32013-08-30 04:39:01 +00003176 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3177 return (CC == CC_C ||
3178 CC == CC_IntelOclBicc ||
3179 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3180 }
Michael J. Spencera764e832010-10-21 08:22:51 +00003181};
3182} // end anonymous namespace
3183
3184namespace {
3185// x86-64 Windows Visual Studio target
3186class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
3187public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003188 VisualStudioWindowsX86_64TargetInfo(const llvm::Triple &Triple)
3189 : WindowsX86_64TargetInfo(Triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00003190 LongDoubleWidth = LongDoubleAlign = 64;
3191 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencera764e832010-10-21 08:22:51 +00003192 }
3193 virtual void getTargetDefines(const LangOptions &Opts,
3194 MacroBuilder &Builder) const {
3195 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3196 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramera9992772010-01-09 17:55:51 +00003197 Builder.defineMacro("_M_X64");
Michael J. Spencerdae4ac42010-10-21 05:21:48 +00003198 Builder.defineMacro("_M_AMD64");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003199 }
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003200};
3201} // end anonymous namespace
3202
3203namespace {
3204// x86-64 MinGW target
3205class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3206public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003207 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3208 : WindowsX86_64TargetInfo(Triple) {}
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003209 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003210 MacroBuilder &Builder) const {
3211 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencera764e832010-10-21 08:22:51 +00003212 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00003213 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00003214 Builder.defineMacro("__MINGW32__");
Benjamin Kramera9992772010-01-09 17:55:51 +00003215 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00003216
3217 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3218 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet62ec1f22011-09-17 17:15:52 +00003219 if (Opts.MicrosoftExt)
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00003220 // Provide "as-is" __declspec.
3221 Builder.defineMacro("__declspec", "__declspec");
3222 else
3223 // Provide alias of __attribute__ like mingw32-gcc.
3224 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00003225 }
3226};
3227} // end anonymous namespace
3228
3229namespace {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003230class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3231public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003232 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3233 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003234 Int64Type = SignedLongLong;
Chad Rosierf9e9af72012-07-13 23:57:43 +00003235 MaxVectorAlign = 256;
Eli Friedman3c7b6e42009-07-01 03:36:11 +00003236 }
3237};
3238} // end anonymous namespace
3239
3240namespace {
Eli Friedman6036ebe2009-07-05 22:31:18 +00003241class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3242public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003243 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3244 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman6036ebe2009-07-05 22:31:18 +00003245 IntMaxType = SignedLongLong;
3246 UIntMaxType = UnsignedLongLong;
3247 Int64Type = SignedLongLong;
3248 }
3249};
3250} // end anonymous namespace
3251
3252namespace {
Eli Friedman42f74f22012-08-08 23:57:20 +00003253class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3254public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003255 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3256 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3257 IntMaxType = SignedLongLong;
3258 UIntMaxType = UnsignedLongLong;
3259 Int64Type = SignedLongLong;
Eli Friedman42f74f22012-08-08 23:57:20 +00003260 }
3261};
Tim Northoverc264e162013-01-31 12:13:10 +00003262}
3263
3264namespace {
3265class AArch64TargetInfo : public TargetInfo {
3266 static const char * const GCCRegNames[];
3267 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Tim Northoverff920ee2013-05-04 07:15:13 +00003268
Tim Northoverb793f0d2013-08-01 09:23:19 +00003269 enum FPUModeEnum {
3270 FPUMode,
3271 NeonMode
3272 };
3273
3274 unsigned FPU;
Tim Northoverff920ee2013-05-04 07:15:13 +00003275 static const Builtin::Info BuiltinInfo[];
Tim Northoverb793f0d2013-08-01 09:23:19 +00003276
Tim Northoverc264e162013-01-31 12:13:10 +00003277public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003278 AArch64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Tim Northoverc264e162013-01-31 12:13:10 +00003279 BigEndian = false;
3280 LongWidth = LongAlign = 64;
3281 LongDoubleWidth = LongDoubleAlign = 128;
3282 PointerWidth = PointerAlign = 64;
3283 SuitableAlign = 128;
3284 DescriptionString = "e-p:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3285 "i64:64:64-i128:128:128-f32:32:32-f64:64:64-"
3286 "f128:128:128-n32:64-S128";
3287
3288 WCharType = UnsignedInt;
3289 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3290
Tim Northover6a93c862013-02-18 12:11:32 +00003291 // AArch64 backend supports 64-bit operations at the moment. In principle
3292 // 128-bit is possible if register-pairs are used.
3293 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3294
Tim Northoverc264e162013-01-31 12:13:10 +00003295 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3296 }
3297 virtual void getTargetDefines(const LangOptions &Opts,
3298 MacroBuilder &Builder) const {
3299 // GCC defines theses currently
3300 Builder.defineMacro("__aarch64__");
3301 Builder.defineMacro("__AARCH64EL__");
3302
3303 // ACLE predefines. Many can only have one possible value on v8 AArch64.
3304
3305 // FIXME: these were written based on an unreleased version of a 32-bit ACLE
3306 // which was intended to be compatible with a 64-bit implementation. They
3307 // will need updating when a real 64-bit ACLE exists. Particularly pressing
Tim Northoverdabcbf92013-04-05 14:08:55 +00003308 // instances are: __ARM_ARCH_ISA_ARM, __ARM_ARCH_ISA_THUMB, __ARM_PCS.
3309 Builder.defineMacro("__ARM_ACLE", "101");
3310 Builder.defineMacro("__ARM_ARCH", "8");
3311 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
Tim Northoverc264e162013-01-31 12:13:10 +00003312
Tim Northoverdabcbf92013-04-05 14:08:55 +00003313 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
3314 Builder.defineMacro("__ARM_FEATURE_CLZ");
3315 Builder.defineMacro("__ARM_FEATURE_FMA");
Tim Northoverc264e162013-01-31 12:13:10 +00003316
3317 // FIXME: ACLE 1.1 reserves bit 4. Will almost certainly come to mean
3318 // 128-bit LDXP present, at which point this becomes 0x1f.
Tim Northoverdabcbf92013-04-05 14:08:55 +00003319 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xf");
Tim Northoverc264e162013-01-31 12:13:10 +00003320
3321 // 0xe implies support for half, single and double precision operations.
Tim Northoverdabcbf92013-04-05 14:08:55 +00003322 Builder.defineMacro("__ARM_FP", "0xe");
Tim Northoverc264e162013-01-31 12:13:10 +00003323
3324 // PCS specifies this for SysV variants, which is all we support. Other ABIs
Tim Northoverdabcbf92013-04-05 14:08:55 +00003325 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
3326 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
Tim Northoverc264e162013-01-31 12:13:10 +00003327
3328 if (Opts.FastMath || Opts.FiniteMathOnly)
Tim Northoverdabcbf92013-04-05 14:08:55 +00003329 Builder.defineMacro("__ARM_FP_FAST");
Tim Northoverc264e162013-01-31 12:13:10 +00003330
3331 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
Tim Northoverdabcbf92013-04-05 14:08:55 +00003332 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
Tim Northoverc264e162013-01-31 12:13:10 +00003333
Tim Northoverdabcbf92013-04-05 14:08:55 +00003334 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Tim Northoverc264e162013-01-31 12:13:10 +00003335 Opts.ShortWChar ? "2" : "4");
3336
Tim Northoverdabcbf92013-04-05 14:08:55 +00003337 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
Tim Northoverc264e162013-01-31 12:13:10 +00003338 Opts.ShortEnums ? "1" : "4");
3339
3340 if (BigEndian)
Tim Northoverb793f0d2013-08-01 09:23:19 +00003341 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3342
3343 if (FPU == NeonMode) {
3344 Builder.defineMacro("__AARCH_FEATURE_ADVSIMD");
3345
3346 // 64-bit NEON supports half, single and double precision operations.
3347 Builder.defineMacro("__AARCH_ADVSIMD_FP", "0xe");
3348 }
Tim Northoverc264e162013-01-31 12:13:10 +00003349 }
3350 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3351 unsigned &NumRecords) const {
Tim Northoverff920ee2013-05-04 07:15:13 +00003352 Records = BuiltinInfo;
3353 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin;
Tim Northoverc264e162013-01-31 12:13:10 +00003354 }
3355 virtual bool hasFeature(StringRef Feature) const {
Tim Northoverb793f0d2013-08-01 09:23:19 +00003356 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode);
Tim Northoverc264e162013-01-31 12:13:10 +00003357 }
Tim Northoverb793f0d2013-08-01 09:23:19 +00003358
Rafael Espindola5389b842013-08-21 21:59:03 +00003359 virtual bool HandleTargetFeatures(std::vector<std::string> &Features,
3360 DiagnosticsEngine &Diags) {
Tim Northoverb793f0d2013-08-01 09:23:19 +00003361 FPU = FPUMode;
3362 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3363 if (Features[i] == "+neon")
3364 FPU = NeonMode;
3365 }
Rafael Espindola5389b842013-08-21 21:59:03 +00003366 return true;
Tim Northoverb793f0d2013-08-01 09:23:19 +00003367 }
3368
3369 virtual void getGCCRegNames(const char *const *&Names,
Tim Northoverc264e162013-01-31 12:13:10 +00003370 unsigned &NumNames) const;
3371 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3372 unsigned &NumAliases) const;
3373
3374 virtual bool isCLZForZeroUndef() const { return false; }
3375
3376 virtual bool validateAsmConstraint(const char *&Name,
3377 TargetInfo::ConstraintInfo &Info) const {
3378 switch (*Name) {
3379 default: return false;
3380 case 'w': // An FP/SIMD vector register
3381 Info.setAllowsRegister();
3382 return true;
3383 case 'I': // Constant that can be used with an ADD instruction
3384 case 'J': // Constant that can be used with a SUB instruction
3385 case 'K': // Constant that can be used with a 32-bit logical instruction
3386 case 'L': // Constant that can be used with a 64-bit logical instruction
3387 case 'M': // Constant that can be used as a 32-bit MOV immediate
3388 case 'N': // Constant that can be used as a 64-bit MOV immediate
3389 case 'Y': // Floating point constant zero
3390 case 'Z': // Integer constant zero
3391 return true;
3392 case 'Q': // A memory reference with base register and no offset
3393 Info.setAllowsMemory();
3394 return true;
3395 case 'S': // A symbolic address
3396 Info.setAllowsRegister();
3397 return true;
3398 case 'U':
3399 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3400 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3401 // Usa: An absolute symbolic address
3402 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3403 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3404 }
3405 }
3406
3407 virtual const char *getClobbers() const {
3408 // There are no AArch64 clobbers shared by all asm statements.
3409 return "";
3410 }
3411
3412 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3413 return TargetInfo::AArch64ABIBuiltinVaList;
3414 }
3415};
3416
3417const char * const AArch64TargetInfo::GCCRegNames[] = {
3418 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3419 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3420 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3421 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3422
3423 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3424 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3425 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3426 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3427
3428 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3429 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3430 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3431 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3432
3433 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3434 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3435 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3436 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3437
3438 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3439 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3440 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3441 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3442
3443 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3444 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3445 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3446 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3447
3448 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3449 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3450 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3451 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3452};
3453
3454void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3455 unsigned &NumNames) const {
3456 Names = GCCRegNames;
3457 NumNames = llvm::array_lengthof(GCCRegNames);
3458}
3459
3460const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3461 { { "x16" }, "ip0"},
3462 { { "x17" }, "ip1"},
3463 { { "x29" }, "fp" },
3464 { { "x30" }, "lr" }
3465};
3466
3467void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3468 unsigned &NumAliases) const {
3469 Aliases = GCCRegAliases;
3470 NumAliases = llvm::array_lengthof(GCCRegAliases);
3471
3472}
Tim Northoverff920ee2013-05-04 07:15:13 +00003473
3474const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
3475#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3476#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3477 ALL_LANGUAGES },
3478#include "clang/Basic/BuiltinsAArch64.def"
3479};
3480
Eli Friedman42f74f22012-08-08 23:57:20 +00003481} // end anonymous namespace
3482
3483namespace {
Eli Friedmana9f54962008-08-20 07:44:10 +00003484class ARMTargetInfo : public TargetInfo {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003485 // Possible FPU choices.
3486 enum FPUMode {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003487 VFP2FPU = (1 << 0),
3488 VFP3FPU = (1 << 1),
3489 VFP4FPU = (1 << 2),
3490 NeonFPU = (1 << 3)
Daniel Dunbara91320b2009-12-21 23:28:17 +00003491 };
3492
3493 static bool FPUModeIsVFP(FPUMode Mode) {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003494 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU);
Daniel Dunbara91320b2009-12-21 23:28:17 +00003495 }
3496
3497 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3498 static const char * const GCCRegNames[];
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003499
Daniel Dunbareac7c532009-12-18 18:42:37 +00003500 std::string ABI, CPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003501
Rafael Espindola5389b842013-08-21 21:59:03 +00003502 enum {
3503 FP_Default,
3504 FP_VFP,
3505 FP_Neon
3506 } FPMath;
3507
Bob Wilsoncfaab002012-09-29 23:52:52 +00003508 unsigned FPU : 4;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003509
Logan Chieneae5a8202012-10-10 06:56:20 +00003510 unsigned IsAAPCS : 1;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003511 unsigned IsThumb : 1;
3512
3513 // Initialized via features.
3514 unsigned SoftFloat : 1;
3515 unsigned SoftFloatABI : 1;
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003516
Chris Lattner2752c012010-03-03 19:03:45 +00003517 static const Builtin::Info BuiltinInfo[];
3518
Rafael Espindola620c0af2013-05-13 20:09:47 +00003519 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3520 // On linux, binaries targeting old cpus call functions in libgcc to
3521 // perform atomic operations. The implementation in libgcc then calls into
3522 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3523 // is that if we assume the kernel is at least as recent as the hardware,
3524 // it is safe to use atomic instructions on armv6 and newer.
Rafael Espindolae1e03422013-06-17 20:00:15 +00003525 if (T.getOS() != llvm::Triple::Linux &&
3526 T.getOS() != llvm::Triple::FreeBSD &&
3527 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten04491632013-06-15 09:40:14 +00003528 return false;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003529 StringRef ArchName = T.getArchName();
Rafael Espindola69db5552013-05-14 00:44:24 +00003530 if (T.getArch() == llvm::Triple::arm) {
3531 if (!ArchName.startswith("armv"))
3532 return false;
3533 StringRef VersionStr = ArchName.substr(4);
3534 unsigned Version;
3535 if (VersionStr.getAsInteger(10, Version))
3536 return false;
3537 return Version >= 6;
3538 }
3539 assert(T.getArch() == llvm::Triple::thumb);
3540 if (!ArchName.startswith("thumbv"))
3541 return false;
3542 StringRef VersionStr = ArchName.substr(6);
3543 unsigned Version;
3544 if (VersionStr.getAsInteger(10, Version))
3545 return false;
3546 return Version >= 7;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003547 }
3548
Chris Lattner393ff042008-04-21 18:56:49 +00003549public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00003550 ARMTargetInfo(const llvm::Triple &Triple)
3551 : TargetInfo(Triple), ABI("aapcs-linux"), CPU("arm1136j-s"),
Rafael Espindola5389b842013-08-21 21:59:03 +00003552 FPMath(FP_Default), IsAAPCS(true) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00003553 BigEndian = false;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003554 SizeType = UnsignedInt;
3555 PtrDiffType = SignedInt;
James Molloya6d81f92011-11-23 13:35:08 +00003556 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3557 WCharType = UnsignedInt;
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003558
Chris Lattner9bffb072010-04-23 16:29:58 +00003559 // {} in inline assembly are neon specifiers, not assembly variant
3560 // specifiers.
3561 NoAsmVariants = true;
Michael J. Spencer20249a12010-10-21 03:16:25 +00003562
Daniel Dunbareac7c532009-12-18 18:42:37 +00003563 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0791aa52009-12-18 19:57:13 +00003564 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003565 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00003566 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3567 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003568 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
3569 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003570 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003571 } else {
3572 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3573 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003574 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003575 }
John McCallee79a4c2010-08-21 22:46:04 +00003576
3577 // ARM targets default to using the ARM C++ ABI.
John McCallb8b2c9d2013-01-25 22:30:49 +00003578 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman2be46072011-10-14 20:59:01 +00003579
3580 // ARM has atomics up to 8 bytes
Eli Friedman2be46072011-10-14 20:59:01 +00003581 MaxAtomicPromoteWidth = 64;
Rafael Espindola620c0af2013-05-13 20:09:47 +00003582 if (shouldUseInlineAtomic(getTriple()))
3583 MaxAtomicInlineWidth = 64;
James Molloye45b9b72012-03-12 09:14:10 +00003584
3585 // Do force alignment of members that follow zero length bitfields. If
3586 // the alignment of the zero-length bitfield is greater than the member
3587 // that follows it, `bar', `bar' will be aligned as the type of the
3588 // zero length bitfield.
3589 UseZeroLengthBitfieldAlignment = true;
Eli Friedman61538a72008-05-20 14:21:01 +00003590 }
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003591 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbara2a41612009-09-14 00:02:24 +00003592 virtual bool setABI(const std::string &Name) {
Daniel Dunbar018ba5a2009-09-14 00:35:03 +00003593 ABI = Name;
3594
Daniel Dunbara2a41612009-09-14 00:02:24 +00003595 // The defaults (above) are for AAPCS, check if we need to change them.
3596 //
3597 // FIXME: We need support for -meabi... we could just mangle it into the
3598 // name.
3599 if (Name == "apcs-gnu") {
Nick Lewycky7ec59c72011-12-16 22:34:14 +00003600 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindola27fa2362012-12-13 04:17:14 +00003601 // size_t is unsigned int on FreeBSD.
3602 if (getTriple().getOS() != llvm::Triple::FreeBSD)
3603 SizeType = UnsignedLong;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003604
James Molloya6d81f92011-11-23 13:35:08 +00003605 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3606 WCharType = SignedInt;
3607
Daniel Dunbar684de632010-04-22 16:14:54 +00003608 // Do not respect the alignment of bit-field types when laying out
3609 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3610 UseBitFieldTypeAlignment = false;
3611
Chad Rosier61a62212011-08-04 01:21:14 +00003612 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosier6e43f3f2011-08-04 17:52:43 +00003613 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3614 /// gcc.
Chad Rosier61a62212011-08-04 01:21:14 +00003615 ZeroLengthBitfieldBoundary = 32;
3616
Logan Chieneae5a8202012-10-10 06:56:20 +00003617 IsAAPCS = false;
3618
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003619 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00003620 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3621 // so set preferred for small types to 32.
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003622 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 +00003623 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003624 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003625 } else {
3626 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 +00003627 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hamesf4f50032011-10-10 23:44:43 +00003628 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbardff10dc2009-09-22 21:44:58 +00003629 }
3630
Chad Rosier9f1210c2011-07-26 07:03:04 +00003631 // FIXME: Override "preferred align" for double and long long.
David Tweedb16abb12012-10-25 13:33:01 +00003632 } else if (Name == "aapcs" || Name == "aapcs-vfp") {
Bob Wilsone4bce7a2013-06-18 05:36:04 +00003633 // size_t is unsigned long on Darwin.
3634 if (getTriple().isOSDarwin())
3635 SizeType = UnsignedLong;
Logan Chieneae5a8202012-10-10 06:56:20 +00003636 IsAAPCS = true;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003637 // FIXME: Enumerated types are variable width in straight AAPCS.
3638 } else if (Name == "aapcs-linux") {
Logan Chieneae5a8202012-10-10 06:56:20 +00003639 IsAAPCS = true;
Daniel Dunbara2a41612009-09-14 00:02:24 +00003640 } else
3641 return false;
3642
3643 return true;
3644 }
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003645
Chandler Carruthc3a2e652011-09-28 05:56:05 +00003646 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbara91320b2009-12-21 23:28:17 +00003647 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3648 Features["vfp2"] = true;
Bob Wilsoncfaab002012-09-29 23:52:52 +00003649 else if (CPU == "cortex-a8" || CPU == "cortex-a15" ||
3650 CPU == "cortex-a9" || CPU == "cortex-a9-mp")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003651 Features["neon"] = true;
Bob Wilsonfc553452013-03-04 22:37:46 +00003652 else if (CPU == "swift" || CPU == "cortex-a7") {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003653 Features["vfp4"] = true;
3654 Features["neon"] = true;
3655 }
Daniel Dunbara91320b2009-12-21 23:28:17 +00003656 }
Michael J. Spencer20249a12010-10-21 03:16:25 +00003657
Rafael Espindola5389b842013-08-21 21:59:03 +00003658 virtual bool HandleTargetFeatures(std::vector<std::string> &Features,
3659 DiagnosticsEngine &Diags) {
Bob Wilsoncfaab002012-09-29 23:52:52 +00003660 FPU = 0;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003661 SoftFloat = SoftFloatABI = false;
3662 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3663 if (Features[i] == "+soft-float")
3664 SoftFloat = true;
3665 else if (Features[i] == "+soft-float-abi")
3666 SoftFloatABI = true;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003667 else if (Features[i] == "+vfp2")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003668 FPU |= VFP2FPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003669 else if (Features[i] == "+vfp3")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003670 FPU |= VFP3FPU;
3671 else if (Features[i] == "+vfp4")
3672 FPU |= VFP4FPU;
Daniel Dunbara91320b2009-12-21 23:28:17 +00003673 else if (Features[i] == "+neon")
Bob Wilsoncfaab002012-09-29 23:52:52 +00003674 FPU |= NeonFPU;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003675 }
3676
Rafael Espindola5389b842013-08-21 21:59:03 +00003677 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3678 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3679 return false;
3680 }
3681
3682 if (FPMath == FP_Neon)
3683 Features.push_back("+neonfp");
3684 else if (FPMath == FP_VFP)
3685 Features.push_back("-neonfp");
3686
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003687 // Remove front-end specific options which the backend handles differently.
3688 std::vector<std::string>::iterator it;
3689 it = std::find(Features.begin(), Features.end(), "+soft-float");
3690 if (it != Features.end())
3691 Features.erase(it);
3692 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3693 if (it != Features.end())
3694 Features.erase(it);
Rafael Espindola5389b842013-08-21 21:59:03 +00003695 return true;
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003696 }
3697
Douglas Gregore727d212012-01-30 06:38:25 +00003698 virtual bool hasFeature(StringRef Feature) const {
3699 return llvm::StringSwitch<bool>(Feature)
3700 .Case("arm", true)
3701 .Case("softfloat", SoftFloat)
3702 .Case("thumb", IsThumb)
3703 .Case("neon", FPU == NeonFPU && !SoftFloat &&
3704 StringRef(getCPUDefineSuffix(CPU)).startswith("7"))
3705 .Default(false);
3706 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003707 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner5f9e2722011-07-23 10:55:15 +00003708 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbareac7c532009-12-18 18:42:37 +00003709 return llvm::StringSwitch<const char*>(Name)
3710 .Cases("arm8", "arm810", "4")
3711 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3712 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3713 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3714 .Case("ep9312", "4T")
3715 .Cases("arm10tdmi", "arm1020t", "5T")
3716 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3717 .Case("arm926ej-s", "5TEJ")
3718 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3719 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003720 .Case("arm1136j-s", "6J")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003721 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbara91320b2009-12-21 23:28:17 +00003722 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003723 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonfc553452013-03-04 22:37:46 +00003724 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
3725 .Cases("cortex-a9", "cortex-a15", "7A")
Quentin Colombetab137512012-12-21 17:57:47 +00003726 .Case("cortex-r5", "7R")
Bob Wilson336bfa32012-09-29 23:52:50 +00003727 .Case("cortex-a9-mp", "7F")
3728 .Case("swift", "7S")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003729 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00003730 .Case("cortex-m0", "6M")
Joey Gouly4ec8d5b2013-06-26 17:19:48 +00003731 .Case("cortex-a53", "8A")
Daniel Dunbareac7c532009-12-18 18:42:37 +00003732 .Default(0);
3733 }
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003734 static const char *getCPUProfile(StringRef Name) {
3735 return llvm::StringSwitch<const char*>(Name)
3736 .Cases("cortex-a8", "cortex-a9", "A")
3737 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Quentin Colombetab137512012-12-21 17:57:47 +00003738 .Case("cortex-r5", "R")
Anton Korobeynikov8b0703d2012-09-08 08:22:13 +00003739 .Default("");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003740 }
Daniel Dunbareac7c532009-12-18 18:42:37 +00003741 virtual bool setCPU(const std::string &Name) {
3742 if (!getCPUDefineSuffix(Name))
3743 return false;
3744
3745 CPU = Name;
3746 return true;
3747 }
Rafael Espindola5389b842013-08-21 21:59:03 +00003748 virtual bool setFPMath(StringRef Name);
Chris Lattner33328642009-03-20 15:52:06 +00003749 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00003750 MacroBuilder &Builder) const {
Chris Lattnerc0f59212009-03-02 22:27:17 +00003751 // Target identification.
Benjamin Kramera9992772010-01-09 17:55:51 +00003752 Builder.defineMacro("__arm");
3753 Builder.defineMacro("__arm__");
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003754
Chris Lattnerc0f59212009-03-02 22:27:17 +00003755 // Target properties.
Benjamin Kramera9992772010-01-09 17:55:51 +00003756 Builder.defineMacro("__ARMEL__");
3757 Builder.defineMacro("__LITTLE_ENDIAN__");
3758 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003759
Chris Lattner5f9e2722011-07-23 10:55:15 +00003760 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramera9992772010-01-09 17:55:51 +00003761 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003762 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3763 StringRef CPUProfile = getCPUProfile(CPU);
3764 if (!CPUProfile.empty())
3765 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3766
Mike Stump437bb4b2009-04-08 02:07:04 +00003767 // Subtarget options.
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003768
Daniel Dunbareac7c532009-12-18 18:42:37 +00003769 // FIXME: It's more complicated than this and we don't really support
3770 // interworking.
3771 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramera9992772010-01-09 17:55:51 +00003772 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003773
David Tweedb16abb12012-10-25 13:33:01 +00003774 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Daniel Dunbar849289e2012-10-22 18:51:13 +00003775 // M-class CPUs on Darwin follow AAPCS, but not EABI.
Daniel Dunbar4d3ee9b2012-10-22 18:56:43 +00003776 if (!(getTriple().isOSDarwin() && CPUProfile == "M"))
Daniel Dunbar849289e2012-10-22 18:51:13 +00003777 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003778 Builder.defineMacro("__ARM_PCS", "1");
3779
David Tweedb16abb12012-10-25 13:33:01 +00003780 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikov70a5cca2012-09-08 08:08:27 +00003781 Builder.defineMacro("__ARM_PCS_VFP", "1");
3782 }
Daniel Dunbareac7c532009-12-18 18:42:37 +00003783
Daniel Dunbar97f52ac2009-12-19 04:15:38 +00003784 if (SoftFloat)
Benjamin Kramera9992772010-01-09 17:55:51 +00003785 Builder.defineMacro("__SOFTFP__");
Daniel Dunbareac7c532009-12-18 18:42:37 +00003786
3787 if (CPU == "xscale")
Benjamin Kramera9992772010-01-09 17:55:51 +00003788 Builder.defineMacro("__XSCALE__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003789
Bob Wilson84f95cf2011-05-13 18:56:03 +00003790 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003791 if (IsThumb) {
Benjamin Kramera9992772010-01-09 17:55:51 +00003792 Builder.defineMacro("__THUMBEL__");
3793 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00003794 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00003795 Builder.defineMacro("__thumb2__");
Daniel Dunbare1f63b32009-09-17 16:21:10 +00003796 }
3797
3798 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramera9992772010-01-09 17:55:51 +00003799 Builder.defineMacro("__APCS_32__");
Daniel Dunbara91320b2009-12-21 23:28:17 +00003800
Bob Wilsoncfaab002012-09-29 23:52:52 +00003801 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramera9992772010-01-09 17:55:51 +00003802 Builder.defineMacro("__VFP_FP__");
Bob Wilsoncfaab002012-09-29 23:52:52 +00003803 if (FPU & VFP2FPU)
3804 Builder.defineMacro("__ARM_VFPV2__");
3805 if (FPU & VFP3FPU)
3806 Builder.defineMacro("__ARM_VFPV3__");
3807 if (FPU & VFP4FPU)
3808 Builder.defineMacro("__ARM_VFPV4__");
3809 }
3810
Daniel Dunbara91320b2009-12-21 23:28:17 +00003811 // This only gets set when Neon instructions are actually available, unlike
3812 // the VFP define, hence the soft float and arch check. This is subtly
3813 // different from gcc, we follow the intent which was that it should be set
3814 // when Neon instructions are actually available.
Bob Wilsoncfaab002012-09-29 23:52:52 +00003815 if ((FPU & NeonFPU) && !SoftFloat && IsARMv7)
Benjamin Kramera9992772010-01-09 17:55:51 +00003816 Builder.defineMacro("__ARM_NEON__");
Chris Lattner393ff042008-04-21 18:56:49 +00003817 }
3818 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3819 unsigned &NumRecords) const {
Chris Lattner2752c012010-03-03 19:03:45 +00003820 Records = BuiltinInfo;
3821 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner393ff042008-04-21 18:56:49 +00003822 }
Bob Wilson8b30a932012-01-26 22:14:27 +00003823 virtual bool isCLZForZeroUndef() const { return false; }
Meador Ingec5613b22012-06-16 03:34:49 +00003824 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chieneae5a8202012-10-10 06:56:20 +00003825 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner393ff042008-04-21 18:56:49 +00003826 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003827 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003828 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00003829 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003830 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003831 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattner44def072009-04-26 07:16:29 +00003832 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson066d2ea2009-02-28 17:11:49 +00003833 switch (*Name) {
Eric Christophera0dfca12012-08-16 23:50:41 +00003834 default: break;
Nate Begemanad487f42008-04-22 05:03:19 +00003835 case 'l': // r0-r7
3836 case 'h': // r8-r15
3837 case 'w': // VFP Floating point register single precision
3838 case 'P': // VFP Floating point register double precision
Chris Lattner44def072009-04-26 07:16:29 +00003839 Info.setAllowsRegister();
Nate Begemanad487f42008-04-22 05:03:19 +00003840 return true;
Eric Christopher895d4222011-07-29 21:20:35 +00003841 case 'Q': // A memory address that is a single base register.
3842 Info.setAllowsMemory();
3843 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00003844 case 'U': // a memory reference...
3845 switch (Name[1]) {
3846 case 'q': // ...ARMV4 ldrsb
3847 case 'v': // ...VFP load/store (reg+constant offset)
3848 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00003849 case 't': // address valid for load/store opaque types wider
Eric Christopher825d3862012-11-14 22:08:59 +00003850 // than 128-bits
Eric Christopherdda231a2011-06-17 01:40:49 +00003851 case 'n': // valid address for Neon doubleword vector load/store
3852 case 'm': // valid address for Neon element and structure load/store
3853 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopher825d3862012-11-14 22:08:59 +00003854 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00003855 Info.setAllowsMemory();
3856 Name++;
3857 return true;
3858 }
Nate Begemanad487f42008-04-22 05:03:19 +00003859 }
Chris Lattner393ff042008-04-21 18:56:49 +00003860 return false;
3861 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00003862 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00003863 std::string R;
3864 switch (*Constraint) {
3865 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00003866 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00003867 Constraint++;
3868 break;
Eric Christopher283f4472011-06-17 00:40:18 +00003869 case 'p': // 'p' should be translated to 'r' by default.
3870 R = std::string("r");
3871 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00003872 default:
3873 return std::string(1, *Constraint);
3874 }
3875 return R;
3876 }
Bill Wendling50d46ca2012-10-25 23:28:48 +00003877 virtual bool validateConstraintModifier(StringRef Constraint,
3878 const char Modifier,
3879 unsigned Size) const {
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00003880 bool isOutput = (Constraint[0] == '=');
Bill Wendling6e6330c2012-11-30 23:46:56 +00003881 bool isInOut = (Constraint[0] == '+');
Bill Wendlinge2dbaa92012-11-30 23:18:12 +00003882
Bill Wendling50d46ca2012-10-25 23:28:48 +00003883 // Strip off constraint modifiers.
3884 while (Constraint[0] == '=' ||
3885 Constraint[0] == '+' ||
3886 Constraint[0] == '&')
3887 Constraint = Constraint.substr(1);
3888
3889 switch (Constraint[0]) {
3890 default: break;
3891 case 'r': {
3892 switch (Modifier) {
3893 default:
Bob Wilson221a8902013-06-03 23:57:13 +00003894 return (isInOut || isOutput || Size <= 32);
Bill Wendling50d46ca2012-10-25 23:28:48 +00003895 case 'q':
3896 // A register of size 32 cannot fit a vector type.
3897 return false;
3898 }
3899 }
3900 }
3901
3902 return true;
3903 }
Chris Lattner393ff042008-04-21 18:56:49 +00003904 virtual const char *getClobbers() const {
Eli Friedmana9f54962008-08-20 07:44:10 +00003905 // FIXME: Is this really right?
Chris Lattner393ff042008-04-21 18:56:49 +00003906 return "";
3907 }
Aaron Ballman82bfa192012-10-02 14:26:08 +00003908
3909 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3910 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
3911 }
Logan Chiena8f7a972013-02-23 04:24:36 +00003912
3913 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
3914 if (RegNo == 0) return 0;
3915 if (RegNo == 1) return 1;
3916 return -1;
3917 }
Chris Lattner393ff042008-04-21 18:56:49 +00003918};
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003919
Rafael Espindola5389b842013-08-21 21:59:03 +00003920bool ARMTargetInfo::setFPMath(StringRef Name) {
3921 if (Name == "neon") {
3922 FPMath = FP_Neon;
3923 return true;
3924 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
3925 Name == "vfp4") {
3926 FPMath = FP_VFP;
3927 return true;
3928 }
3929 return false;
3930}
3931
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003932const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003933 // Integer registers
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003934 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003935 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
3936
3937 // Float registers
3938 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3939 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3940 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003941 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbarbf3d5522010-08-11 02:17:20 +00003942
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003943 // Double registers
3944 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3945 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend1455352010-10-28 01:05:37 +00003946 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3947 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003948
3949 // Quad registers
Dale Johannesend1455352010-10-28 01:05:37 +00003950 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3951 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003952};
3953
3954void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar1fd71712010-08-11 02:17:11 +00003955 unsigned &NumNames) const {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003956 Names = GCCRegNames;
3957 NumNames = llvm::array_lengthof(GCCRegNames);
3958}
3959
3960const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003961 { { "a1" }, "r0" },
3962 { { "a2" }, "r1" },
3963 { { "a3" }, "r2" },
3964 { { "a4" }, "r3" },
3965 { { "v1" }, "r4" },
3966 { { "v2" }, "r5" },
3967 { { "v3" }, "r6" },
3968 { { "v4" }, "r7" },
3969 { { "v5" }, "r8" },
3970 { { "v6", "rfp" }, "r9" },
3971 { { "sl" }, "r10" },
3972 { { "fp" }, "r11" },
3973 { { "ip" }, "r12" },
Daniel Dunbar1fd71712010-08-11 02:17:11 +00003974 { { "r13" }, "sp" },
3975 { { "r14" }, "lr" },
3976 { { "r15" }, "pc" },
Dale Johannesen20eb49b2010-10-27 23:34:42 +00003977 // The S, D and Q registers overlap, but aren't really aliases; we
3978 // don't want to substitute one of these for a different-sized one.
Daniel Dunbarc1f2cdd2009-09-17 07:03:19 +00003979};
3980
3981void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3982 unsigned &NumAliases) const {
3983 Aliases = GCCRegAliases;
3984 NumAliases = llvm::array_lengthof(GCCRegAliases);
3985}
Chris Lattner2752c012010-03-03 19:03:45 +00003986
3987const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00003988#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00003989#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00003990 ALL_LANGUAGES },
Chris Lattner2752c012010-03-03 19:03:45 +00003991#include "clang/Basic/BuiltinsARM.def"
3992};
Chris Lattner393ff042008-04-21 18:56:49 +00003993} // end anonymous namespace.
3994
Eli Friedmana9f54962008-08-20 07:44:10 +00003995namespace {
Mike Stump1eb44332009-09-09 15:08:12 +00003996class DarwinARMTargetInfo :
Torok Edwin5f6c1942009-06-30 17:10:35 +00003997 public DarwinTargetInfo<ARMTargetInfo> {
3998protected:
Daniel Dunbar1752ee42009-08-24 09:10:05 +00003999 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramera9992772010-01-09 17:55:51 +00004000 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00004001 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmanb030f022009-04-19 21:38:35 +00004002 }
Eli Friedmana9f54962008-08-20 07:44:10 +00004003
Torok Edwin5f6c1942009-06-30 17:10:35 +00004004public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004005 DarwinARMTargetInfo(const llvm::Triple &Triple)
4006 : DarwinTargetInfo<ARMTargetInfo>(Triple) {
Daniel Dunbar350b9f32010-05-27 07:00:26 +00004007 HasAlignMac68kSupport = true;
Eli Friedman2be46072011-10-14 20:59:01 +00004008 // iOS always has 64-bit atomic instructions.
4009 // FIXME: This should be based off of the target features in ARMTargetInfo.
4010 MaxAtomicInlineWidth = 64;
John McCallb8b2c9d2013-01-25 22:30:49 +00004011
4012 // Darwin on iOS uses a variant of the ARM C++ ABI.
4013 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar350b9f32010-05-27 07:00:26 +00004014 }
Eli Friedmana9f54962008-08-20 07:44:10 +00004015};
4016} // end anonymous namespace.
4017
Tony Linthicum96319392011-12-12 21:14:55 +00004018
4019namespace {
4020// Hexagon abstract base class
4021class HexagonTargetInfo : public TargetInfo {
4022 static const Builtin::Info BuiltinInfo[];
4023 static const char * const GCCRegNames[];
4024 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4025 std::string CPU;
4026public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004027 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004028 BigEndian = false;
Tony Linthicum96319392011-12-12 21:14:55 +00004029 DescriptionString = ("e-p:32:32:32-"
Anshuman Dasgupta1a090f12013-01-02 21:25:57 +00004030 "i64:64:64-i32:32:32-i16:16:16-i1:32:32-"
Sirish Pande5f9688b2012-05-10 20:19:54 +00004031 "f64:64:64-f32:32:32-a0:0-n32");
Tony Linthicum96319392011-12-12 21:14:55 +00004032
4033 // {} in inline assembly are packet specifiers, not assembly variant
4034 // specifiers.
4035 NoAsmVariants = true;
4036 }
4037
4038 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4039 unsigned &NumRecords) const {
4040 Records = BuiltinInfo;
4041 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4042 }
4043
4044 virtual bool validateAsmConstraint(const char *&Name,
4045 TargetInfo::ConstraintInfo &Info) const {
4046 return true;
4047 }
4048
4049 virtual void getTargetDefines(const LangOptions &Opts,
4050 MacroBuilder &Builder) const;
4051
Douglas Gregore727d212012-01-30 06:38:25 +00004052 virtual bool hasFeature(StringRef Feature) const {
4053 return Feature == "hexagon";
4054 }
4055
Meador Ingec5613b22012-06-16 03:34:49 +00004056 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4057 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum96319392011-12-12 21:14:55 +00004058 }
4059 virtual void getGCCRegNames(const char * const *&Names,
4060 unsigned &NumNames) const;
4061 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4062 unsigned &NumAliases) const;
4063 virtual const char *getClobbers() const {
4064 return "";
4065 }
Sebastian Pop43115d42012-01-13 20:37:10 +00004066
4067 static const char *getHexagonCPUSuffix(StringRef Name) {
4068 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop43115d42012-01-13 20:37:10 +00004069 .Case("hexagonv4", "4")
Sirish Pande5f9688b2012-05-10 20:19:54 +00004070 .Case("hexagonv5", "5")
Sebastian Pop43115d42012-01-13 20:37:10 +00004071 .Default(0);
4072 }
4073
Tony Linthicum96319392011-12-12 21:14:55 +00004074 virtual bool setCPU(const std::string &Name) {
Sebastian Pop43115d42012-01-13 20:37:10 +00004075 if (!getHexagonCPUSuffix(Name))
4076 return false;
4077
Tony Linthicum96319392011-12-12 21:14:55 +00004078 CPU = Name;
4079 return true;
4080 }
4081};
4082
4083void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4084 MacroBuilder &Builder) const {
4085 Builder.defineMacro("qdsp6");
4086 Builder.defineMacro("__qdsp6", "1");
4087 Builder.defineMacro("__qdsp6__", "1");
4088
4089 Builder.defineMacro("hexagon");
4090 Builder.defineMacro("__hexagon", "1");
4091 Builder.defineMacro("__hexagon__", "1");
4092
4093 if(CPU == "hexagonv1") {
4094 Builder.defineMacro("__HEXAGON_V1__");
4095 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4096 if(Opts.HexagonQdsp6Compat) {
4097 Builder.defineMacro("__QDSP6_V1__");
4098 Builder.defineMacro("__QDSP6_ARCH__", "1");
4099 }
4100 }
4101 else if(CPU == "hexagonv2") {
4102 Builder.defineMacro("__HEXAGON_V2__");
4103 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4104 if(Opts.HexagonQdsp6Compat) {
4105 Builder.defineMacro("__QDSP6_V2__");
4106 Builder.defineMacro("__QDSP6_ARCH__", "2");
4107 }
4108 }
4109 else if(CPU == "hexagonv3") {
4110 Builder.defineMacro("__HEXAGON_V3__");
4111 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4112 if(Opts.HexagonQdsp6Compat) {
4113 Builder.defineMacro("__QDSP6_V3__");
4114 Builder.defineMacro("__QDSP6_ARCH__", "3");
4115 }
4116 }
4117 else if(CPU == "hexagonv4") {
4118 Builder.defineMacro("__HEXAGON_V4__");
4119 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4120 if(Opts.HexagonQdsp6Compat) {
4121 Builder.defineMacro("__QDSP6_V4__");
4122 Builder.defineMacro("__QDSP6_ARCH__", "4");
4123 }
4124 }
Sirish Pande5f9688b2012-05-10 20:19:54 +00004125 else if(CPU == "hexagonv5") {
4126 Builder.defineMacro("__HEXAGON_V5__");
4127 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4128 if(Opts.HexagonQdsp6Compat) {
4129 Builder.defineMacro("__QDSP6_V5__");
4130 Builder.defineMacro("__QDSP6_ARCH__", "5");
4131 }
4132 }
Tony Linthicum96319392011-12-12 21:14:55 +00004133}
4134
4135const char * const HexagonTargetInfo::GCCRegNames[] = {
4136 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4137 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4138 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4139 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4140 "p0", "p1", "p2", "p3",
4141 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4142};
4143
4144void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4145 unsigned &NumNames) const {
4146 Names = GCCRegNames;
4147 NumNames = llvm::array_lengthof(GCCRegNames);
4148}
4149
4150
4151const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4152 { { "sp" }, "r29" },
4153 { { "fp" }, "r30" },
4154 { { "lr" }, "r31" },
4155 };
4156
4157void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4158 unsigned &NumAliases) const {
4159 Aliases = GCCRegAliases;
4160 NumAliases = llvm::array_lengthof(GCCRegAliases);
4161}
4162
4163
4164const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4165#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4166#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4167 ALL_LANGUAGES },
4168#include "clang/Basic/BuiltinsHexagon.def"
4169};
4170}
4171
4172
Reid Spencer5f016e22007-07-11 17:01:13 +00004173namespace {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004174// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4175class SparcTargetInfo : public TargetInfo {
Chris Lattnere957f532009-01-27 01:58:38 +00004176 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4177 static const char * const GCCRegNames[];
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004178 bool SoftFloat;
Gabor Greif26658672008-02-21 16:29:08 +00004179public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004180 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004181
Rafael Espindola5389b842013-08-21 21:59:03 +00004182 virtual bool HandleTargetFeatures(std::vector<std::string> &Features,
4183 DiagnosticsEngine &Diags) {
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004184 SoftFloat = false;
4185 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4186 if (Features[i] == "+soft-float")
4187 SoftFloat = true;
Rafael Espindola5389b842013-08-21 21:59:03 +00004188 return true;
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004189 }
Chris Lattner33328642009-03-20 15:52:06 +00004190 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004191 MacroBuilder &Builder) const {
4192 DefineStd(Builder, "sparc", Opts);
Benjamin Kramera9992772010-01-09 17:55:51 +00004193 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes9284d212010-11-09 17:21:19 +00004194
4195 if (SoftFloat)
4196 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif26658672008-02-21 16:29:08 +00004197 }
Douglas Gregore727d212012-01-30 06:38:25 +00004198
4199 virtual bool hasFeature(StringRef Feature) const {
4200 return llvm::StringSwitch<bool>(Feature)
4201 .Case("softfloat", SoftFloat)
4202 .Case("sparc", true)
4203 .Default(false);
4204 }
4205
Gabor Greif26658672008-02-21 16:29:08 +00004206 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4207 unsigned &NumRecords) const {
Eli Friedman01b86682008-08-20 07:28:14 +00004208 // FIXME: Implement!
Gabor Greif26658672008-02-21 16:29:08 +00004209 }
Meador Ingec5613b22012-06-16 03:34:49 +00004210 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4211 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif26658672008-02-21 16:29:08 +00004212 }
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004213 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnere957f532009-01-27 01:58:38 +00004214 unsigned &NumNames) const;
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004215 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnere957f532009-01-27 01:58:38 +00004216 unsigned &NumAliases) const;
Anders Carlsson066d2ea2009-02-28 17:11:49 +00004217 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif26658672008-02-21 16:29:08 +00004218 TargetInfo::ConstraintInfo &info) const {
Eli Friedman01b86682008-08-20 07:28:14 +00004219 // FIXME: Implement!
4220 return false;
Gabor Greif26658672008-02-21 16:29:08 +00004221 }
4222 virtual const char *getClobbers() const {
Eli Friedman01b86682008-08-20 07:28:14 +00004223 // FIXME: Implement!
4224 return "";
Gabor Greif26658672008-02-21 16:29:08 +00004225 }
4226};
4227
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004228const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattnere957f532009-01-27 01:58:38 +00004229 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4230 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4231 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4232 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4233};
4234
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004235void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4236 unsigned &NumNames) const {
Chris Lattnere957f532009-01-27 01:58:38 +00004237 Names = GCCRegNames;
4238 NumNames = llvm::array_lengthof(GCCRegNames);
4239}
4240
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004241const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikova7c47172009-05-03 13:42:53 +00004242 { { "g0" }, "r0" },
4243 { { "g1" }, "r1" },
4244 { { "g2" }, "r2" },
4245 { { "g3" }, "r3" },
4246 { { "g4" }, "r4" },
4247 { { "g5" }, "r5" },
4248 { { "g6" }, "r6" },
4249 { { "g7" }, "r7" },
4250 { { "o0" }, "r8" },
4251 { { "o1" }, "r9" },
4252 { { "o2" }, "r10" },
4253 { { "o3" }, "r11" },
4254 { { "o4" }, "r12" },
4255 { { "o5" }, "r13" },
4256 { { "o6", "sp" }, "r14" },
4257 { { "o7" }, "r15" },
4258 { { "l0" }, "r16" },
4259 { { "l1" }, "r17" },
4260 { { "l2" }, "r18" },
4261 { { "l3" }, "r19" },
4262 { { "l4" }, "r20" },
4263 { { "l5" }, "r21" },
4264 { { "l6" }, "r22" },
4265 { { "l7" }, "r23" },
4266 { { "i0" }, "r24" },
4267 { { "i1" }, "r25" },
4268 { { "i2" }, "r26" },
4269 { { "i3" }, "r27" },
4270 { { "i4" }, "r28" },
4271 { { "i5" }, "r29" },
4272 { { "i6", "fp" }, "r30" },
4273 { { "i7" }, "r31" },
Chris Lattnere957f532009-01-27 01:58:38 +00004274};
4275
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004276void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4277 unsigned &NumAliases) const {
Chris Lattnere957f532009-01-27 01:58:38 +00004278 Aliases = GCCRegAliases;
4279 NumAliases = llvm::array_lengthof(GCCRegAliases);
4280}
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004281
4282// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4283class SparcV8TargetInfo : public SparcTargetInfo {
4284public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004285 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004286 // FIXME: Support Sparc quad-precision long double?
4287 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
4288 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
4289 }
4290
4291 virtual void getTargetDefines(const LangOptions &Opts,
4292 MacroBuilder &Builder) const {
4293 SparcTargetInfo::getTargetDefines(Opts, Builder);
4294 Builder.defineMacro("__sparcv8");
4295 }
4296};
4297
4298// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4299class SparcV9TargetInfo : public SparcTargetInfo {
4300public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004301 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004302 // FIXME: Support Sparc quad-precision long double?
4303 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
4304 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32:64-S128";
Jakob Stoklund Olesenfcec0c92013-05-15 03:22:33 +00004305 // This is an LP64 platform.
4306 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen5ac8c4f2013-05-19 17:53:37 +00004307
4308 // OpenBSD uses long long for int64_t and intmax_t.
4309 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4310 IntMaxType = SignedLongLong;
4311 UIntMaxType = UnsignedLongLong;
4312 } else {
4313 IntMaxType = SignedLong;
4314 UIntMaxType = UnsignedLong;
4315 }
4316 Int64Type = IntMaxType;
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004317 }
4318
4319 virtual void getTargetDefines(const LangOptions &Opts,
4320 MacroBuilder &Builder) const {
4321 SparcTargetInfo::getTargetDefines(Opts, Builder);
4322 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesen44f72d32013-04-24 04:36:38 +00004323 Builder.defineMacro("__arch64__");
4324 // Solaris and its derivative AuroraUX don't need these variants, but the
4325 // BSDs do.
4326 if (getTriple().getOS() != llvm::Triple::Solaris &&
4327 getTriple().getOS() != llvm::Triple::AuroraUX) {
4328 Builder.defineMacro("__sparc64__");
4329 Builder.defineMacro("__sparc_v9__");
4330 Builder.defineMacro("__sparcv9__");
4331 }
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00004332 }
4333};
4334
Gabor Greif26658672008-02-21 16:29:08 +00004335} // end anonymous namespace.
4336
Eli Friedman01b86682008-08-20 07:28:14 +00004337namespace {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004338class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4339public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004340 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4341 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00004342 SizeType = UnsignedInt;
4343 PtrDiffType = SignedInt;
4344 }
4345};
Torok Edwin5f6c1942009-06-30 17:10:35 +00004346class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedman01b86682008-08-20 07:28:14 +00004347public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004348 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
4349 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmanf509d732008-11-02 02:43:55 +00004350 SizeType = UnsignedInt;
4351 PtrDiffType = SignedInt;
Eli Friedman01b86682008-08-20 07:28:14 +00004352 }
4353};
4354} // end anonymous namespace.
Reid Spencer5f016e22007-07-11 17:01:13 +00004355
Chris Lattner2621fd12008-05-08 05:58:21 +00004356namespace {
Ulrich Weigandb8409212013-05-06 16:26:41 +00004357 class SystemZTargetInfo : public TargetInfo {
4358 static const char *const GCCRegNames[];
4359
4360 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004361 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Ulrich Weigandb8409212013-05-06 16:26:41 +00004362 TLSSupported = true;
4363 IntWidth = IntAlign = 32;
4364 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
4365 PointerWidth = PointerAlign = 64;
4366 LongDoubleWidth = 128;
4367 LongDoubleAlign = 64;
4368 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4369 MinGlobalAlign = 16;
4370 DescriptionString = "E-p:64:64:64-i1:8:16-i8:8:16-i16:16-i32:32-i64:64"
4371 "-f32:32-f64:64-f128:64-a0:8:16-n32:64";
4372 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4373 }
4374 virtual void getTargetDefines(const LangOptions &Opts,
4375 MacroBuilder &Builder) const {
4376 Builder.defineMacro("__s390__");
4377 Builder.defineMacro("__s390x__");
4378 Builder.defineMacro("__zarch__");
4379 Builder.defineMacro("__LONG_DOUBLE_128__");
4380 }
4381 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4382 unsigned &NumRecords) const {
4383 // FIXME: Implement.
4384 Records = 0;
4385 NumRecords = 0;
4386 }
4387
4388 virtual void getGCCRegNames(const char *const *&Names,
4389 unsigned &NumNames) const;
4390 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4391 unsigned &NumAliases) const {
4392 // No aliases.
4393 Aliases = 0;
4394 NumAliases = 0;
4395 }
4396 virtual bool validateAsmConstraint(const char *&Name,
4397 TargetInfo::ConstraintInfo &info) const;
4398 virtual const char *getClobbers() const {
4399 // FIXME: Is this really right?
4400 return "";
4401 }
4402 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4403 return TargetInfo::SystemZBuiltinVaList;
4404 }
Richard Sandiford5c92b9a2013-07-19 16:51:51 +00004405 virtual bool setCPU(const std::string &Name) {
4406 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4407 .Case("z10", true)
4408 .Case("z196", true)
4409 .Case("zEC12", true)
4410 .Default(false);
4411
4412 // No need to store the CPU yet. There aren't any CPU-specific
4413 // macros to define.
4414 return CPUKnown;
4415 }
Ulrich Weigandb8409212013-05-06 16:26:41 +00004416 };
4417
4418 const char *const SystemZTargetInfo::GCCRegNames[] = {
4419 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4420 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4421 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
4422 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
4423 };
4424
4425 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
4426 unsigned &NumNames) const {
4427 Names = GCCRegNames;
4428 NumNames = llvm::array_lengthof(GCCRegNames);
4429 }
4430
4431 bool SystemZTargetInfo::
4432 validateAsmConstraint(const char *&Name,
4433 TargetInfo::ConstraintInfo &Info) const {
4434 switch (*Name) {
4435 default:
4436 return false;
4437
4438 case 'a': // Address register
4439 case 'd': // Data register (equivalent to 'r')
4440 case 'f': // Floating-point register
4441 Info.setAllowsRegister();
4442 return true;
4443
4444 case 'I': // Unsigned 8-bit constant
4445 case 'J': // Unsigned 12-bit constant
4446 case 'K': // Signed 16-bit constant
4447 case 'L': // Signed 20-bit displacement (on all targets we support)
4448 case 'M': // 0x7fffffff
4449 return true;
4450
4451 case 'Q': // Memory with base and unsigned 12-bit displacement
4452 case 'R': // Likewise, plus an index
4453 case 'S': // Memory with base and signed 20-bit displacement
4454 case 'T': // Likewise, plus an index
4455 Info.setAllowsMemory();
4456 return true;
4457 }
4458 }
4459}
4460
4461namespace {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004462 class MSP430TargetInfo : public TargetInfo {
4463 static const char * const GCCRegNames[];
4464 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004465 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004466 BigEndian = false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004467 TLSSupported = false;
Anton Korobeynikov09f52a62010-01-30 12:55:11 +00004468 IntWidth = 16; IntAlign = 16;
4469 LongWidth = 32; LongLongWidth = 64;
4470 LongAlign = LongLongAlign = 16;
4471 PointerWidth = 16; PointerAlign = 16;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004472 SuitableAlign = 16;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004473 SizeType = UnsignedInt;
Anton Korobeynikov18a295d2013-07-01 19:42:40 +00004474 IntMaxType = SignedLongLong;
4475 UIntMaxType = UnsignedLongLong;
4476 IntPtrType = SignedInt;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004477 PtrDiffType = SignedInt;
Edward O'Callaghan9cf910e2009-11-21 00:49:54 +00004478 SigAtomicType = SignedLong;
Anton Korobeynikov5d7c2512009-12-19 01:32:37 +00004479 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004480 }
4481 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004482 MacroBuilder &Builder) const {
4483 Builder.defineMacro("MSP430");
4484 Builder.defineMacro("__MSP430__");
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004485 // FIXME: defines for different 'flavours' of MCU
4486 }
4487 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4488 unsigned &NumRecords) const {
4489 // FIXME: Implement.
4490 Records = 0;
4491 NumRecords = 0;
4492 }
Douglas Gregore727d212012-01-30 06:38:25 +00004493 virtual bool hasFeature(StringRef Feature) const {
4494 return Feature == "msp430";
4495 }
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004496 virtual void getGCCRegNames(const char * const *&Names,
4497 unsigned &NumNames) const;
4498 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4499 unsigned &NumAliases) const {
4500 // No aliases.
4501 Aliases = 0;
4502 NumAliases = 0;
4503 }
4504 virtual bool validateAsmConstraint(const char *&Name,
4505 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov03265b62009-10-15 23:17:13 +00004506 // No target constraints for now.
4507 return false;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004508 }
4509 virtual const char *getClobbers() const {
4510 // FIXME: Is this really right?
4511 return "";
4512 }
Meador Ingec5613b22012-06-16 03:34:49 +00004513 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004514 // FIXME: implement
Meador Ingec5613b22012-06-16 03:34:49 +00004515 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikov73c64e52009-05-03 13:43:08 +00004516 }
4517 };
4518
4519 const char * const MSP430TargetInfo::GCCRegNames[] = {
4520 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4521 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4522 };
4523
4524 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4525 unsigned &NumNames) const {
4526 Names = GCCRegNames;
4527 NumNames = llvm::array_lengthof(GCCRegNames);
4528 }
4529}
4530
Jakob Stoklund Olesen1eb43432009-08-17 20:08:44 +00004531namespace {
Eli Friedmanb63decf2009-08-19 20:47:07 +00004532
Mike Stump1eb44332009-09-09 15:08:12 +00004533 // LLVM and Clang cannot be used directly to output native binaries for
4534 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanb63decf2009-08-19 20:47:07 +00004535 // type and alignment information.
Mike Stump1eb44332009-09-09 15:08:12 +00004536 //
4537 // TCE uses the llvm bitcode as input and uses it for generating customized
4538 // target processor and program binary. TCE co-design environment is
Eli Friedmanb63decf2009-08-19 20:47:07 +00004539 // publicly available in http://tce.cs.tut.fi
4540
Eli Friedman209f5bb2011-10-07 19:51:42 +00004541 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4542 3, // opencl_global
4543 4, // opencl_local
Peter Collingbourne4dc34eb2012-05-20 21:08:35 +00004544 5, // opencl_constant
4545 0, // cuda_device
4546 0, // cuda_constant
4547 0 // cuda_shared
Eli Friedman209f5bb2011-10-07 19:51:42 +00004548 };
4549
Eli Friedmanb63decf2009-08-19 20:47:07 +00004550 class TCETargetInfo : public TargetInfo{
4551 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004552 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmanb63decf2009-08-19 20:47:07 +00004553 TLSSupported = false;
4554 IntWidth = 32;
4555 LongWidth = LongLongWidth = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004556 PointerWidth = 32;
4557 IntAlign = 32;
4558 LongAlign = LongLongAlign = 32;
4559 PointerAlign = 32;
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004560 SuitableAlign = 32;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004561 SizeType = UnsignedInt;
4562 IntMaxType = SignedLong;
4563 UIntMaxType = UnsignedLong;
4564 IntPtrType = SignedInt;
4565 PtrDiffType = SignedInt;
4566 FloatWidth = 32;
4567 FloatAlign = 32;
4568 DoubleWidth = 32;
4569 DoubleAlign = 32;
4570 LongDoubleWidth = 32;
4571 LongDoubleAlign = 32;
4572 FloatFormat = &llvm::APFloat::IEEEsingle;
4573 DoubleFormat = &llvm::APFloat::IEEEsingle;
4574 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00004575 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
4576 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00004577 "f32:32:32-f64:32:32-v64:32:32-"
4578 "v128:32:32-a0:0:32-n32";
Eli Friedman209f5bb2011-10-07 19:51:42 +00004579 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004580 }
4581
4582 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramera9992772010-01-09 17:55:51 +00004583 MacroBuilder &Builder) const {
4584 DefineStd(Builder, "tce", Opts);
4585 Builder.defineMacro("__TCE__");
4586 Builder.defineMacro("__TCE_V1__");
Eli Friedmanb63decf2009-08-19 20:47:07 +00004587 }
Douglas Gregore727d212012-01-30 06:38:25 +00004588 virtual bool hasFeature(StringRef Feature) const {
4589 return Feature == "tce";
4590 }
4591
Eli Friedmanb63decf2009-08-19 20:47:07 +00004592 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4593 unsigned &NumRecords) const {}
Daniel Dunbar55cc2ed2009-08-24 09:54:37 +00004594 virtual const char *getClobbers() const {
4595 return "";
4596 }
Meador Ingec5613b22012-06-16 03:34:49 +00004597 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4598 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmanb63decf2009-08-19 20:47:07 +00004599 }
Eli Friedmanb63decf2009-08-19 20:47:07 +00004600 virtual void getGCCRegNames(const char * const *&Names,
4601 unsigned &NumNames) const {}
4602 virtual bool validateAsmConstraint(const char *&Name,
4603 TargetInfo::ConstraintInfo &info) const {
4604 return true;
4605 }
4606 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4607 unsigned &NumAliases) const {}
4608 };
4609}
4610
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004611namespace {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004612class MipsTargetInfoBase : public TargetInfo {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004613 static const Builtin::Info BuiltinInfo[];
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004614 std::string CPU;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004615 bool IsMips16;
Simon Atanasyan321ae792013-04-14 14:07:51 +00004616 bool IsMicromips;
Simon Atanasyand96e3152013-04-14 14:07:30 +00004617 bool IsSingleFloat;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004618 enum MipsFloatABI {
Simon Atanasyand96e3152013-04-14 14:07:30 +00004619 HardFloat, SoftFloat
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004620 } FloatABI;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004621 enum DspRevEnum {
4622 NoDSP, DSP1, DSP2
4623 } DspRev;
Jack Carterc613b672013-08-12 17:20:29 +00004624 bool HasMSA;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004625
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004626protected:
4627 std::string ABI;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004628
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004629public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004630 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
4631 const std::string &CPUStr)
4632 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Jack Carterc613b672013-08-12 17:20:29 +00004633 IsSingleFloat(false), FloatABI(HardFloat), DspRev(NoDSP),
4634 HasMSA(false), ABI(ABIStr) {}
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004635
Eric Christophered734732010-03-02 02:41:08 +00004636 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004637 virtual bool setABI(const std::string &Name) = 0;
Eric Christophered734732010-03-02 02:41:08 +00004638 virtual bool setCPU(const std::string &Name) {
4639 CPU = Name;
4640 return true;
4641 }
Chandler Carruthc3a2e652011-09-28 05:56:05 +00004642 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christophered734732010-03-02 02:41:08 +00004643 Features[ABI] = true;
4644 Features[CPU] = true;
4645 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004646
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004647 virtual void getTargetDefines(const LangOptions &Opts,
4648 MacroBuilder &Builder) const {
Simon Atanasyand4935a02012-08-29 19:14:58 +00004649 DefineStd(Builder, "mips", Opts);
4650 Builder.defineMacro("_mips");
4651 Builder.defineMacro("__REGISTER_PREFIX__", "");
4652
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004653 switch (FloatABI) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004654 case HardFloat:
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00004655 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004656 break;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004657 case SoftFloat:
4658 Builder.defineMacro("__mips_soft_float", Twine(1));
4659 break;
Simon Atanasyan3dbcc882012-06-05 13:06:56 +00004660 }
Simon Atanasyan90913892012-04-05 19:28:31 +00004661
Simon Atanasyand96e3152013-04-14 14:07:30 +00004662 if (IsSingleFloat)
4663 Builder.defineMacro("__mips_single_float", Twine(1));
4664
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004665 if (IsMips16)
4666 Builder.defineMacro("__mips16", Twine(1));
4667
Simon Atanasyan321ae792013-04-14 14:07:51 +00004668 if (IsMicromips)
4669 Builder.defineMacro("__mips_micromips", Twine(1));
4670
Simon Atanasyana1b62272012-07-05 20:16:22 +00004671 switch (DspRev) {
4672 default:
4673 break;
4674 case DSP1:
4675 Builder.defineMacro("__mips_dsp_rev", Twine(1));
4676 Builder.defineMacro("__mips_dsp", Twine(1));
4677 break;
4678 case DSP2:
4679 Builder.defineMacro("__mips_dsp_rev", Twine(2));
4680 Builder.defineMacro("__mips_dspr2", Twine(1));
4681 Builder.defineMacro("__mips_dsp", Twine(1));
4682 break;
4683 }
4684
Jack Carterc613b672013-08-12 17:20:29 +00004685 if (HasMSA)
4686 Builder.defineMacro("__mips_msa", Twine(1));
4687
Simon Atanasyan90913892012-04-05 19:28:31 +00004688 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4689 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4690 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan260e5062012-08-29 15:17:29 +00004691
4692 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4693 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004694 }
4695
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004696 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4697 unsigned &NumRecords) const {
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004698 Records = BuiltinInfo;
4699 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004700 }
Douglas Gregore727d212012-01-30 06:38:25 +00004701 virtual bool hasFeature(StringRef Feature) const {
4702 return Feature == "mips";
4703 }
Meador Ingec5613b22012-06-16 03:34:49 +00004704 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4705 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004706 }
4707 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004708 unsigned &NumNames) const {
4709 static const char * const GCCRegNames[] = {
Eric Christopherd1f853d2012-03-27 19:56:11 +00004710 // CPU register names
4711 // Must match second column of GCCRegAliases
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004712 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
4713 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
4714 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopherd1f853d2012-03-27 19:56:11 +00004715 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
4716 // Floating point register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004717 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
4718 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4719 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4720 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopherd1f853d2012-03-27 19:56:11 +00004721 // Hi/lo and condition register names
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004722 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
4723 "$fcc5","$fcc6","$fcc7"
4724 };
4725 Names = GCCRegNames;
4726 NumNames = llvm::array_lengthof(GCCRegNames);
4727 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004728 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004729 unsigned &NumAliases) const = 0;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004730 virtual bool validateAsmConstraint(const char *&Name,
4731 TargetInfo::ConstraintInfo &Info) const {
4732 switch (*Name) {
4733 default:
Douglas Gregor21a25162011-11-02 20:52:01 +00004734 return false;
4735
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004736 case 'r': // CPU registers.
4737 case 'd': // Equivalent to "r" unless generating MIPS16 code.
4738 case 'y': // Equivalent to "r", backwards compatibility only.
4739 case 'f': // floating-point registers.
Eric Christopher0ea61642012-04-03 01:16:32 +00004740 case 'c': // $25 for indirect jumps
4741 case 'l': // lo register
4742 case 'x': // hilo register pair
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004743 Info.setAllowsRegister();
4744 return true;
Jack Carter97102302013-03-05 19:10:54 +00004745 case 'R': // An address that can be used in a non-macro load or store
Jack Carterd2ab6d32013-03-04 21:36:11 +00004746 Info.setAllowsMemory();
4747 return true;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004748 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004749 }
4750
4751 virtual const char *getClobbers() const {
4752 // FIXME: Implement!
4753 return "";
4754 }
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004755
Rafael Espindola5389b842013-08-21 21:59:03 +00004756 virtual bool HandleTargetFeatures(std::vector<std::string> &Features,
4757 DiagnosticsEngine &Diags) {
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004758 IsMips16 = false;
Simon Atanasyan321ae792013-04-14 14:07:51 +00004759 IsMicromips = false;
Simon Atanasyand96e3152013-04-14 14:07:30 +00004760 IsSingleFloat = false;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004761 FloatABI = HardFloat;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004762 DspRev = NoDSP;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004763
4764 for (std::vector<std::string>::iterator it = Features.begin(),
4765 ie = Features.end(); it != ie; ++it) {
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004766 if (*it == "+single-float")
Simon Atanasyand96e3152013-04-14 14:07:30 +00004767 IsSingleFloat = true;
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004768 else if (*it == "+soft-float")
4769 FloatABI = SoftFloat;
Simon Atanasyan1176bcd2012-07-05 16:06:06 +00004770 else if (*it == "+mips16")
4771 IsMips16 = true;
Simon Atanasyan321ae792013-04-14 14:07:51 +00004772 else if (*it == "+micromips")
4773 IsMicromips = true;
Simon Atanasyana1b62272012-07-05 20:16:22 +00004774 else if (*it == "+dsp")
4775 DspRev = std::max(DspRev, DSP1);
4776 else if (*it == "+dspr2")
4777 DspRev = std::max(DspRev, DSP2);
Jack Carterc613b672013-08-12 17:20:29 +00004778 else if (*it == "+msa")
4779 HasMSA = true;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004780 }
Simon Atanasyanbbd99162012-07-05 15:32:46 +00004781
4782 // Remove front-end specific option.
4783 std::vector<std::string>::iterator it =
4784 std::find(Features.begin(), Features.end(), "+soft-float");
4785 if (it != Features.end())
4786 Features.erase(it);
Rafael Espindola5389b842013-08-21 21:59:03 +00004787
4788 return true;
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004789 }
Logan Chiena8f7a972013-02-23 04:24:36 +00004790
4791 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4792 if (RegNo == 0) return 4;
4793 if (RegNo == 1) return 5;
4794 return -1;
4795 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004796};
4797
Simon Atanasyanfbf70052012-06-28 18:23:16 +00004798const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
4799#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4800#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4801 ALL_LANGUAGES },
4802#include "clang/Basic/BuiltinsMips.def"
4803};
4804
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004805class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004806public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004807 Mips32TargetInfoBase(const llvm::Triple &Triple)
4808 : MipsTargetInfoBase(Triple, "o32", "mips32") {
Akira Hatanaka148735e2011-11-05 01:48:34 +00004809 SizeType = UnsignedInt;
4810 PtrDiffType = SignedInt;
Akira Hatanakadbee9492013-01-18 21:58:11 +00004811 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka148735e2011-11-05 01:48:34 +00004812 }
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004813 virtual bool setABI(const std::string &Name) {
4814 if ((Name == "o32") || (Name == "eabi")) {
4815 ABI = Name;
4816 return true;
Simon Atanasyane9616a42013-02-27 14:55:49 +00004817 } else if (Name == "32") {
4818 ABI = "o32";
4819 return true;
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004820 } else
4821 return false;
4822 }
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004823 virtual void getTargetDefines(const LangOptions &Opts,
4824 MacroBuilder &Builder) const {
4825 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004826
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004827 if (ABI == "o32") {
4828 Builder.defineMacro("__mips_o32");
4829 Builder.defineMacro("_ABIO32", "1");
4830 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
4831 }
4832 else if (ABI == "eabi")
4833 Builder.defineMacro("__mips_eabi");
4834 else
David Blaikieb219cfc2011-09-23 05:06:16 +00004835 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004836 }
4837 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4838 unsigned &NumAliases) const {
4839 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4840 { { "at" }, "$1" },
4841 { { "v0" }, "$2" },
4842 { { "v1" }, "$3" },
4843 { { "a0" }, "$4" },
4844 { { "a1" }, "$5" },
4845 { { "a2" }, "$6" },
4846 { { "a3" }, "$7" },
4847 { { "t0" }, "$8" },
4848 { { "t1" }, "$9" },
4849 { { "t2" }, "$10" },
4850 { { "t3" }, "$11" },
4851 { { "t4" }, "$12" },
4852 { { "t5" }, "$13" },
4853 { { "t6" }, "$14" },
4854 { { "t7" }, "$15" },
4855 { { "s0" }, "$16" },
4856 { { "s1" }, "$17" },
4857 { { "s2" }, "$18" },
4858 { { "s3" }, "$19" },
4859 { { "s4" }, "$20" },
4860 { { "s5" }, "$21" },
4861 { { "s6" }, "$22" },
4862 { { "s7" }, "$23" },
4863 { { "t8" }, "$24" },
4864 { { "t9" }, "$25" },
4865 { { "k0" }, "$26" },
4866 { { "k1" }, "$27" },
4867 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00004868 { { "sp","$sp" }, "$29" },
4869 { { "fp","$fp" }, "$30" },
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004870 { { "ra" }, "$31" }
4871 };
4872 Aliases = GCCRegAliases;
4873 NumAliases = llvm::array_lengthof(GCCRegAliases);
4874 }
4875};
4876
4877class Mips32EBTargetInfo : public Mips32TargetInfoBase {
4878public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004879 Mips32EBTargetInfo(const llvm::Triple &Triple)
4880 : Mips32TargetInfoBase(Triple) {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004881 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 +00004882 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004883 }
4884 virtual void getTargetDefines(const LangOptions &Opts,
4885 MacroBuilder &Builder) const {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004886 DefineStd(Builder, "MIPSEB", Opts);
4887 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004888 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004889 }
4890};
4891
4892class Mips32ELTargetInfo : public Mips32TargetInfoBase {
4893public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004894 Mips32ELTargetInfo(const llvm::Triple &Triple)
4895 : Mips32TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00004896 BigEndian = false;
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004897 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 +00004898 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004899 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004900 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004901 MacroBuilder &Builder) const {
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004902 DefineStd(Builder, "MIPSEL", Opts);
4903 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004904 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakab6a37b32011-09-20 19:00:23 +00004905 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00004906};
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004907
4908class Mips64TargetInfoBase : public MipsTargetInfoBase {
4909 virtual void SetDescriptionString(const std::string &Name) = 0;
4910public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00004911 Mips64TargetInfoBase(const llvm::Triple &Triple)
4912 : MipsTargetInfoBase(Triple, "n64", "mips64") {
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004913 LongWidth = LongAlign = 64;
4914 PointerWidth = PointerAlign = 64;
4915 LongDoubleWidth = LongDoubleAlign = 128;
4916 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnall6e399b42012-12-08 09:06:08 +00004917 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
4918 LongDoubleWidth = LongDoubleAlign = 64;
4919 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4920 }
Nick Lewycky7ec59c72011-12-16 22:34:14 +00004921 SuitableAlign = 128;
Akira Hatanakadbee9492013-01-18 21:58:11 +00004922 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004923 }
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004924 virtual bool setABI(const std::string &Name) {
4925 SetDescriptionString(Name);
Akira Hatanakac7d0ab12011-10-22 00:07:27 +00004926 if (Name == "n32") {
4927 LongWidth = LongAlign = 32;
4928 PointerWidth = PointerAlign = 32;
Simon Atanasyane9616a42013-02-27 14:55:49 +00004929 ABI = Name;
4930 return true;
4931 } else if (Name == "n64") {
4932 ABI = Name;
4933 return true;
4934 } else if (Name == "64") {
4935 ABI = "n64";
4936 return true;
4937 } else
4938 return false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004939 }
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00004940 virtual void getTargetDefines(const LangOptions &Opts,
4941 MacroBuilder &Builder) const {
4942 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaad8d8a32012-03-23 23:07:09 +00004943
Simon Atanasyan600a5132012-08-29 20:50:11 +00004944 Builder.defineMacro("__mips64");
4945 Builder.defineMacro("__mips64__");
4946
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004947 if (ABI == "n32") {
4948 Builder.defineMacro("__mips_n32");
4949 Builder.defineMacro("_ABIN32", "2");
4950 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
4951 }
4952 else if (ABI == "n64") {
4953 Builder.defineMacro("__mips_n64");
4954 Builder.defineMacro("_ABI64", "3");
4955 Builder.defineMacro("_MIPS_SIM", "_ABI64");
4956 }
4957 else
David Blaikieb219cfc2011-09-23 05:06:16 +00004958 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004959 }
4960 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4961 unsigned &NumAliases) const {
4962 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4963 { { "at" }, "$1" },
4964 { { "v0" }, "$2" },
4965 { { "v1" }, "$3" },
4966 { { "a0" }, "$4" },
4967 { { "a1" }, "$5" },
4968 { { "a2" }, "$6" },
4969 { { "a3" }, "$7" },
4970 { { "a4" }, "$8" },
4971 { { "a5" }, "$9" },
4972 { { "a6" }, "$10" },
4973 { { "a7" }, "$11" },
4974 { { "t0" }, "$12" },
4975 { { "t1" }, "$13" },
4976 { { "t2" }, "$14" },
4977 { { "t3" }, "$15" },
4978 { { "s0" }, "$16" },
4979 { { "s1" }, "$17" },
4980 { { "s2" }, "$18" },
4981 { { "s3" }, "$19" },
4982 { { "s4" }, "$20" },
4983 { { "s5" }, "$21" },
4984 { { "s6" }, "$22" },
4985 { { "s7" }, "$23" },
4986 { { "t8" }, "$24" },
4987 { { "t9" }, "$25" },
4988 { { "k0" }, "$26" },
4989 { { "k1" }, "$27" },
4990 { { "gp" }, "$28" },
Eric Christopherd1f853d2012-03-27 19:56:11 +00004991 { { "sp","$sp" }, "$29" },
4992 { { "fp","$fp" }, "$30" },
Akira Hatanakabf5851a2011-09-20 19:21:49 +00004993 { { "ra" }, "$31" }
4994 };
4995 Aliases = GCCRegAliases;
4996 NumAliases = llvm::array_lengthof(GCCRegAliases);
4997 }
4998};
4999
5000class Mips64EBTargetInfo : public Mips64TargetInfoBase {
5001 virtual void SetDescriptionString(const std::string &Name) {
5002 // Change DescriptionString only if ABI is n32.
5003 if (Name == "n32")
5004 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 +00005005 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00005006 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005007 }
5008public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005009 Mips64EBTargetInfo(const llvm::Triple &Triple)
5010 : Mips64TargetInfoBase(Triple) {
5011 // Default ABI is n64.
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005012 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 +00005013 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00005014 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005015 }
5016 virtual void getTargetDefines(const LangOptions &Opts,
5017 MacroBuilder &Builder) const {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005018 DefineStd(Builder, "MIPSEB", Opts);
5019 Builder.defineMacro("_MIPSEB");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005020 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005021 }
5022};
5023
5024class Mips64ELTargetInfo : public Mips64TargetInfoBase {
5025 virtual void SetDescriptionString(const std::string &Name) {
5026 // Change DescriptionString only if ABI is n32.
5027 if (Name == "n32")
5028 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 +00005029 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00005030 "-v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005031 }
5032public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005033 Mips64ELTargetInfo(const llvm::Triple &Triple)
5034 : Mips64TargetInfoBase(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005035 // Default ABI is n64.
5036 BigEndian = false;
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005037 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 +00005038 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka390a70f2013-01-05 02:04:34 +00005039 "v64:64:64-n32:64-S128";
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005040 }
5041 virtual void getTargetDefines(const LangOptions &Opts,
5042 MacroBuilder &Builder) const {
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005043 DefineStd(Builder, "MIPSEL", Opts);
5044 Builder.defineMacro("_MIPSEL");
Simon Atanasyan1d8ae1d2012-08-29 19:59:32 +00005045 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005046 }
5047};
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005048} // end anonymous namespace.
5049
Ivan Krasinef05abd2011-08-24 20:22:22 +00005050namespace {
5051class PNaClTargetInfo : public TargetInfo {
5052public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005053 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmane6a24e82011-12-22 03:51:45 +00005054 BigEndian = false;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005055 this->UserLabelPrefix = "";
5056 this->LongAlign = 32;
5057 this->LongWidth = 32;
5058 this->PointerAlign = 32;
5059 this->PointerWidth = 32;
5060 this->IntMaxType = TargetInfo::SignedLongLong;
5061 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5062 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00005063 this->DoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00005064 this->LongDoubleWidth = 64;
Ivan Krasinf619cdc2011-08-29 22:39:12 +00005065 this->LongDoubleAlign = 64;
Ivan Krasin68018db2011-09-20 14:56:54 +00005066 this->SizeType = TargetInfo::UnsignedInt;
5067 this->PtrDiffType = TargetInfo::SignedInt;
5068 this->IntPtrType = TargetInfo::SignedInt;
Eli Benderskyc0783dc2013-04-08 21:31:01 +00005069 this->RegParmMax = 0; // Disallow regparm
Ivan Krasinef05abd2011-08-24 20:22:22 +00005070 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
5071 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
5072 }
5073
Chandler Carruthc3a2e652011-09-28 05:56:05 +00005074 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasinef05abd2011-08-24 20:22:22 +00005075 }
5076 virtual void getArchDefines(const LangOptions &Opts,
5077 MacroBuilder &Builder) const {
5078 Builder.defineMacro("__le32__");
5079 Builder.defineMacro("__pnacl__");
5080 }
5081 virtual void getTargetDefines(const LangOptions &Opts,
5082 MacroBuilder &Builder) const {
Jan Wen Voungdde3bdb2012-03-29 00:05:59 +00005083 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasinef05abd2011-08-24 20:22:22 +00005084 getArchDefines(Opts, Builder);
5085 }
Douglas Gregore727d212012-01-30 06:38:25 +00005086 virtual bool hasFeature(StringRef Feature) const {
5087 return Feature == "pnacl";
5088 }
Ivan Krasinef05abd2011-08-24 20:22:22 +00005089 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5090 unsigned &NumRecords) const {
5091 }
Meador Ingec5613b22012-06-16 03:34:49 +00005092 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5093 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasinef05abd2011-08-24 20:22:22 +00005094 }
5095 virtual void getGCCRegNames(const char * const *&Names,
5096 unsigned &NumNames) const;
5097 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5098 unsigned &NumAliases) const;
5099 virtual bool validateAsmConstraint(const char *&Name,
5100 TargetInfo::ConstraintInfo &Info) const {
5101 return false;
5102 }
5103
5104 virtual const char *getClobbers() const {
5105 return "";
5106 }
5107};
5108
5109void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5110 unsigned &NumNames) const {
5111 Names = NULL;
5112 NumNames = 0;
5113}
5114
5115void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5116 unsigned &NumAliases) const {
5117 Aliases = NULL;
5118 NumAliases = 0;
5119}
5120} // end anonymous namespace.
5121
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005122namespace {
5123 static const unsigned SPIRAddrSpaceMap[] = {
5124 1, // opencl_global
5125 3, // opencl_local
5126 2, // opencl_constant
5127 0, // cuda_device
5128 0, // cuda_constant
5129 0 // cuda_shared
5130 };
5131 class SPIRTargetInfo : public TargetInfo {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005132 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005133 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005134 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5135 "SPIR target must use unknown OS");
5136 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5137 "SPIR target must use unknown environment type");
5138 BigEndian = false;
5139 TLSSupported = false;
5140 LongWidth = LongAlign = 64;
5141 AddrSpaceMap = &SPIRAddrSpaceMap;
5142 // Define available target features
5143 // These must be defined in sorted order!
5144 NoAsmVariants = true;
5145 }
5146 virtual void getTargetDefines(const LangOptions &Opts,
5147 MacroBuilder &Builder) const {
5148 DefineStd(Builder, "SPIR", Opts);
5149 }
5150 virtual bool hasFeature(StringRef Feature) const {
5151 return Feature == "spir";
5152 }
5153
5154 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5155 unsigned &NumRecords) const {}
5156 virtual const char *getClobbers() const {
5157 return "";
5158 }
5159 virtual void getGCCRegNames(const char * const *&Names,
5160 unsigned &NumNames) const {}
5161 virtual bool validateAsmConstraint(const char *&Name,
5162 TargetInfo::ConstraintInfo &info) const {
5163 return true;
5164 }
5165 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5166 unsigned &NumAliases) const {}
5167 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5168 return TargetInfo::VoidPtrBuiltinVaList;
5169 }
5170 };
5171
5172
5173 class SPIR32TargetInfo : public SPIRTargetInfo {
5174 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005175 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005176 PointerWidth = PointerAlign = 32;
5177 SizeType = TargetInfo::UnsignedInt;
5178 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5179 DescriptionString
Guy Benyeif3ddf632013-03-07 13:06:10 +00005180 = "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 +00005181 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
5182 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
5183 "v512:512:512-v1024:1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00005184 }
5185 virtual void getTargetDefines(const LangOptions &Opts,
5186 MacroBuilder &Builder) const {
5187 DefineStd(Builder, "SPIR32", Opts);
5188 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005189 };
5190
5191 class SPIR64TargetInfo : public SPIRTargetInfo {
5192 public:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005193 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005194 PointerWidth = PointerAlign = 64;
5195 SizeType = TargetInfo::UnsignedLong;
5196 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
5197 DescriptionString
Guy Benyeif3ddf632013-03-07 13:06:10 +00005198 = "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 +00005199 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
5200 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
5201 "v512:512:512-v1024:1024:1024";
Guy Benyeif3ddf632013-03-07 13:06:10 +00005202 }
5203 virtual void getTargetDefines(const LangOptions &Opts,
5204 MacroBuilder &Builder) const {
5205 DefineStd(Builder, "SPIR64", Opts);
5206 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005207 };
5208}
5209
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005210namespace {
5211class XCoreTargetInfo : public TargetInfo {
5212 static const Builtin::Info BuiltinInfo[];
5213public:
5214 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5215 BigEndian = false;
5216 NoAsmVariants = true;
5217 LongLongAlign = 32;
5218 SuitableAlign = 32;
5219 DoubleAlign = LongDoubleAlign = 32;
5220 UseZeroLengthBitfieldAlignment = true;
5221 DescriptionString = "e-p:32:32:32-a0:0:32-n32"
5222 "-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32"
5223 "-f16:16:32-f32:32:32-f64:32:32";
5224 }
5225 virtual void getTargetDefines(const LangOptions &Opts,
5226 MacroBuilder &Builder) const {
5227 Builder.defineMacro("__XS1B__");
5228 }
5229 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5230 unsigned &NumRecords) const {
5231 Records = BuiltinInfo;
5232 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5233 }
5234 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5235 return TargetInfo::VoidPtrBuiltinVaList;
5236 }
5237 virtual const char *getClobbers() const {
5238 return "";
5239 }
5240 virtual void getGCCRegNames(const char * const *&Names,
5241 unsigned &NumNames) const {
5242 static const char * const GCCRegNames[] = {
5243 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5244 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5245 };
5246 Names = GCCRegNames;
5247 NumNames = llvm::array_lengthof(GCCRegNames);
5248 }
5249 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5250 unsigned &NumAliases) const {
5251 Aliases = NULL;
5252 NumAliases = 0;
5253 }
5254 virtual bool validateAsmConstraint(const char *&Name,
5255 TargetInfo::ConstraintInfo &Info) const {
5256 return false;
5257 }
5258};
5259
5260const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
5261#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5262#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5263 ALL_LANGUAGES },
5264#include "clang/Basic/BuiltinsXCore.def"
5265};
5266} // end anonymous namespace.
5267
Ivan Krasinef05abd2011-08-24 20:22:22 +00005268
Reid Spencer5f016e22007-07-11 17:01:13 +00005269//===----------------------------------------------------------------------===//
5270// Driver code
5271//===----------------------------------------------------------------------===//
5272
Benjamin Kramer9df08232013-06-29 16:37:14 +00005273static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005274 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman61538a72008-05-20 14:21:01 +00005275
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005276 switch (Triple.getArch()) {
5277 default:
5278 return NULL;
Eli Friedman61538a72008-05-20 14:21:01 +00005279
Robert Lytton5f15f4d2013-08-13 09:43:10 +00005280 case llvm::Triple::xcore:
5281 return new XCoreTargetInfo(Triple);
5282
Tony Linthicum96319392011-12-12 21:14:55 +00005283 case llvm::Triple::hexagon:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005284 return new HexagonTargetInfo(Triple);
Tony Linthicum96319392011-12-12 21:14:55 +00005285
Tim Northoverc264e162013-01-31 12:13:10 +00005286 case llvm::Triple::aarch64:
5287 switch (os) {
5288 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005289 return new LinuxTargetInfo<AArch64TargetInfo>(Triple);
Tim Northoverc264e162013-01-31 12:13:10 +00005290 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005291 return new AArch64TargetInfo(Triple);
Tim Northoverc264e162013-01-31 12:13:10 +00005292 }
5293
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005294 case llvm::Triple::arm:
Daniel Dunbarf4aa4f612009-09-11 01:14:50 +00005295 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005296 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00005297 return new DarwinARMTargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005298
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005299 switch (os) {
Rafael Espindola022a8a52010-06-10 00:46:51 +00005300 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005301 return new LinuxTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005302 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005303 return new FreeBSDTargetInfo<ARMTargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005304 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005305 return new NetBSDTargetInfo<ARMTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005306 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005307 return new OpenBSDTargetInfo<ARMTargetInfo>(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00005308 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005309 return new BitrigTargetInfo<ARMTargetInfo>(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00005310 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005311 return new RTEMSTargetInfo<ARMTargetInfo>(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005312 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005313 return new NaClTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005314 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005315 return new ARMTargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005316 }
Eli Friedman61538a72008-05-20 14:21:01 +00005317
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005318 case llvm::Triple::msp430:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005319 return new MSP430TargetInfo(Triple);
Eli Friedman61538a72008-05-20 14:21:01 +00005320
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005321 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005322 switch (os) {
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005323 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005324 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005325 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005326 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005327 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005328 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005329 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005330 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005331 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005332 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00005333 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005334
5335 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005336 switch (os) {
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005337 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005338 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005339 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005340 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005341 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005342 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005343 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005344 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005345 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005346 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00005347 }
Edward O'Callaghan84423a82009-11-15 10:22:07 +00005348
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005349 case llvm::Triple::mips64:
5350 switch (os) {
5351 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005352 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005353 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005354 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005355 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005356 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005357 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005358 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005359 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005360 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005361 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005362 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005363 }
5364
5365 case llvm::Triple::mips64el:
5366 switch (os) {
5367 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005368 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005369 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005370 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005371 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005372 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005373 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005374 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005375 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005376 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005377 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005378 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabf5851a2011-09-20 19:21:49 +00005379 }
5380
Ivan Krasinef05abd2011-08-24 20:22:22 +00005381 case llvm::Triple::le32:
5382 switch (os) {
Eli Bendersky441d9f72012-12-04 18:38:10 +00005383 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005384 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasinef05abd2011-08-24 20:22:22 +00005385 default:
5386 return NULL;
5387 }
5388
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005389 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005390 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00005391 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005392 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005393 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005394 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005395 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005396 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005397 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005398 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005399 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005400 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005401 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005402 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005403 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005404 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005405 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005406
5407 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005408 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00005409 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005410 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005411 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005412 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005413 case llvm::Triple::Lv2:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005414 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005415 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005416 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005417 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005418 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005419 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005420 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005421 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005422
Bill Schmidtea7fb0c2013-07-26 01:36:11 +00005423 case llvm::Triple::ppc64le:
5424 switch (os) {
5425 case llvm::Triple::Linux:
5426 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
5427 default:
5428 return new PPC64TargetInfo(Triple);
5429 }
5430
Peter Collingbourneedb66f32012-05-20 23:28:41 +00005431 case llvm::Triple::nvptx:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005432 return new NVPTX32TargetInfo(Triple);
Peter Collingbourneedb66f32012-05-20 23:28:41 +00005433 case llvm::Triple::nvptx64:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005434 return new NVPTX64TargetInfo(Triple);
Peter Collingbourneedb66f32012-05-20 23:28:41 +00005435
Eli Friedman6505a292012-10-12 23:32:00 +00005436 case llvm::Triple::r600:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005437 return new R600TargetInfo(Triple);
Eli Friedman6505a292012-10-12 23:32:00 +00005438
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005439 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005440 switch (os) {
Anton Korobeynikov7e1812f2011-10-12 09:30:58 +00005441 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005442 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005443 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005444 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005445 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005446 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005447 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005448 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg5e601dc2012-08-02 13:45:48 +00005449 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005450 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005451 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005452 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005453 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005454 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00005455 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005456
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005457 case llvm::Triple::sparcv9:
5458 switch (os) {
5459 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005460 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005461 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005462 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005463 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005464 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005465 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005466 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005467 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005468 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005469 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005470 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005471 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005472 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +00005473 }
5474
Ulrich Weigandb8409212013-05-06 16:26:41 +00005475 case llvm::Triple::systemz:
5476 switch (os) {
5477 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005478 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00005479 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005480 return new SystemZTargetInfo(Triple);
Ulrich Weigandb8409212013-05-06 16:26:41 +00005481 }
5482
Eli Friedmanb63decf2009-08-19 20:47:07 +00005483 case llvm::Triple::tce:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005484 return new TCETargetInfo(Triple);
Eli Friedmanb63decf2009-08-19 20:47:07 +00005485
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005486 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005487 if (Triple.isOSDarwin())
Benjamin Kramer9df08232013-06-29 16:37:14 +00005488 return new DarwinI386TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005489
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005490 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00005491 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005492 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005493 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005494 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005495 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005496 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005497 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005498 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005499 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005500 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00005501 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005502 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005503 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005504 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru3309a782013-09-05 13:47:07 +00005505 case llvm::Triple::KFreeBSD:
5506 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner38e317d2010-07-07 16:01:42 +00005507 case llvm::Triple::Minix:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005508 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005509 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005510 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005511 case llvm::Triple::Cygwin:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005512 return new CygwinX86_32TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005513 case llvm::Triple::MinGW32:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005514 return new MinGWX86_32TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005515 case llvm::Triple::Win32:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005516 return new VisualStudioWindowsX86_32TargetInfo(Triple);
Chris Lattner86ed3a32010-04-11 19:29:39 +00005517 case llvm::Triple::Haiku:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005518 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregordca52262011-07-01 22:41:14 +00005519 case llvm::Triple::RTEMS:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005520 return new RTEMSX86_32TargetInfo(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005521 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005522 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005523 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005524 return new X86_32TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005525 }
5526
5527 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005528 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
Benjamin Kramer9df08232013-06-29 16:37:14 +00005529 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00005530
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005531 switch (os) {
Edward O'Callaghan991f9a72009-10-18 13:33:59 +00005532 case llvm::Triple::AuroraUX:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005533 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005534 case llvm::Triple::Linux:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005535 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner7a7ca282010-01-09 05:41:14 +00005536 case llvm::Triple::DragonFly:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005537 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005538 case llvm::Triple::NetBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005539 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005540 case llvm::Triple::OpenBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005541 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman42f74f22012-08-08 23:57:20 +00005542 case llvm::Triple::Bitrig:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005543 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005544 case llvm::Triple::FreeBSD:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005545 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru3309a782013-09-05 13:47:07 +00005546 case llvm::Triple::KFreeBSD:
5547 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005548 case llvm::Triple::Solaris:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005549 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00005550 case llvm::Triple::MinGW32:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005551 return new MinGWX86_64TargetInfo(Triple);
Daniel Dunbar9fe4a5d2009-09-23 07:31:35 +00005552 case llvm::Triple::Win32: // This is what Triple.h supports now.
Benjamin Kramer9df08232013-06-29 16:37:14 +00005553 return new VisualStudioWindowsX86_64TargetInfo(Triple);
Eli Bendersky441d9f72012-12-04 18:38:10 +00005554 case llvm::Triple::NaCl:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005555 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005556 default:
Benjamin Kramer9df08232013-06-29 16:37:14 +00005557 return new X86_64TargetInfo(Triple);
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005558 }
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005559
5560 case llvm::Triple::spir: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005561 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00005562 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005563 return NULL;
Benjamin Kramer9df08232013-06-29 16:37:14 +00005564 return new SPIR32TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005565 }
5566 case llvm::Triple::spir64: {
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005567 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramer9df08232013-06-29 16:37:14 +00005568 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005569 return NULL;
Benjamin Kramer9df08232013-06-29 16:37:14 +00005570 return new SPIR64TargetInfo(Triple);
Guy Benyeibd5da3c2012-12-11 21:38:14 +00005571 }
Daniel Dunbar9d6fa612009-08-18 05:47:58 +00005572 }
Reid Spencer5f016e22007-07-11 17:01:13 +00005573}
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005574
5575/// CreateTargetInfo - Return the target info object for the specified target
5576/// triple.
David Blaikied6471f72011-09-25 23:23:43 +00005577TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregor49a87542012-11-16 04:24:59 +00005578 TargetOptions *Opts) {
5579 llvm::Triple Triple(Opts->Triple);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005580
5581 // Construct the target
Benjamin Kramer9df08232013-06-29 16:37:14 +00005582 OwningPtr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005583 if (!Target) {
5584 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5585 return 0;
5586 }
Douglas Gregor9a022bb2012-10-15 16:45:32 +00005587 Target->setTargetOpts(Opts);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005588
Daniel Dunbareac7c532009-12-18 18:42:37 +00005589 // Set the target CPU if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00005590 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5591 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbareac7c532009-12-18 18:42:37 +00005592 return 0;
5593 }
5594
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005595 // Set the target ABI if specified.
Douglas Gregor49a87542012-11-16 04:24:59 +00005596 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5597 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005598 return 0;
5599 }
5600
Charles Davis98b7c5c2010-06-11 01:06:47 +00005601 // Set the target C++ ABI.
Douglas Gregor49a87542012-11-16 04:24:59 +00005602 if (!Opts->CXXABI.empty() && !Target->setCXXABI(Opts->CXXABI)) {
5603 Diags.Report(diag::err_target_unknown_cxxabi) << Opts->CXXABI;
Charles Davis98b7c5c2010-06-11 01:06:47 +00005604 return 0;
5605 }
5606
Rafael Espindola5389b842013-08-21 21:59:03 +00005607 // Set the fp math unit.
5608 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
5609 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
5610 return 0;
5611 }
5612
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005613 // Compute the default target features, we need the target to handle this
5614 // because features may have dependencies on one another.
5615 llvm::StringMap<bool> Features;
Chandler Carruthc3a2e652011-09-28 05:56:05 +00005616 Target->getDefaultFeatures(Features);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005617
Rafael Espindolac84ed542013-08-20 18:57:55 +00005618 // Apply the user specified deltas.
5619 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
5620 I < N; ++I) {
5621 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindola53ac3d82011-11-27 20:00:43 +00005622 // Apply the feature via the target.
Rafael Espindolac84ed542013-08-20 18:57:55 +00005623 bool Enabled = Name[0] == '+';
5624 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005625 }
5626
5627 // Add the features to the compile options.
5628 //
5629 // FIXME: If we are completely confident that we have the right set, we only
5630 // need to pass the minuses.
Douglas Gregor49a87542012-11-16 04:24:59 +00005631 Opts->Features.clear();
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005632 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5633 ie = Features.end(); it != ie; ++it)
Douglas Gregor49a87542012-11-16 04:24:59 +00005634 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Rafael Espindola5389b842013-08-21 21:59:03 +00005635 if (!Target->HandleTargetFeatures(Opts->Features, Diags))
5636 return 0;
Daniel Dunbard58c03f2009-11-15 06:48:46 +00005637
5638 return Target.take();
5639}