blob: cebb495aa705181a1ef5af7dacadd53666e3975d [file] [log] [blame]
Chris Lattner4b009652007-07-25 00:24:17 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner959e5be2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner4b009652007-07-25 00:24:17 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikove7772382009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek38591a22007-12-12 18:05:32 +000011// target triple.
Chris Lattner4b009652007-07-25 00:24:17 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner4b009652007-07-25 00:24:17 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarca3e9912009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerddae7102008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carrutha088d5b2010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarca3e9912009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedmand4011892008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbarca3e9912009-11-15 06:48:46 +000023#include "llvm/ADT/OwningPtr.h"
Daniel Dunbar8dd8f262009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Daniel Dunbar0433a022009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar8dd8f262009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattnerf54f2212009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner43954312009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
Dale Johannesen8fa024c2010-10-29 23:24:33 +000029#include "llvm/Type.h"
Benjamin Kramerf8a85782010-01-09 18:20:57 +000030#include <algorithm>
Chris Lattner4b009652007-07-25 00:24:17 +000031using namespace clang;
32
Chris Lattner4b009652007-07-25 00:24:17 +000033//===----------------------------------------------------------------------===//
34// Common code shared among targets.
35//===----------------------------------------------------------------------===//
36
Chris Lattnerc345a802009-03-20 16:06:38 +000037/// DefineStd - Define a macro name and standard variants. For example if
38/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
39/// when in GNU mode.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000040static void DefineStd(MacroBuilder &Builder, llvm::StringRef MacroName,
Chris Lattnerc345a802009-03-20 16:06:38 +000041 const LangOptions &Opts) {
42 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikove7772382009-05-03 13:42:53 +000043
Chris Lattnerc345a802009-03-20 16:06:38 +000044 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
45 // in the user's namespace.
46 if (Opts.GNUMode)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000047 Builder.defineMacro(MacroName);
Anton Korobeynikove7772382009-05-03 13:42:53 +000048
Chris Lattnerc345a802009-03-20 16:06:38 +000049 // Define __unix.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000050 Builder.defineMacro("__" + MacroName);
Anton Korobeynikove7772382009-05-03 13:42:53 +000051
Chris Lattnerc345a802009-03-20 16:06:38 +000052 // Define __unix__.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000053 Builder.defineMacro("__" + MacroName + "__");
Chris Lattnerc345a802009-03-20 16:06:38 +000054}
55
Chris Lattnerbd00eb82008-10-05 21:50:58 +000056//===----------------------------------------------------------------------===//
57// Defines specific to certain operating systems.
58//===----------------------------------------------------------------------===//
Chris Lattner43954312009-08-10 19:03:04 +000059
Edwin Török36565e52009-06-30 17:10:35 +000060namespace {
Douglas Gregor937331f2009-07-01 15:12:53 +000061template<typename TgtInfo>
62class OSTargetInfo : public TgtInfo {
Edwin Török36565e52009-06-30 17:10:35 +000063protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +000064 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000065 MacroBuilder &Builder) const=0;
Edwin Török36565e52009-06-30 17:10:35 +000066public:
Douglas Gregor937331f2009-07-01 15:12:53 +000067 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
Edwin Török36565e52009-06-30 17:10:35 +000068 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000069 MacroBuilder &Builder) const {
70 TgtInfo::getTargetDefines(Opts, Builder);
71 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Edwin Török2d98f9f2009-06-30 17:00:25 +000072 }
Edwin Török36565e52009-06-30 17:10:35 +000073
74};
Chris Lattnerf54f2212009-08-12 06:24:27 +000075} // end anonymous namespace
Edwin Török2d98f9f2009-06-30 17:00:25 +000076
Chris Lattner43954312009-08-10 19:03:04 +000077
Daniel Dunbareab96a22010-01-26 01:44:04 +000078static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +000079 const llvm::Triple &Triple,
80 llvm::StringRef &PlatformName,
81 VersionTuple &PlatformMinVersion) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +000082 Builder.defineMacro("__APPLE_CC__", "5621");
83 Builder.defineMacro("__APPLE__");
84 Builder.defineMacro("__MACH__");
85 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Anton Korobeynikove7772382009-05-03 13:42:53 +000086
John McCall098df7f2011-06-16 00:03:19 +000087 if (!Opts.ObjCAutoRefCount) {
John McCallf85e1932011-06-15 23:02:42 +000088 // __weak is always defined, for use in blocks and with objc pointers.
89 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikove7772382009-05-03 13:42:53 +000090
John McCallf85e1932011-06-15 23:02:42 +000091 // Darwin defines __strong even in C mode (just to nothing).
92 if (Opts.getGCMode() != LangOptions::NonGC)
93 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
94 else
95 Builder.defineMacro("__strong", "");
Eric Christopher7c9adf92011-07-07 22:55:26 +000096
John McCallf85e1932011-06-15 23:02:42 +000097 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
98 // allow this in C, since one might have block pointers in structs that
99 // are used in pure C code and in Objective-C ARC.
100 Builder.defineMacro("__unsafe_unretained", "");
Eric Christopher7c9adf92011-07-07 22:55:26 +0000101
John McCallf85e1932011-06-15 23:02:42 +0000102 // The Objective-C bridged cast keywords are defined to nothing in non-ARC
103 // mode; then they become normal, C-style casts.
104 Builder.defineMacro("__bridge", "");
105 Builder.defineMacro("__bridge_transfer", "");
106 Builder.defineMacro("__bridge_retained", "");
John McCall18164422011-06-17 21:23:37 +0000107 Builder.defineMacro("__bridge_retain", "");
John McCallf85e1932011-06-15 23:02:42 +0000108 }
Eric Christopher7c9adf92011-07-07 22:55:26 +0000109
Eli Friedmaneff0a422009-06-04 23:00:29 +0000110 if (Opts.Static)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000111 Builder.defineMacro("__STATIC__");
Eli Friedmaneff0a422009-06-04 23:00:29 +0000112 else
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000113 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000114
115 if (Opts.POSIXThreads)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000116 Builder.defineMacro("_REENTRANT");
Daniel Dunbar93f64532009-04-10 19:52:24 +0000117
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000118 // Get the platform type and version number from the triple.
Daniel Dunbar93f64532009-04-10 19:52:24 +0000119 unsigned Maj, Min, Rev;
Mike Stump25cf7602009-09-09 15:08:12 +0000120
Daniel Dunbareab96a22010-01-26 01:44:04 +0000121 // If no version was given, default to to 10.4.0, for simplifying tests.
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000122 if (Triple.getOSName() == "darwin" || Triple.getOSName() == "osx") {
123 PlatformName = "macosx";
Daniel Dunbareab96a22010-01-26 01:44:04 +0000124 Min = Rev = 0;
125 Maj = 8;
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000126 } else {
127 // Otherwise, honor all three triple forms ("-darwinNNN[-iphoneos]",
128 // "-osxNNN", and "-iosNNN").
129
130 if (Triple.getOS() == llvm::Triple::Darwin) {
131 // For historical reasons that make little sense, the version passed here
132 // is the "darwin" version, which drops the 10 and offsets by 4.
133 Triple.getOSVersion(Maj, Min, Rev);
134
135 if (Triple.getEnvironmentName() == "iphoneos") {
136 PlatformName = "ios";
137 } else {
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000138 PlatformName = "macosx";
139 Rev = Min;
140 Min = Maj - 4;
141 Maj = 10;
142 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000143 } else {
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000144 Triple.getOSVersion(Maj, Min, Rev);
Daniel Dunbara4ff6482011-04-19 23:34:21 +0000145 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000146 }
147 }
Daniel Dunbareab96a22010-01-26 01:44:04 +0000148
Chad Rosierd9259f32011-07-19 20:00:06 +0000149 // If -ccc-host-triple arch-pc-win32-macho option specified, we're
150 // generating code for Win32 ABI. No need to emit
151 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
152 if (PlatformName == "win32") {
153 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
154 return;
155 }
156
Daniel Dunbareab96a22010-01-26 01:44:04 +0000157 // Set the appropriate OS version define.
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000158 if (PlatformName == "ios") {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000159 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbareab96a22010-01-26 01:44:04 +0000160 char Str[6];
161 Str[0] = '0' + Maj;
162 Str[1] = '0' + (Min / 10);
163 Str[2] = '0' + (Min % 10);
164 Str[3] = '0' + (Rev / 10);
165 Str[4] = '0' + (Rev % 10);
166 Str[5] = '\0';
167 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
168 } else {
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000169 // Note that the Driver allows versions which aren't representable in the
170 // define (because we only get a single digit for the minor and micro
171 // revision numbers). So, we limit them to the maximum representable
172 // version.
Daniel Dunbareab96a22010-01-26 01:44:04 +0000173 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000174 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbareab96a22010-01-26 01:44:04 +0000175 char Str[5];
176 Str[0] = '0' + (Maj / 10);
177 Str[1] = '0' + (Maj % 10);
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000178 Str[2] = '0' + std::min(Min, 9U);
179 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbareab96a22010-01-26 01:44:04 +0000180 Str[4] = '\0';
181 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar93f64532009-04-10 19:52:24 +0000182 }
Daniel Dunbar0d027ba2011-04-19 21:40:34 +0000183
184 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman872996c2008-08-20 02:34:37 +0000185}
Chris Lattner4b009652007-07-25 00:24:17 +0000186
Chris Lattner43954312009-08-10 19:03:04 +0000187namespace {
Edwin Török36565e52009-06-30 17:10:35 +0000188template<typename Target>
189class DarwinTargetInfo : public OSTargetInfo<Target> {
190protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +0000191 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000192 MacroBuilder &Builder) const {
Eric Christopher7c9adf92011-07-07 22:55:26 +0000193 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor0a0d2b12011-03-23 00:50:03 +0000194 this->PlatformMinVersion);
Edwin Török36565e52009-06-30 17:10:35 +0000195 }
Mike Stump25cf7602009-09-09 15:08:12 +0000196
Edwin Török36565e52009-06-30 17:10:35 +0000197public:
198 DarwinTargetInfo(const std::string& triple) :
199 OSTargetInfo<Target>(triple) {
Eric Christopheraa7333c2011-07-02 00:20:22 +0000200 llvm::Triple T = llvm::Triple(triple);
201 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
Daniel Dunbare177d3b2011-02-21 23:12:51 +0000202 this->MCountName = "\01mcount";
Edwin Török36565e52009-06-30 17:10:35 +0000203 }
204
Anders Carlsson41f80b52010-01-30 18:33:31 +0000205 virtual std::string isValidSectionSpecifier(llvm::StringRef SR) const {
Chris Lattner43954312009-08-10 19:03:04 +0000206 // Let MCSectionMachO validate this.
207 llvm::StringRef Segment, Section;
208 unsigned TAA, StubSize;
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000209 bool HasTAA;
Chris Lattner43954312009-08-10 19:03:04 +0000210 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar9ae186f2011-03-19 02:06:21 +0000211 TAA, HasTAA, StubSize);
Chris Lattner43954312009-08-10 19:03:04 +0000212 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000213
Anders Carlsson608b5792010-06-08 22:47:50 +0000214 virtual const char *getStaticInitSectionSpecifier() const {
215 // FIXME: We should return 0 when building kexts.
216 return "__TEXT,__StaticInit,regular,pure_instructions";
217 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000218
Edwin Török36565e52009-06-30 17:10:35 +0000219};
220
Chris Lattner43954312009-08-10 19:03:04 +0000221
Edwin Török36565e52009-06-30 17:10:35 +0000222// DragonFlyBSD Target
223template<typename Target>
224class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
225protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +0000226 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000227 MacroBuilder &Builder) const {
Edwin Török36565e52009-06-30 17:10:35 +0000228 // DragonFly defines; list based off of gcc output
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000229 Builder.defineMacro("__DragonFly__");
230 Builder.defineMacro("__DragonFly_cc_version", "100001");
231 Builder.defineMacro("__ELF__");
232 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
233 Builder.defineMacro("__tune_i386__");
234 DefineStd(Builder, "unix", Opts);
Edwin Török36565e52009-06-30 17:10:35 +0000235 }
236public:
Mike Stump25cf7602009-09-09 15:08:12 +0000237 DragonFlyBSDTargetInfo(const std::string &triple)
Edwin Török36565e52009-06-30 17:10:35 +0000238 : OSTargetInfo<Target>(triple) {}
239};
240
241// FreeBSD Target
242template<typename Target>
243class FreeBSDTargetInfo : public OSTargetInfo<Target> {
244protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +0000245 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000246 MacroBuilder &Builder) const {
Edwin Török36565e52009-06-30 17:10:35 +0000247 // FreeBSD defines; list based off of gcc output
248
Daniel Dunbar608b3882009-08-24 09:10:05 +0000249 // FIXME: Move version number handling to llvm::Triple.
Benjamin Kramereaa3c702010-01-30 19:55:01 +0000250 llvm::StringRef Release = Triple.getOSName().substr(strlen("freebsd"), 1);
Edwin Török36565e52009-06-30 17:10:35 +0000251
Benjamin Kramereaa3c702010-01-30 19:55:01 +0000252 Builder.defineMacro("__FreeBSD__", Release);
253 Builder.defineMacro("__FreeBSD_cc_version", Release + "00001");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000254 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
255 DefineStd(Builder, "unix", Opts);
256 Builder.defineMacro("__ELF__");
Edwin Török36565e52009-06-30 17:10:35 +0000257 }
258public:
Mike Stump25cf7602009-09-09 15:08:12 +0000259 FreeBSDTargetInfo(const std::string &triple)
Duncan Sandscd2cb662009-07-08 13:55:08 +0000260 : OSTargetInfo<Target>(triple) {
261 this->UserLabelPrefix = "";
Roman Divackybe4c8702011-02-10 16:52:03 +0000262
263 llvm::Triple Triple(triple);
264 switch (Triple.getArch()) {
265 default:
266 case llvm::Triple::x86:
267 case llvm::Triple::x86_64:
268 this->MCountName = ".mcount";
269 break;
270 case llvm::Triple::mips:
271 case llvm::Triple::mipsel:
272 case llvm::Triple::ppc:
273 case llvm::Triple::ppc64:
274 this->MCountName = "_mcount";
275 break;
276 case llvm::Triple::arm:
277 this->MCountName = "__mcount";
278 break;
279 }
280
Duncan Sandscd2cb662009-07-08 13:55:08 +0000281 }
Edwin Török36565e52009-06-30 17:10:35 +0000282};
283
Chris Lattner6f4bed52010-07-07 16:01:42 +0000284// Minix Target
285template<typename Target>
286class MinixTargetInfo : public OSTargetInfo<Target> {
287protected:
288 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
289 MacroBuilder &Builder) const {
290 // Minix defines
291
292 Builder.defineMacro("__minix", "3");
293 Builder.defineMacro("_EM_WSIZE", "4");
294 Builder.defineMacro("_EM_PSIZE", "4");
295 Builder.defineMacro("_EM_SSIZE", "2");
296 Builder.defineMacro("_EM_LSIZE", "4");
297 Builder.defineMacro("_EM_FSIZE", "4");
298 Builder.defineMacro("_EM_DSIZE", "8");
299 DefineStd(Builder, "unix", Opts);
300 }
301public:
302 MinixTargetInfo(const std::string &triple)
303 : OSTargetInfo<Target>(triple) {
304 this->UserLabelPrefix = "";
305 }
306};
307
Edwin Török36565e52009-06-30 17:10:35 +0000308// Linux target
309template<typename Target>
310class LinuxTargetInfo : public OSTargetInfo<Target> {
311protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +0000312 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000313 MacroBuilder &Builder) const {
Edwin Török36565e52009-06-30 17:10:35 +0000314 // Linux defines; list based off of gcc output
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000315 DefineStd(Builder, "unix", Opts);
316 DefineStd(Builder, "linux", Opts);
317 Builder.defineMacro("__gnu_linux__");
318 Builder.defineMacro("__ELF__");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000319 if (Opts.POSIXThreads)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000320 Builder.defineMacro("_REENTRANT");
Douglas Gregor9b22a172010-04-21 05:52:38 +0000321 if (Opts.CPlusPlus)
322 Builder.defineMacro("_GNU_SOURCE");
Edwin Török36565e52009-06-30 17:10:35 +0000323 }
324public:
Mike Stump25cf7602009-09-09 15:08:12 +0000325 LinuxTargetInfo(const std::string& triple)
Edwin Török36565e52009-06-30 17:10:35 +0000326 : OSTargetInfo<Target>(triple) {
327 this->UserLabelPrefix = "";
Douglas Gregor12e84642011-01-12 21:19:25 +0000328 this->WIntType = TargetInfo::UnsignedInt;
Edwin Török36565e52009-06-30 17:10:35 +0000329 }
330};
331
Chris Lattner25fff082009-07-13 20:29:08 +0000332// NetBSD Target
333template<typename Target>
334class NetBSDTargetInfo : public OSTargetInfo<Target> {
335protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +0000336 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000337 MacroBuilder &Builder) const {
Chris Lattner25fff082009-07-13 20:29:08 +0000338 // NetBSD defines; list based off of gcc output
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000339 Builder.defineMacro("__NetBSD__");
340 Builder.defineMacro("__unix__");
341 Builder.defineMacro("__ELF__");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000342 if (Opts.POSIXThreads)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000343 Builder.defineMacro("_POSIX_THREADS");
Chris Lattner25fff082009-07-13 20:29:08 +0000344 }
345public:
Mike Stump25cf7602009-09-09 15:08:12 +0000346 NetBSDTargetInfo(const std::string &triple)
Chris Lattner25fff082009-07-13 20:29:08 +0000347 : OSTargetInfo<Target>(triple) {
348 this->UserLabelPrefix = "";
349 }
350};
351
Edwin Török36565e52009-06-30 17:10:35 +0000352// OpenBSD Target
353template<typename Target>
354class OpenBSDTargetInfo : public OSTargetInfo<Target> {
355protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +0000356 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000357 MacroBuilder &Builder) const {
Edwin Török36565e52009-06-30 17:10:35 +0000358 // OpenBSD defines; list based off of gcc output
359
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000360 Builder.defineMacro("__OpenBSD__");
361 DefineStd(Builder, "unix", Opts);
362 Builder.defineMacro("__ELF__");
Daniel Dunbar62a7cbc2009-09-03 04:54:28 +0000363 if (Opts.POSIXThreads)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000364 Builder.defineMacro("_POSIX_THREADS");
Edwin Török36565e52009-06-30 17:10:35 +0000365 }
366public:
Mike Stump25cf7602009-09-09 15:08:12 +0000367 OpenBSDTargetInfo(const std::string &triple)
Edwin Török36565e52009-06-30 17:10:35 +0000368 : OSTargetInfo<Target>(triple) {}
369};
370
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000371// PSP Target
372template<typename Target>
373class PSPTargetInfo : public OSTargetInfo<Target> {
374protected:
375 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000376 MacroBuilder &Builder) const {
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000377 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000378 Builder.defineMacro("PSP");
379 Builder.defineMacro("_PSP");
380 Builder.defineMacro("__psp__");
381 Builder.defineMacro("__ELF__");
Edward O'Callaghan097309f2009-11-15 10:22:07 +0000382 }
383public:
384 PSPTargetInfo(const std::string& triple)
385 : OSTargetInfo<Target>(triple) {
386 this->UserLabelPrefix = "";
387 }
388};
389
John Thompsoned7bdbc2009-11-19 17:18:50 +0000390// PS3 PPU Target
391template<typename Target>
392class PS3PPUTargetInfo : public OSTargetInfo<Target> {
393protected:
394 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000395 MacroBuilder &Builder) const {
John Thompsoned7bdbc2009-11-19 17:18:50 +0000396 // PS3 PPU defines.
John Thompsonfdd2fc32010-03-25 16:18:32 +0000397 Builder.defineMacro("__PPC__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000398 Builder.defineMacro("__PPU__");
399 Builder.defineMacro("__CELLOS_LV2__");
400 Builder.defineMacro("__ELF__");
401 Builder.defineMacro("__LP32__");
John Thompson1deeb9f2010-06-24 22:44:13 +0000402 Builder.defineMacro("_ARCH_PPC64");
403 Builder.defineMacro("__powerpc64__");
John Thompsoned7bdbc2009-11-19 17:18:50 +0000404 }
405public:
406 PS3PPUTargetInfo(const std::string& triple)
407 : OSTargetInfo<Target>(triple) {
408 this->UserLabelPrefix = "";
John Thompson4c3bd3f2009-12-18 14:21:08 +0000409 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
John Thompson1deeb9f2010-06-24 22:44:13 +0000410 this->IntMaxType = TargetInfo::SignedLongLong;
411 this->UIntMaxType = TargetInfo::UnsignedLongLong;
412 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson4c3bd3f2009-12-18 14:21:08 +0000413 this->SizeType = TargetInfo::UnsignedInt;
John Thompson1deeb9f2010-06-24 22:44:13 +0000414 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
415 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompsoned7bdbc2009-11-19 17:18:50 +0000416 }
417};
418
419// FIXME: Need a real SPU target.
420// PS3 SPU Target
421template<typename Target>
422class PS3SPUTargetInfo : public OSTargetInfo<Target> {
423protected:
424 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000425 MacroBuilder &Builder) const {
John Thompsoned7bdbc2009-11-19 17:18:50 +0000426 // PS3 PPU defines.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000427 Builder.defineMacro("__SPU__");
428 Builder.defineMacro("__ELF__");
John Thompsoned7bdbc2009-11-19 17:18:50 +0000429 }
430public:
431 PS3SPUTargetInfo(const std::string& triple)
432 : OSTargetInfo<Target>(triple) {
433 this->UserLabelPrefix = "";
434 }
435};
436
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +0000437// AuroraUX target
438template<typename Target>
439class AuroraUXTargetInfo : public OSTargetInfo<Target> {
440protected:
441 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000442 MacroBuilder &Builder) const {
443 DefineStd(Builder, "sun", Opts);
444 DefineStd(Builder, "unix", Opts);
445 Builder.defineMacro("__ELF__");
446 Builder.defineMacro("__svr4__");
447 Builder.defineMacro("__SVR4");
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +0000448 }
449public:
450 AuroraUXTargetInfo(const std::string& triple)
451 : OSTargetInfo<Target>(triple) {
452 this->UserLabelPrefix = "";
453 this->WCharType = this->SignedLong;
454 // FIXME: WIntType should be SignedLong
455 }
456};
457
Edwin Török36565e52009-06-30 17:10:35 +0000458// Solaris target
459template<typename Target>
460class SolarisTargetInfo : public OSTargetInfo<Target> {
461protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +0000462 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000463 MacroBuilder &Builder) const {
464 DefineStd(Builder, "sun", Opts);
465 DefineStd(Builder, "unix", Opts);
466 Builder.defineMacro("__ELF__");
467 Builder.defineMacro("__svr4__");
468 Builder.defineMacro("__SVR4");
Edwin Török36565e52009-06-30 17:10:35 +0000469 }
470public:
Mike Stump25cf7602009-09-09 15:08:12 +0000471 SolarisTargetInfo(const std::string& triple)
Edwin Török36565e52009-06-30 17:10:35 +0000472 : OSTargetInfo<Target>(triple) {
473 this->UserLabelPrefix = "";
474 this->WCharType = this->SignedLong;
475 // FIXME: WIntType should be SignedLong
476 }
477};
Michael J. Spencer01e70082010-10-21 05:21:48 +0000478
479// Windows target
480template<typename Target>
481class WindowsTargetInfo : public OSTargetInfo<Target> {
482protected:
483 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
484 MacroBuilder &Builder) const {
Michael J. Spencer4fb461c2010-10-21 08:22:51 +0000485 Builder.defineMacro("_WIN32");
486 }
487 void getVisualStudioDefines(const LangOptions &Opts,
488 MacroBuilder &Builder) const {
Michael J. Spencer01e70082010-10-21 05:21:48 +0000489 if (Opts.CPlusPlus) {
490 if (Opts.RTTI)
491 Builder.defineMacro("_CPPRTTI");
492
493 if (Opts.Exceptions)
494 Builder.defineMacro("_CPPUNWIND");
495 }
496
497 if (!Opts.CharIsSigned)
498 Builder.defineMacro("_CHAR_UNSIGNED");
499
500 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
501 // but it works for now.
502 if (Opts.POSIXThreads)
503 Builder.defineMacro("_MT");
Michael J. Spencer4fb461c2010-10-21 08:22:51 +0000504
Michael J. Spencer01e70082010-10-21 05:21:48 +0000505 if (Opts.MSCVersion != 0)
506 Builder.defineMacro("_MSC_VER", llvm::Twine(Opts.MSCVersion));
507
508 if (Opts.Microsoft) {
509 Builder.defineMacro("_MSC_EXTENSIONS");
510
511 if (Opts.CPlusPlus0x) {
512 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
513 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
514 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
515 }
516 }
517
518 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer01e70082010-10-21 05:21:48 +0000519 }
520
Michael J. Spencer01e70082010-10-21 05:21:48 +0000521public:
522 WindowsTargetInfo(const std::string &triple)
523 : OSTargetInfo<Target>(triple) {}
524};
525
Mike Stump25cf7602009-09-09 15:08:12 +0000526} // end anonymous namespace.
Edwin Török36565e52009-06-30 17:10:35 +0000527
Chris Lattnerbd00eb82008-10-05 21:50:58 +0000528//===----------------------------------------------------------------------===//
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000529// Specific target implementations.
530//===----------------------------------------------------------------------===//
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000531
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000532namespace {
533// PPC abstract base class
534class PPCTargetInfo : public TargetInfo {
535 static const Builtin::Info BuiltinInfo[];
536 static const char * const GCCRegNames[];
537 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000538public:
Eli Friedmand9389be2009-06-05 07:05:05 +0000539 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
540
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000541 virtual void getTargetBuiltins(const Builtin::Info *&Records,
542 unsigned &NumRecords) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000543 Records = BuiltinInfo;
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000544 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000545 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000546
Chris Lattner79682402009-03-20 15:52:06 +0000547 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000548 MacroBuilder &Builder) const;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000549
Anton Korobeynikove7772382009-05-03 13:42:53 +0000550 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000551 unsigned &NumNames) const;
Anton Korobeynikove7772382009-05-03 13:42:53 +0000552 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000553 unsigned &NumAliases) const;
Anders Carlsson36834a72009-02-28 17:11:49 +0000554 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerc49cc1a2009-04-26 07:16:29 +0000555 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson36834a72009-02-28 17:11:49 +0000556 switch (*Name) {
Anders Carlsson4ce42302007-11-27 04:11:28 +0000557 default: return false;
558 case 'O': // Zero
John Thompson1deeb9f2010-06-24 22:44:13 +0000559 break;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000560 case 'b': // Base register
561 case 'f': // Floating point register
Chris Lattnerc49cc1a2009-04-26 07:16:29 +0000562 Info.setAllowsRegister();
John Thompson1deeb9f2010-06-24 22:44:13 +0000563 break;
564 // FIXME: The following are added to allow parsing.
565 // I just took a guess at what the actions should be.
566 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000567 case 'd': // Floating point register (containing 64-bit value)
John Thompson1deeb9f2010-06-24 22:44:13 +0000568 case 'v': // Altivec vector register
569 Info.setAllowsRegister();
570 break;
571 case 'w':
572 switch (Name[1]) {
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000573 case 'd':// VSX vector register to hold vector double data
574 case 'f':// VSX vector register to hold vector float data
575 case 's':// VSX vector register to hold scalar float data
576 case 'a':// Any VSX register
John Thompson1deeb9f2010-06-24 22:44:13 +0000577 break;
578 default:
579 return false;
580 }
581 Info.setAllowsRegister();
582 Name++; // Skip over 'w'.
583 break;
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000584 case 'h': // `MQ', `CTR', or `LINK' register
585 case 'q': // `MQ' register
586 case 'c': // `CTR' register
587 case 'l': // `LINK' register
588 case 'x': // `CR' register (condition register) number 0
589 case 'y': // `CR' register (condition register)
590 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson1deeb9f2010-06-24 22:44:13 +0000591 Info.setAllowsRegister();
592 break;
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000593 case 'I': // Signed 16-bit constant
John Thompson1deeb9f2010-06-24 22:44:13 +0000594 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000595 // (use `L' instead for SImode constants)
596 case 'K': // Unsigned 16-bit constant
597 case 'L': // Signed 16-bit constant shifted left 16 bits
598 case 'M': // Constant larger than 31
599 case 'N': // Exact power of 2
600 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson1deeb9f2010-06-24 22:44:13 +0000601 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000602 // register with one instruction per word
John Thompson1deeb9f2010-06-24 22:44:13 +0000603 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000604 // into a register using three instructions
John Thompson1deeb9f2010-06-24 22:44:13 +0000605 break;
606 case 'm': // Memory operand. Note that on PowerPC targets, m can
607 // include addresses that update the base register. It
608 // is therefore only safe to use `m' in an asm statement
609 // if that asm statement accesses the operand exactly once.
610 // The asm statement must also use `%U<opno>' as a
Sebastian Redl097ce222010-08-17 22:42:34 +0000611 // placeholder for the "update" flag in the corresponding
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000612 // load or store instruction. For example:
John Thompson1deeb9f2010-06-24 22:44:13 +0000613 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000614 // is correct but:
John Thompson1deeb9f2010-06-24 22:44:13 +0000615 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
616 // is not. Use es rather than m if you don't want the base
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000617 // register to be updated.
618 case 'e':
John Thompsone0a39472010-06-25 00:02:05 +0000619 if (Name[1] != 's')
620 return false;
Sebastian Redl097ce222010-08-17 22:42:34 +0000621 // es: A "stable" memory operand; that is, one which does not
John Thompson1deeb9f2010-06-24 22:44:13 +0000622 // include any automodification of the base register. Unlike
623 // `m', this constraint can be used in asm statements that
624 // might access the operand several times, or that might not
John Thompsone0a39472010-06-25 00:02:05 +0000625 // access it at all.
John Thompson1deeb9f2010-06-24 22:44:13 +0000626 Info.setAllowsMemory();
John Thompsone0a39472010-06-25 00:02:05 +0000627 Name++; // Skip over 'e'.
John Thompson1deeb9f2010-06-24 22:44:13 +0000628 break;
629 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000630 // usually better to use `m' or `es' in asm statements)
John Thompson1deeb9f2010-06-24 22:44:13 +0000631 case 'Z': // Memory operand that is an indexed or indirect from a
632 // register (it is usually better to use `m' or `es' in
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000633 // asm statements)
John Thompson1deeb9f2010-06-24 22:44:13 +0000634 Info.setAllowsMemory();
635 Info.setAllowsRegister();
636 break;
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000637 case 'R': // AIX TOC entry
John Thompson1deeb9f2010-06-24 22:44:13 +0000638 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000639 // register (`p' is preferable for asm statements)
640 case 'S': // Constant suitable as a 64-bit mask operand
641 case 'T': // Constant suitable as a 32-bit mask operand
642 case 'U': // System V Release 4 small data area reference
John Thompson1deeb9f2010-06-24 22:44:13 +0000643 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000644 // instructions
645 case 'W': // Vector constant that does not require memory
646 case 'j': // Vector constant that is all zeros.
John Thompson1deeb9f2010-06-24 22:44:13 +0000647 break;
648 // End FIXME.
Anders Carlsson4ce42302007-11-27 04:11:28 +0000649 }
John Thompson1deeb9f2010-06-24 22:44:13 +0000650 return true;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000651 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000652 virtual const char *getClobbers() const {
653 return "";
Anders Carlsson4ce42302007-11-27 04:11:28 +0000654 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000655};
Anders Carlsson4ce42302007-11-27 04:11:28 +0000656
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000657const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000658#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +0000659#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000660 ALL_LANGUAGES },
Chris Lattner99ca9d62009-06-14 01:05:48 +0000661#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000662};
Anton Korobeynikove7772382009-05-03 13:42:53 +0000663
664
Chris Lattnerbef1d722009-03-02 22:27:17 +0000665/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
666/// #defines that are not tied to a specific subtarget.
Chris Lattner79682402009-03-20 15:52:06 +0000667void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000668 MacroBuilder &Builder) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +0000669 // Target identification.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000670 Builder.defineMacro("__ppc__");
671 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerf8030412010-02-16 18:14:57 +0000672 Builder.defineMacro("__powerpc__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000673 Builder.defineMacro("__POWERPC__");
Chris Lattnerbef1d722009-03-02 22:27:17 +0000674 if (PointerWidth == 64) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000675 Builder.defineMacro("_ARCH_PPC64");
676 Builder.defineMacro("_LP64");
677 Builder.defineMacro("__LP64__");
Chris Lattnerf8030412010-02-16 18:14:57 +0000678 Builder.defineMacro("__powerpc64__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000679 Builder.defineMacro("__ppc64__");
Chris Lattnerbef1d722009-03-02 22:27:17 +0000680 } else {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000681 Builder.defineMacro("__ppc__");
Chris Lattnerbef1d722009-03-02 22:27:17 +0000682 }
Anton Korobeynikove7772382009-05-03 13:42:53 +0000683
Chris Lattnerbef1d722009-03-02 22:27:17 +0000684 // Target properties.
Joerg Sonnenberger7cd1de52011-07-05 14:56:12 +0000685 if (getTriple().getOS() != llvm::Triple::NetBSD)
686 Builder.defineMacro("_BIG_ENDIAN");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000687 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000688
Chris Lattnerbef1d722009-03-02 22:27:17 +0000689 // Subtarget options.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000690 Builder.defineMacro("__NATURAL_ALIGNMENT__");
691 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikove7772382009-05-03 13:42:53 +0000692
Chris Lattnerbef1d722009-03-02 22:27:17 +0000693 // FIXME: Should be controlled by command line option.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000694 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencerd5513a32010-10-21 03:16:25 +0000695
John Thompsoned7bdbc2009-11-19 17:18:50 +0000696 if (Opts.AltiVec) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +0000697 Builder.defineMacro("__VEC__", "10206");
698 Builder.defineMacro("__ALTIVEC__");
John Thompsoned7bdbc2009-11-19 17:18:50 +0000699 }
Chris Lattnerbef1d722009-03-02 22:27:17 +0000700}
701
Chris Lattner9fd73612008-04-21 18:56:49 +0000702
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000703const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattner14d2bb72009-09-16 05:05:27 +0000704 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
705 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
706 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
707 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
708 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
709 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
710 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
711 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000712 "mq", "lr", "ctr", "ap",
Chris Lattner14d2bb72009-09-16 05:05:27 +0000713 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000714 "xer",
Chris Lattner14d2bb72009-09-16 05:05:27 +0000715 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
716 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
717 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
718 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000719 "vrsave", "vscr",
720 "spe_acc", "spefscr",
721 "sfp"
722};
Chris Lattner4b009652007-07-25 00:24:17 +0000723
Anton Korobeynikove7772382009-05-03 13:42:53 +0000724void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000725 unsigned &NumNames) const {
726 Names = GCCRegNames;
727 NumNames = llvm::array_lengthof(GCCRegNames);
728}
Chris Lattner4b009652007-07-25 00:24:17 +0000729
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000730const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
731 // While some of these aliases do map to different registers
732 // they still share the same register name.
Daniel Dunbar40b774e2009-09-17 07:03:19 +0000733 { { "0" }, "r0" },
734 { { "1"}, "r1" },
735 { { "2" }, "r2" },
736 { { "3" }, "r3" },
737 { { "4" }, "r4" },
738 { { "5" }, "r5" },
739 { { "6" }, "r6" },
740 { { "7" }, "r7" },
741 { { "8" }, "r8" },
742 { { "9" }, "r9" },
743 { { "10" }, "r10" },
744 { { "11" }, "r11" },
745 { { "12" }, "r12" },
746 { { "13" }, "r13" },
747 { { "14" }, "r14" },
748 { { "15" }, "r15" },
749 { { "16" }, "r16" },
750 { { "17" }, "r17" },
751 { { "18" }, "r18" },
752 { { "19" }, "r19" },
753 { { "20" }, "r20" },
754 { { "21" }, "r21" },
755 { { "22" }, "r22" },
756 { { "23" }, "r23" },
757 { { "24" }, "r24" },
758 { { "25" }, "r25" },
759 { { "26" }, "r26" },
760 { { "27" }, "r27" },
761 { { "28" }, "r28" },
762 { { "29" }, "r29" },
763 { { "30" }, "r30" },
764 { { "31" }, "r31" },
765 { { "fr0" }, "f0" },
766 { { "fr1" }, "f1" },
767 { { "fr2" }, "f2" },
768 { { "fr3" }, "f3" },
769 { { "fr4" }, "f4" },
770 { { "fr5" }, "f5" },
771 { { "fr6" }, "f6" },
772 { { "fr7" }, "f7" },
773 { { "fr8" }, "f8" },
774 { { "fr9" }, "f9" },
Mike Stump369c21c2009-09-17 21:15:00 +0000775 { { "fr10" }, "f10" },
Daniel Dunbar40b774e2009-09-17 07:03:19 +0000776 { { "fr11" }, "f11" },
777 { { "fr12" }, "f12" },
778 { { "fr13" }, "f13" },
779 { { "fr14" }, "f14" },
780 { { "fr15" }, "f15" },
781 { { "fr16" }, "f16" },
782 { { "fr17" }, "f17" },
783 { { "fr18" }, "f18" },
784 { { "fr19" }, "f19" },
785 { { "fr20" }, "f20" },
786 { { "fr21" }, "f21" },
787 { { "fr22" }, "f22" },
788 { { "fr23" }, "f23" },
789 { { "fr24" }, "f24" },
790 { { "fr25" }, "f25" },
791 { { "fr26" }, "f26" },
792 { { "fr27" }, "f27" },
793 { { "fr28" }, "f28" },
794 { { "fr29" }, "f29" },
795 { { "fr30" }, "f30" },
796 { { "fr31" }, "f31" },
797 { { "cc" }, "cr0" },
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000798};
799
Anton Korobeynikove7772382009-05-03 13:42:53 +0000800void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000801 unsigned &NumAliases) const {
802 Aliases = GCCRegAliases;
803 NumAliases = llvm::array_lengthof(GCCRegAliases);
804}
805} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000806
807namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000808class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000809public:
Chris Lattnerf8030412010-02-16 18:14:57 +0000810 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedman2b161652008-08-21 00:13:15 +0000811 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner2e17d912009-11-07 18:59:41 +0000812 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnerf8030412010-02-16 18:14:57 +0000813
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +0000814 switch (getTriple().getOS()) {
815 case llvm::Triple::FreeBSD:
816 case llvm::Triple::NetBSD:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +0000817 SizeType = UnsignedInt;
818 break;
Joerg Sonnenberger1a83b432011-07-04 23:11:58 +0000819 default:
Joerg Sonnenberger78542df2011-07-05 14:54:41 +0000820 break;
Joerg Sonnenberger6ac26fa2011-07-04 21:57:55 +0000821 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000822 }
823
824 virtual const char *getVAListDeclaration() const {
825 // This is the ELF definition, and is overridden by the Darwin sub-target
826 return "typedef struct __va_list_tag {"
827 " unsigned char gpr;"
828 " unsigned char fpr;"
829 " unsigned short reserved;"
830 " void* overflow_arg_area;"
831 " void* reg_save_area;"
832 "} __builtin_va_list[1];";
Eli Friedman2b161652008-08-21 00:13:15 +0000833 }
Chris Lattner4b009652007-07-25 00:24:17 +0000834};
835} // end anonymous namespace.
836
837namespace {
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000838class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000839public:
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000840 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000841 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman38e31802009-07-01 03:36:11 +0000842 IntMaxType = SignedLong;
843 UIntMaxType = UnsignedLong;
844 Int64Type = SignedLong;
Eli Friedman2b161652008-08-21 00:13:15 +0000845 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner2e17d912009-11-07 18:59:41 +0000846 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Chris Lattnere5fde952008-05-09 06:17:04 +0000847 }
Roman Divackyc81f2a22011-01-06 08:27:10 +0000848 virtual const char *getVAListDeclaration() const {
849 return "typedef char* __builtin_va_list;";
850 }
Eli Friedmanfd5a4122008-08-20 23:11:40 +0000851};
852} // end anonymous namespace.
853
Daniel Dunbar6501cab2010-05-30 00:07:30 +0000854
855namespace {
Roman Divackyc81f2a22011-01-06 08:27:10 +0000856class DarwinPPC32TargetInfo :
857 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar6501cab2010-05-30 00:07:30 +0000858public:
Roman Divackyc81f2a22011-01-06 08:27:10 +0000859 DarwinPPC32TargetInfo(const std::string& triple)
860 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar6501cab2010-05-30 00:07:30 +0000861 HasAlignMac68kSupport = true;
Roman Divackyc81f2a22011-01-06 08:27:10 +0000862 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
863 }
864 virtual const char *getVAListDeclaration() const {
865 return "typedef char* __builtin_va_list;";
Daniel Dunbar6501cab2010-05-30 00:07:30 +0000866 }
867};
868
869class DarwinPPC64TargetInfo :
870 public DarwinTargetInfo<PPC64TargetInfo> {
871public:
872 DarwinPPC64TargetInfo(const std::string& triple)
873 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
874 HasAlignMac68kSupport = true;
875 }
876};
877} // end anonymous namespace.
878
Chris Lattner4b009652007-07-25 00:24:17 +0000879namespace {
Justin Holewinski285dc652011-04-20 19:34:15 +0000880 class PTXTargetInfo : public TargetInfo {
881 static const char * const GCCRegNames[];
882 static const Builtin::Info BuiltinInfo[];
883 public:
884 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
885 TLSSupported = false;
886 LongWidth = LongAlign = 64;
887 }
888 virtual void getTargetDefines(const LangOptions &Opts,
889 MacroBuilder &Builder) const {
890 Builder.defineMacro("__PTX__");
891 }
892 virtual void getTargetBuiltins(const Builtin::Info *&Records,
893 unsigned &NumRecords) const {
894 Records = BuiltinInfo;
895 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
896 }
897
898 virtual void getGCCRegNames(const char * const *&Names,
899 unsigned &NumNames) const;
900 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
901 unsigned &NumAliases) const {
902 // No aliases.
903 Aliases = 0;
904 NumAliases = 0;
905 }
906 virtual bool validateAsmConstraint(const char *&Name,
907 TargetInfo::ConstraintInfo &info) const {
908 // FIXME: implement
909 return true;
910 }
911 virtual const char *getClobbers() const {
912 // FIXME: Is this really right?
913 return "";
914 }
915 virtual const char *getVAListDeclaration() const {
916 // FIXME: implement
917 return "typedef char* __builtin_va_list;";
918 }
919 };
920
921 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +0000922#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +0000923#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +0000924 ALL_LANGUAGES },
Justin Holewinski285dc652011-04-20 19:34:15 +0000925#include "clang/Basic/BuiltinsPTX.def"
926 };
927
928 const char * const PTXTargetInfo::GCCRegNames[] = {
929 "r0"
930 };
931
932 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
933 unsigned &NumNames) const {
934 Names = GCCRegNames;
935 NumNames = llvm::array_lengthof(GCCRegNames);
936 }
937
938
939 class PTX32TargetInfo : public PTXTargetInfo {
940 public:
941 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
942 PointerWidth = PointerAlign = 32;
943 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
944 DescriptionString
945 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
946 }
947 };
948
949 class PTX64TargetInfo : public PTXTargetInfo {
950 public:
951 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
952 PointerWidth = PointerAlign = 64;
953 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
954 DescriptionString
955 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
956 }
957 };
958}
959
960namespace {
Chris Lattner2c026472010-03-06 21:21:27 +0000961// MBlaze abstract base class
962class MBlazeTargetInfo : public TargetInfo {
963 static const char * const GCCRegNames[];
964 static const TargetInfo::GCCRegAlias GCCRegAliases[];
965
966public:
967 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Pecka48fa4b2010-12-12 20:56:47 +0000968 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner2c026472010-03-06 21:21:27 +0000969 }
970
971 virtual void getTargetBuiltins(const Builtin::Info *&Records,
972 unsigned &NumRecords) const {
973 // FIXME: Implement.
974 Records = 0;
975 NumRecords = 0;
976 }
977
978 virtual void getTargetDefines(const LangOptions &Opts,
979 MacroBuilder &Builder) const;
980
981 virtual const char *getVAListDeclaration() const {
982 return "typedef char* __builtin_va_list;";
983 }
984 virtual const char *getTargetPrefix() const {
985 return "mblaze";
986 }
987 virtual void getGCCRegNames(const char * const *&Names,
988 unsigned &NumNames) const;
989 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
990 unsigned &NumAliases) const;
991 virtual bool validateAsmConstraint(const char *&Name,
992 TargetInfo::ConstraintInfo &Info) const {
993 switch (*Name) {
994 default: return false;
995 case 'O': // Zero
996 return true;
997 case 'b': // Base register
998 case 'f': // Floating point register
999 Info.setAllowsRegister();
1000 return true;
1001 }
1002 }
1003 virtual const char *getClobbers() const {
1004 return "";
1005 }
1006};
1007
1008/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1009/// #defines that are not tied to a specific subtarget.
1010void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1011 MacroBuilder &Builder) const {
1012 // Target identification.
1013 Builder.defineMacro("__microblaze__");
1014 Builder.defineMacro("_ARCH_MICROBLAZE");
1015 Builder.defineMacro("__MICROBLAZE__");
1016
1017 // Target properties.
1018 Builder.defineMacro("_BIG_ENDIAN");
1019 Builder.defineMacro("__BIG_ENDIAN__");
1020
1021 // Subtarget options.
1022 Builder.defineMacro("__REGISTER_PREFIX__", "");
1023}
1024
1025
1026const char * const MBlazeTargetInfo::GCCRegNames[] = {
1027 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1028 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1029 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1030 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1031 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1032 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1033 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1034 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1035 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1036 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1037};
1038
1039void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1040 unsigned &NumNames) const {
1041 Names = GCCRegNames;
1042 NumNames = llvm::array_lengthof(GCCRegNames);
1043}
1044
1045const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1046 { {"f0"}, "r0" },
1047 { {"f1"}, "r1" },
1048 { {"f2"}, "r2" },
1049 { {"f3"}, "r3" },
1050 { {"f4"}, "r4" },
1051 { {"f5"}, "r5" },
1052 { {"f6"}, "r6" },
1053 { {"f7"}, "r7" },
1054 { {"f8"}, "r8" },
1055 { {"f9"}, "r9" },
1056 { {"f10"}, "r10" },
1057 { {"f11"}, "r11" },
1058 { {"f12"}, "r12" },
1059 { {"f13"}, "r13" },
1060 { {"f14"}, "r14" },
1061 { {"f15"}, "r15" },
1062 { {"f16"}, "r16" },
1063 { {"f17"}, "r17" },
1064 { {"f18"}, "r18" },
1065 { {"f19"}, "r19" },
1066 { {"f20"}, "r20" },
1067 { {"f21"}, "r21" },
1068 { {"f22"}, "r22" },
1069 { {"f23"}, "r23" },
1070 { {"f24"}, "r24" },
1071 { {"f25"}, "r25" },
1072 { {"f26"}, "r26" },
1073 { {"f27"}, "r27" },
1074 { {"f28"}, "r28" },
1075 { {"f29"}, "r29" },
1076 { {"f30"}, "r30" },
1077 { {"f31"}, "r31" },
1078};
1079
1080void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1081 unsigned &NumAliases) const {
1082 Aliases = GCCRegAliases;
1083 NumAliases = llvm::array_lengthof(GCCRegAliases);
1084}
1085} // end anonymous namespace.
1086
1087namespace {
Eli Friedman872996c2008-08-20 02:34:37 +00001088// Namespace for x86 abstract base class
1089const Builtin::Info BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00001090#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00001091#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00001092 ALL_LANGUAGES },
Chris Lattner99ca9d62009-06-14 01:05:48 +00001093#include "clang/Basic/BuiltinsX86.def"
Eli Friedman872996c2008-08-20 02:34:37 +00001094};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001095
Nuno Lopesad1010d2009-12-23 17:49:57 +00001096static const char* const GCCRegNames[] = {
Eli Friedman872996c2008-08-20 02:34:37 +00001097 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1098 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher7c9adf92011-07-07 22:55:26 +00001099 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman872996c2008-08-20 02:34:37 +00001100 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1101 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1102 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercfd323d2011-06-21 00:05:20 +00001103 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eli Friedman872996c2008-08-20 02:34:37 +00001104};
1105
Eric Christophercfd323d2011-06-21 00:05:20 +00001106const TargetInfo::AddlRegName AddlRegNames[] = {
1107 { { "al", "ah", "eax", "rax" }, 0 },
1108 { { "bl", "bh", "ebx", "rbx" }, 3 },
1109 { { "cl", "ch", "ecx", "rcx" }, 2 },
1110 { { "dl", "dh", "edx", "rdx" }, 1 },
1111 { { "esi", "rsi" }, 4 },
1112 { { "edi", "rdi" }, 5 },
1113 { { "esp", "rsp" }, 7 },
1114 { { "ebp", "rbp" }, 6 },
Eli Friedman872996c2008-08-20 02:34:37 +00001115};
1116
1117// X86 target abstract base class; x86-32 and x86-64 are very close, so
1118// most of the implementation can be shared.
1119class X86TargetInfo : public TargetInfo {
Chris Lattner715fe4c2009-03-02 22:40:39 +00001120 enum X86SSEEnum {
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001121 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
Chris Lattner715fe4c2009-03-02 22:40:39 +00001122 } SSELevel;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001123 enum MMX3DNowEnum {
1124 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1125 } MMX3DNowLevel;
Anders Carlssone5e222f2010-01-27 03:47:49 +00001126
Eric Christopher6c4e7872010-04-02 23:50:19 +00001127 bool HasAES;
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00001128 bool HasAVX;
1129
Eli Friedman872996c2008-08-20 02:34:37 +00001130public:
Anton Korobeynikove7772382009-05-03 13:42:53 +00001131 X86TargetInfo(const std::string& triple)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001132 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00001133 HasAES(false), HasAVX(false) {
Eli Friedman872996c2008-08-20 02:34:37 +00001134 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +00001135 }
1136 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1137 unsigned &NumRecords) const {
Eli Friedman872996c2008-08-20 02:34:37 +00001138 Records = BuiltinInfo;
1139 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +00001140 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00001141 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman872996c2008-08-20 02:34:37 +00001142 unsigned &NumNames) const {
1143 Names = GCCRegNames;
1144 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +00001145 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00001146 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson7dd1c952007-11-24 23:38:12 +00001147 unsigned &NumAliases) const {
Eric Christophercfd323d2011-06-21 00:05:20 +00001148 Aliases = 0;
1149 NumAliases = 0;
1150 }
1151 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1152 unsigned &NumNames) const {
1153 Names = AddlRegNames;
1154 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +00001155 }
Anders Carlsson36834a72009-02-28 17:11:49 +00001156 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman872996c2008-08-20 02:34:37 +00001157 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings002333f2011-06-07 23:45:05 +00001158 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlsson4ce42302007-11-27 04:11:28 +00001159 virtual const char *getClobbers() const {
Eli Friedman872996c2008-08-20 02:34:37 +00001160 return "~{dirflag},~{fpsr},~{flags}";
1161 }
Chris Lattner79682402009-03-20 15:52:06 +00001162 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001163 MacroBuilder &Builder) const;
Daniel Dunbar0838f962009-05-06 21:07:50 +00001164 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1165 const std::string &Name,
1166 bool Enabled) const;
Mike Stump25cf7602009-09-09 15:08:12 +00001167 virtual void getDefaultFeatures(const std::string &CPU,
Daniel Dunbar0838f962009-05-06 21:07:50 +00001168 llvm::StringMap<bool> &Features) const;
Daniel Dunbar4f7cd962009-12-19 03:30:57 +00001169 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001170 virtual const char* getABI() const {
1171 return MMX3DNowLevel == NoMMX3DNow ? "no-mmx" : "";
1172 }
Chris Lattner4b009652007-07-25 00:24:17 +00001173};
Chris Lattner7d6220c2009-03-02 22:20:04 +00001174
Mike Stump25cf7602009-09-09 15:08:12 +00001175void X86TargetInfo::getDefaultFeatures(const std::string &CPU,
Daniel Dunbar0838f962009-05-06 21:07:50 +00001176 llvm::StringMap<bool> &Features) const {
Daniel Dunbar07181d72009-05-06 03:16:41 +00001177 // FIXME: This should not be here.
1178 Features["3dnow"] = false;
1179 Features["3dnowa"] = false;
1180 Features["mmx"] = false;
1181 Features["sse"] = false;
1182 Features["sse2"] = false;
1183 Features["sse3"] = false;
1184 Features["ssse3"] = false;
1185 Features["sse41"] = false;
1186 Features["sse42"] = false;
Eric Christopher6c4e7872010-04-02 23:50:19 +00001187 Features["aes"] = false;
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00001188 Features["avx"] = false;
Anton Korobeynikove7772382009-05-03 13:42:53 +00001189
Daniel Dunbar07181d72009-05-06 03:16:41 +00001190 // LLVM does not currently recognize this.
1191 // Features["sse4a"] = false;
Anton Korobeynikove7772382009-05-03 13:42:53 +00001192
Daniel Dunbar07181d72009-05-06 03:16:41 +00001193 // FIXME: This *really* should not be here.
1194
1195 // X86_64 always has SSE2.
1196 if (PointerWidth == 64)
1197 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1198
Daniel Dunbarc2e55de2009-05-06 21:56:32 +00001199 if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
1200 CPU == "pentium" || CPU == "i686" || CPU == "pentiumpro")
1201 ;
1202 else if (CPU == "pentium-mmx" || CPU == "pentium2")
1203 setFeatureEnabled(Features, "mmx", true);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001204 else if (CPU == "pentium3") {
1205 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarc2e55de2009-05-06 21:56:32 +00001206 setFeatureEnabled(Features, "sse", true);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001207 } else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64") {
1208 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarc2e55de2009-05-06 21:56:32 +00001209 setFeatureEnabled(Features, "sse2", true);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001210 } else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona") {
1211 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarc2e55de2009-05-06 21:56:32 +00001212 setFeatureEnabled(Features, "sse3", true);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001213 } else if (CPU == "core2") {
1214 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarc2e55de2009-05-06 21:56:32 +00001215 setFeatureEnabled(Features, "ssse3", true);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001216 } else if (CPU == "penryn") {
1217 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarc2e55de2009-05-06 21:56:32 +00001218 setFeatureEnabled(Features, "sse4", true);
1219 Features["sse42"] = false;
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001220 } else if (CPU == "atom") {
1221 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarc2e55de2009-05-06 21:56:32 +00001222 setFeatureEnabled(Features, "sse3", true);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001223 } else if (CPU == "corei7") {
1224 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarc2e55de2009-05-06 21:56:32 +00001225 setFeatureEnabled(Features, "sse4", true);
Eric Christopher6c4e7872010-04-02 23:50:19 +00001226 setFeatureEnabled(Features, "aes", true);
Benjamin Kramerb65b6722011-05-20 15:11:23 +00001227 } else if (CPU == "corei7-avx") {
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001228 setFeatureEnabled(Features, "mmx", true);
Roman Divackybcaa3b82011-04-05 20:32:44 +00001229 setFeatureEnabled(Features, "sse4", true);
1230 setFeatureEnabled(Features, "aes", true);
Bruno Cardoso Lopese02d3912011-07-11 23:33:46 +00001231 //setFeatureEnabled(Features, "avx", true);
Roman Divackybcaa3b82011-04-05 20:32:44 +00001232 } else if (CPU == "k6" || CPU == "winchip-c6")
Daniel Dunbarc2e55de2009-05-06 21:56:32 +00001233 setFeatureEnabled(Features, "mmx", true);
Mike Stump25cf7602009-09-09 15:08:12 +00001234 else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" ||
Daniel Dunbarc2e55de2009-05-06 21:56:32 +00001235 CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") {
Daniel Dunbarc2e55de2009-05-06 21:56:32 +00001236 setFeatureEnabled(Features, "3dnow", true);
1237 } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") {
1238 setFeatureEnabled(Features, "sse", true);
1239 setFeatureEnabled(Features, "3dnowa", true);
1240 } else if (CPU == "k8" || CPU == "opteron" || CPU == "athlon64" ||
1241 CPU == "athlon-fx") {
Mike Stump25cf7602009-09-09 15:08:12 +00001242 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarc2e55de2009-05-06 21:56:32 +00001243 setFeatureEnabled(Features, "3dnowa", true);
Roman Divackyc8b09a12010-12-29 13:28:29 +00001244 } else if (CPU == "k8-sse3") {
1245 setFeatureEnabled(Features, "sse3", true);
1246 setFeatureEnabled(Features, "3dnowa", true);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001247 } else if (CPU == "c3-2") {
1248 setFeatureEnabled(Features, "mmx", true);
Daniel Dunbarc2e55de2009-05-06 21:56:32 +00001249 setFeatureEnabled(Features, "sse", true);
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001250 }
Daniel Dunbar07181d72009-05-06 03:16:41 +00001251}
1252
Daniel Dunbar0838f962009-05-06 21:07:50 +00001253bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Mike Stump25cf7602009-09-09 15:08:12 +00001254 const std::string &Name,
Daniel Dunbar0838f962009-05-06 21:07:50 +00001255 bool Enabled) const {
Eric Christopher850e2012010-03-04 02:26:37 +00001256 // FIXME: This *really* should not be here. We need some way of translating
1257 // options into llvm subtarget features.
1258 if (!Features.count(Name) &&
1259 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
Daniel Dunbar0838f962009-05-06 21:07:50 +00001260 return false;
1261
1262 if (Enabled) {
1263 if (Name == "mmx")
1264 Features["mmx"] = true;
1265 else if (Name == "sse")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001266 Features["sse"] = true;
Daniel Dunbar0838f962009-05-06 21:07:50 +00001267 else if (Name == "sse2")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001268 Features["sse"] = Features["sse2"] = true;
Daniel Dunbar0838f962009-05-06 21:07:50 +00001269 else if (Name == "sse3")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001270 Features["sse"] = Features["sse2"] = Features["sse3"] = true;
Daniel Dunbar0838f962009-05-06 21:07:50 +00001271 else if (Name == "ssse3")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001272 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar0838f962009-05-06 21:07:50 +00001273 Features["ssse3"] = true;
Eric Christopher850e2012010-03-04 02:26:37 +00001274 else if (Name == "sse4" || Name == "sse4.2")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001275 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar0838f962009-05-06 21:07:50 +00001276 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
Eric Christopher850e2012010-03-04 02:26:37 +00001277 else if (Name == "sse4.1")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001278 Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopher850e2012010-03-04 02:26:37 +00001279 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbar0838f962009-05-06 21:07:50 +00001280 else if (Name == "3dnow")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001281 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbar0838f962009-05-06 21:07:50 +00001282 else if (Name == "3dnowa")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001283 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christopher6c4e7872010-04-02 23:50:19 +00001284 else if (Name == "aes")
1285 Features["aes"] = true;
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00001286 else if (Name == "avx")
1287 Features["avx"] = true;
Daniel Dunbar0838f962009-05-06 21:07:50 +00001288 } else {
1289 if (Name == "mmx")
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001290 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbar0838f962009-05-06 21:07:50 +00001291 else if (Name == "sse")
Mike Stump25cf7602009-09-09 15:08:12 +00001292 Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbar0838f962009-05-06 21:07:50 +00001293 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1294 else if (Name == "sse2")
Mike Stump25cf7602009-09-09 15:08:12 +00001295 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Daniel Dunbar0838f962009-05-06 21:07:50 +00001296 Features["sse41"] = Features["sse42"] = false;
1297 else if (Name == "sse3")
Mike Stump25cf7602009-09-09 15:08:12 +00001298 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Daniel Dunbar0838f962009-05-06 21:07:50 +00001299 Features["sse42"] = false;
1300 else if (Name == "ssse3")
1301 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
Michael J. Spencerb24bac92011-04-17 19:22:03 +00001302 else if (Name == "sse4" || Name == "sse4.1")
Daniel Dunbar0838f962009-05-06 21:07:50 +00001303 Features["sse41"] = Features["sse42"] = false;
Eric Christopherd794f782010-03-04 02:31:44 +00001304 else if (Name == "sse4.2")
1305 Features["sse42"] = false;
Daniel Dunbar0838f962009-05-06 21:07:50 +00001306 else if (Name == "3dnow")
1307 Features["3dnow"] = Features["3dnowa"] = false;
1308 else if (Name == "3dnowa")
1309 Features["3dnowa"] = false;
Eric Christopher6c4e7872010-04-02 23:50:19 +00001310 else if (Name == "aes")
1311 Features["aes"] = false;
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00001312 else if (Name == "avx")
1313 Features["avx"] = false;
Daniel Dunbar0838f962009-05-06 21:07:50 +00001314 }
1315
1316 return true;
1317}
1318
Daniel Dunbar07181d72009-05-06 03:16:41 +00001319/// HandleTargetOptions - Perform initialization based on the user
1320/// configured set of features.
Daniel Dunbar4f7cd962009-12-19 03:30:57 +00001321void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00001322 // Remember the maximum enabled sselevel.
1323 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1324 // Ignore disabled features.
1325 if (Features[i][0] == '-')
1326 continue;
1327
Eric Christopher6c4e7872010-04-02 23:50:19 +00001328 if (Features[i].substr(1) == "aes") {
1329 HasAES = true;
1330 continue;
1331 }
1332
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00001333 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1334 // For now let it be enabled together with other SSE levels.
1335 if (Features[i].substr(1) == "avx") {
1336 HasAVX = true;
1337 continue;
1338 }
1339
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00001340 assert(Features[i][0] == '+' && "Invalid target feature!");
1341 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1342 .Case("sse42", SSE42)
1343 .Case("sse41", SSE41)
1344 .Case("ssse3", SSSE3)
Nuno Lopes3a16d782010-03-12 10:20:09 +00001345 .Case("sse3", SSE3)
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00001346 .Case("sse2", SSE2)
1347 .Case("sse", SSE1)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001348 .Default(NoSSE);
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00001349 SSELevel = std::max(SSELevel, Level);
Michael J. Spencerd5513a32010-10-21 03:16:25 +00001350
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001351 MMX3DNowEnum ThreeDNowLevel =
1352 llvm::StringSwitch<MMX3DNowEnum>(Features[i].substr(1))
Anders Carlssone5e222f2010-01-27 03:47:49 +00001353 .Case("3dnowa", AMD3DNowAthlon)
1354 .Case("3dnow", AMD3DNow)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001355 .Case("mmx", MMX)
1356 .Default(NoMMX3DNow);
Michael J. Spencerd5513a32010-10-21 03:16:25 +00001357
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001358 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar8dd8f262009-11-11 09:38:56 +00001359 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001360
1361 // Don't tell the backend if we're turning off mmx; it will end up disabling
1362 // SSE, which we don't want.
1363 std::vector<std::string>::iterator it;
1364 it = std::find(Features.begin(), Features.end(), "-mmx");
1365 if (it != Features.end())
1366 Features.erase(it);
Chris Lattner7d6220c2009-03-02 22:20:04 +00001367}
Chris Lattnerbef1d722009-03-02 22:27:17 +00001368
1369/// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines
1370/// that are not tied to a specific subtarget.
Chris Lattner79682402009-03-20 15:52:06 +00001371void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001372 MacroBuilder &Builder) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +00001373 // Target identification.
1374 if (PointerWidth == 64) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001375 Builder.defineMacro("_LP64");
1376 Builder.defineMacro("__LP64__");
1377 Builder.defineMacro("__amd64__");
1378 Builder.defineMacro("__amd64");
1379 Builder.defineMacro("__x86_64");
1380 Builder.defineMacro("__x86_64__");
Chris Lattnerbef1d722009-03-02 22:27:17 +00001381 } else {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001382 DefineStd(Builder, "i386", Opts);
Chris Lattnerbef1d722009-03-02 22:27:17 +00001383 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00001384
Eric Christopher6c4e7872010-04-02 23:50:19 +00001385 if (HasAES)
1386 Builder.defineMacro("__AES__");
1387
Bruno Cardoso Lopes8a93f512010-08-04 22:29:13 +00001388 if (HasAVX)
1389 Builder.defineMacro("__AVX__");
1390
Chris Lattnerbef1d722009-03-02 22:27:17 +00001391 // Target properties.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001392 Builder.defineMacro("__LITTLE_ENDIAN__");
Anton Korobeynikove7772382009-05-03 13:42:53 +00001393
Chris Lattnerbef1d722009-03-02 22:27:17 +00001394 // Subtarget options.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001395 Builder.defineMacro("__nocona");
1396 Builder.defineMacro("__nocona__");
1397 Builder.defineMacro("__tune_nocona__");
1398 Builder.defineMacro("__REGISTER_PREFIX__", "");
Chris Lattner715fe4c2009-03-02 22:40:39 +00001399
Chris Lattner25ac1c12009-04-19 17:32:33 +00001400 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1401 // functions in glibc header files that use FP Stack inline asm which the
1402 // backend can't deal with (PR879).
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001403 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikove7772382009-05-03 13:42:53 +00001404
Chris Lattner715fe4c2009-03-02 22:40:39 +00001405 // Each case falls through to the previous one here.
1406 switch (SSELevel) {
1407 case SSE42:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001408 Builder.defineMacro("__SSE4_2__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00001409 case SSE41:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001410 Builder.defineMacro("__SSE4_1__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00001411 case SSSE3:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001412 Builder.defineMacro("__SSSE3__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00001413 case SSE3:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001414 Builder.defineMacro("__SSE3__");
Chris Lattner715fe4c2009-03-02 22:40:39 +00001415 case SSE2:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001416 Builder.defineMacro("__SSE2__");
1417 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner715fe4c2009-03-02 22:40:39 +00001418 case SSE1:
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001419 Builder.defineMacro("__SSE__");
1420 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001421 case NoSSE:
Chris Lattner715fe4c2009-03-02 22:40:39 +00001422 break;
1423 }
Michael J. Spencer3d796932010-10-18 07:10:59 +00001424
Michael J. Spencer01e70082010-10-21 05:21:48 +00001425 if (Opts.Microsoft && PointerWidth == 32) {
Michael J. Spencer01e70082010-10-21 05:21:48 +00001426 switch (SSELevel) {
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00001427 case SSE42:
1428 case SSE41:
1429 case SSSE3:
1430 case SSE3:
Michael J. Spencer01e70082010-10-21 05:21:48 +00001431 case SSE2:
1432 Builder.defineMacro("_M_IX86_FP", llvm::Twine(2));
1433 break;
1434 case SSE1:
1435 Builder.defineMacro("_M_IX86_FP", llvm::Twine(1));
1436 break;
1437 default:
1438 Builder.defineMacro("_M_IX86_FP", llvm::Twine(0));
1439 }
1440 }
1441
Anders Carlssone5e222f2010-01-27 03:47:49 +00001442 // Each case falls through to the previous one here.
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001443 switch (MMX3DNowLevel) {
Anders Carlssone5e222f2010-01-27 03:47:49 +00001444 case AMD3DNowAthlon:
1445 Builder.defineMacro("__3dNOW_A__");
1446 case AMD3DNow:
1447 Builder.defineMacro("__3dNOW__");
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00001448 case MMX:
1449 Builder.defineMacro("__MMX__");
1450 case NoMMX3DNow:
Anders Carlssone5e222f2010-01-27 03:47:49 +00001451 break;
1452 }
Chris Lattnerbef1d722009-03-02 22:27:17 +00001453}
Anton Korobeynikove7772382009-05-03 13:42:53 +00001454
1455
Eli Friedman872996c2008-08-20 02:34:37 +00001456bool
Anders Carlsson36834a72009-02-28 17:11:49 +00001457X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerc49cc1a2009-04-26 07:16:29 +00001458 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson36834a72009-02-28 17:11:49 +00001459 switch (*Name) {
Eli Friedman872996c2008-08-20 02:34:37 +00001460 default: return false;
Dale Johanneseneba819a2010-08-24 22:33:12 +00001461 case 'Y': // first letter of a pair:
1462 switch (*(Name+1)) {
1463 default: return false;
1464 case '0': // First SSE register.
1465 case 't': // Any SSE register, when SSE2 is enabled.
1466 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1467 case 'm': // any MMX register, when inter-unit moves enabled.
1468 break; // falls through to setAllowsRegister.
1469 }
Eli Friedman872996c2008-08-20 02:34:37 +00001470 case 'a': // eax.
1471 case 'b': // ebx.
1472 case 'c': // ecx.
1473 case 'd': // edx.
1474 case 'S': // esi.
1475 case 'D': // edi.
1476 case 'A': // edx:eax.
Dale Johanneseneba819a2010-08-24 22:33:12 +00001477 case 'f': // any x87 floating point stack register.
Eli Friedman872996c2008-08-20 02:34:37 +00001478 case 't': // top of floating point stack.
1479 case 'u': // second from top of floating point stack.
1480 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson2285e622008-10-06 00:41:45 +00001481 case 'y': // Any MMX register.
Anders Carlssond2459f92008-10-06 19:17:39 +00001482 case 'x': // Any SSE register.
Eli Friedman872996c2008-08-20 02:34:37 +00001483 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johanneseneba819a2010-08-24 22:33:12 +00001484 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1485 case 'l': // "Index" registers: any general register that can be used as an
1486 // index in a base+index memory access.
1487 Info.setAllowsRegister();
1488 return true;
1489 case 'C': // SSE floating point constant.
1490 case 'G': // x87 floating point constant.
Anton Korobeynikove7772382009-05-03 13:42:53 +00001491 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssonff235da2009-01-24 18:03:09 +00001492 // x86_64 instructions.
Anton Korobeynikove7772382009-05-03 13:42:53 +00001493 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssonff235da2009-01-24 18:03:09 +00001494 // x86_64 instructions.
Eli Friedman872996c2008-08-20 02:34:37 +00001495 return true;
1496 }
Dale Johanneseneba819a2010-08-24 22:33:12 +00001497 return false;
Eli Friedman872996c2008-08-20 02:34:37 +00001498}
1499
Dale Johannesen3a161e52010-10-29 23:12:32 +00001500
Eli Friedman872996c2008-08-20 02:34:37 +00001501std::string
Stuart Hastings002333f2011-06-07 23:45:05 +00001502X86TargetInfo::convertConstraint(const char *&Constraint) const {
1503 switch (*Constraint) {
Eli Friedman872996c2008-08-20 02:34:37 +00001504 case 'a': return std::string("{ax}");
1505 case 'b': return std::string("{bx}");
1506 case 'c': return std::string("{cx}");
1507 case 'd': return std::string("{dx}");
1508 case 'S': return std::string("{si}");
1509 case 'D': return std::string("{di}");
Dale Johannesena49254e2010-10-22 21:07:10 +00001510 case 'p': // address
1511 return std::string("im");
Eli Friedman872996c2008-08-20 02:34:37 +00001512 case 't': // top of floating point stack.
1513 return std::string("{st}");
1514 case 'u': // second from top of floating point stack.
1515 return std::string("{st(1)}"); // second from top of floating point stack.
1516 default:
Stuart Hastings002333f2011-06-07 23:45:05 +00001517 return std::string(1, *Constraint);
Eli Friedman872996c2008-08-20 02:34:37 +00001518 }
1519}
Eli Friedman872996c2008-08-20 02:34:37 +00001520} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +00001521
1522namespace {
Eli Friedman872996c2008-08-20 02:34:37 +00001523// X86-32 generic target
1524class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +00001525public:
Eli Friedman872996c2008-08-20 02:34:37 +00001526 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1527 DoubleAlign = LongLongAlign = 32;
1528 LongDoubleWidth = 96;
1529 LongDoubleAlign = 32;
Eli Friedman2b161652008-08-21 00:13:15 +00001530 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1531 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner2e17d912009-11-07 18:59:41 +00001532 "a0:0:64-f80:32:32-n8:16:32";
Eli Friedman04ede302009-03-29 20:31:09 +00001533 SizeType = UnsignedInt;
1534 PtrDiffType = SignedInt;
1535 IntPtrType = SignedInt;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +00001536 RegParmMax = 3;
Daniel Dunbar6f94dbb2010-07-14 23:39:36 +00001537
1538 // Use fpret for all types.
1539 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1540 (1 << TargetInfo::Double) |
1541 (1 << TargetInfo::LongDouble));
Eli Friedman872996c2008-08-20 02:34:37 +00001542 }
1543 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001544 return "typedef char* __builtin_va_list;";
Eli Friedman872996c2008-08-20 02:34:37 +00001545 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +00001546
Chris Lattneraa339182009-09-23 06:06:36 +00001547 int getEHDataRegisterNumber(unsigned RegNo) const {
1548 if (RegNo == 0) return 0;
1549 if (RegNo == 1) return 2;
1550 return -1;
1551 }
Eli Friedman872996c2008-08-20 02:34:37 +00001552};
1553} // end anonymous namespace
1554
1555namespace {
Eli Friedman1c79f4b2009-07-05 18:47:56 +00001556class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
1557public:
1558 OpenBSDI386TargetInfo(const std::string& triple) :
1559 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
1560 SizeType = UnsignedLong;
1561 IntPtrType = SignedLong;
Eli Friedman96ada022009-07-05 22:31:18 +00001562 PtrDiffType = SignedLong;
Eli Friedman1c79f4b2009-07-05 18:47:56 +00001563 }
1564};
1565} // end anonymous namespace
1566
1567namespace {
Edwin Török36565e52009-06-30 17:10:35 +00001568class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman872996c2008-08-20 02:34:37 +00001569public:
Edwin Török36565e52009-06-30 17:10:35 +00001570 DarwinI386TargetInfo(const std::string& triple) :
1571 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman872996c2008-08-20 02:34:37 +00001572 LongDoubleWidth = 128;
1573 LongDoubleAlign = 128;
Eli Friedman04ede302009-03-29 20:31:09 +00001574 SizeType = UnsignedLong;
1575 IntPtrType = SignedLong;
Eli Friedman2b161652008-08-21 00:13:15 +00001576 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1577 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Chris Lattner2e17d912009-11-07 18:59:41 +00001578 "a0:0:64-f80:128:128-n8:16:32";
Daniel Dunbar9451c542010-05-27 00:35:16 +00001579 HasAlignMac68kSupport = true;
Edwin Török2d98f9f2009-06-30 17:00:25 +00001580 }
1581
Eli Friedman872996c2008-08-20 02:34:37 +00001582};
Daniel Dunbar64c77a12009-06-29 20:52:51 +00001583} // end anonymous namespace
1584
1585namespace {
Eli Friedman23cb7912008-08-21 01:40:19 +00001586// x86-32 Windows target
Michael J. Spencer01e70082010-10-21 05:21:48 +00001587class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedman23cb7912008-08-21 01:40:19 +00001588public:
1589 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencer01e70082010-10-21 05:21:48 +00001590 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman8f575172009-04-19 21:38:35 +00001591 TLSSupported = false;
Chris Lattnera8a69e12009-06-24 17:12:15 +00001592 WCharType = UnsignedShort;
Eli Friedmanb28055e2009-06-08 21:16:17 +00001593 DoubleAlign = LongLongAlign = 64;
1594 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Anton Korobeynikov186e7d32009-12-19 02:05:07 +00001595 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
1596 "v128:128:128-a0:0:64-f80:32:32-n8:16:32";
Eli Friedman23cb7912008-08-21 01:40:19 +00001597 }
Chris Lattner79682402009-03-20 15:52:06 +00001598 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001599 MacroBuilder &Builder) const {
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00001600 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Eli Friedman23cb7912008-08-21 01:40:19 +00001601 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001602};
1603} // end anonymous namespace
Eli Friedman6b6ca942009-06-08 06:11:14 +00001604
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001605namespace {
1606
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001607// x86-32 Windows Visual Studio target
1608class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
1609public:
1610 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
1611 : WindowsX86_32TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00001612 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00001613 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001614 }
1615 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001616 MacroBuilder &Builder) const {
1617 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00001618 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001619 // The value of the following reflects processor type.
1620 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
1621 // We lost the original triple, so we use the default.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001622 Builder.defineMacro("_M_IX86", "600");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001623 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001624};
1625} // end anonymous namespace
1626
1627namespace {
1628// x86-32 MinGW target
1629class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
1630public:
1631 MinGWX86_32TargetInfo(const std::string& triple)
1632 : WindowsX86_32TargetInfo(triple) {
1633 }
1634 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001635 MacroBuilder &Builder) const {
1636 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00001637 DefineStd(Builder, "WIN32", Opts);
1638 DefineStd(Builder, "WINNT", Opts);
1639 Builder.defineMacro("_X86_");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001640 Builder.defineMacro("__MSVCRT__");
1641 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00001642
1643 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1644 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1645 if (Opts.Microsoft)
1646 // Provide "as-is" __declspec.
1647 Builder.defineMacro("__declspec", "__declspec");
1648 else
1649 // Provide alias of __attribute__ like mingw32-gcc.
1650 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001651 }
1652};
1653} // end anonymous namespace
1654
1655namespace {
1656// x86-32 Cygwin target
1657class CygwinX86_32TargetInfo : public X86_32TargetInfo {
1658public:
1659 CygwinX86_32TargetInfo(const std::string& triple)
1660 : X86_32TargetInfo(triple) {
1661 TLSSupported = false;
1662 WCharType = UnsignedShort;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001663 DoubleAlign = LongLongAlign = 64;
1664 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1665 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner2e17d912009-11-07 18:59:41 +00001666 "a0:0:64-f80:32:32-n8:16:32";
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001667 }
1668 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001669 MacroBuilder &Builder) const {
1670 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1671 Builder.defineMacro("__CYGWIN__");
1672 Builder.defineMacro("__CYGWIN32__");
1673 DefineStd(Builder, "unix", Opts);
Douglas Gregor9b22a172010-04-21 05:52:38 +00001674 if (Opts.CPlusPlus)
1675 Builder.defineMacro("_GNU_SOURCE");
Eli Friedman6b6ca942009-06-08 06:11:14 +00001676 }
Eli Friedman23cb7912008-08-21 01:40:19 +00001677};
1678} // end anonymous namespace
1679
1680namespace {
Chris Lattnerf853e732010-04-11 19:29:39 +00001681// x86-32 Haiku target
1682class HaikuX86_32TargetInfo : public X86_32TargetInfo {
1683public:
1684 HaikuX86_32TargetInfo(const std::string& triple)
1685 : X86_32TargetInfo(triple) {
1686 SizeType = UnsignedLong;
Chris Lattner5b8b18a2010-04-22 17:48:00 +00001687 IntPtrType = SignedLong;
1688 PtrDiffType = SignedLong;
Rafael Espindolaa7bdfdd2010-11-09 16:41:02 +00001689 this->UserLabelPrefix = "";
Eli Friedman08f845b2010-08-22 01:00:03 +00001690 }
Chris Lattnerf853e732010-04-11 19:29:39 +00001691 virtual void getTargetDefines(const LangOptions &Opts,
1692 MacroBuilder &Builder) const {
1693 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1694 Builder.defineMacro("__INTEL__");
1695 Builder.defineMacro("__HAIKU__");
1696 }
1697};
1698} // end anonymous namespace
1699
Douglas Gregordca52262011-07-01 22:41:14 +00001700// RTEMS Target
1701template<typename Target>
1702class RTEMSTargetInfo : public OSTargetInfo<Target> {
1703protected:
1704 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
1705 MacroBuilder &Builder) const {
1706 // RTEMS defines; list based off of gcc output
1707
1708 // FIXME: Move version number handling to llvm::Triple.
1709 llvm::StringRef Release = Triple.getOSName().substr(strlen("rtems"), 1);
1710
1711 Builder.defineMacro("__rtems__");
1712 Builder.defineMacro("__ELF__");
1713 }
1714public:
1715 RTEMSTargetInfo(const std::string &triple)
1716 : OSTargetInfo<Target>(triple) {
1717 this->UserLabelPrefix = "";
1718
1719 llvm::Triple Triple(triple);
1720 switch (Triple.getArch()) {
1721 default:
1722 case llvm::Triple::x86:
1723 // this->MCountName = ".mcount";
1724 break;
1725 case llvm::Triple::mips:
1726 case llvm::Triple::mipsel:
1727 case llvm::Triple::ppc:
1728 case llvm::Triple::ppc64:
1729 // this->MCountName = "_mcount";
1730 break;
1731 case llvm::Triple::arm:
1732 // this->MCountName = "__mcount";
1733 break;
1734 }
1735
1736 }
1737};
1738
1739namespace {
1740// x86-32 RTEMS target
1741class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
1742public:
1743 RTEMSX86_32TargetInfo(const std::string& triple)
1744 : X86_32TargetInfo(triple) {
1745 SizeType = UnsignedLong;
1746 IntPtrType = SignedLong;
1747 PtrDiffType = SignedLong;
1748 this->UserLabelPrefix = "";
1749 }
1750 virtual void getTargetDefines(const LangOptions &Opts,
1751 MacroBuilder &Builder) const {
1752 X86_32TargetInfo::getTargetDefines(Opts, Builder);
1753 Builder.defineMacro("__INTEL__");
1754 Builder.defineMacro("__rtems__");
1755 }
1756};
1757} // end anonymous namespace
1758
Chris Lattnerf853e732010-04-11 19:29:39 +00001759namespace {
Eli Friedman872996c2008-08-20 02:34:37 +00001760// x86-64 generic target
1761class X86_64TargetInfo : public X86TargetInfo {
1762public:
Chris Lattner79682402009-03-20 15:52:06 +00001763 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +00001764 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001765 LongDoubleWidth = 128;
1766 LongDoubleAlign = 128;
Rafael Espindolabfa7c002010-06-04 23:15:27 +00001767 LargeArrayMinWidth = 128;
1768 LargeArrayAlign = 128;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +00001769 IntMaxType = SignedLong;
1770 UIntMaxType = UnsignedLong;
Eli Friedman38e31802009-07-01 03:36:11 +00001771 Int64Type = SignedLong;
Anton Korobeynikov8fcffeb2009-04-03 23:38:25 +00001772 RegParmMax = 6;
Chris Lattnerbfbfbaf2009-02-05 07:32:46 +00001773
Eli Friedman2b161652008-08-21 00:13:15 +00001774 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1775 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Chris Lattner2e17d912009-11-07 18:59:41 +00001776 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64";
Daniel Dunbar6f94dbb2010-07-14 23:39:36 +00001777
1778 // Use fpret only for long double.
1779 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Chris Lattner4b009652007-07-25 00:24:17 +00001780 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +00001781 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00001782 return "typedef struct __va_list_tag {"
1783 " unsigned gp_offset;"
1784 " unsigned fp_offset;"
1785 " void* overflow_arg_area;"
1786 " void* reg_save_area;"
John McCall33bf24b2010-05-28 18:25:28 +00001787 "} __va_list_tag;"
Eli Friedman3c79eee2009-07-03 00:45:06 +00001788 "typedef __va_list_tag __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +00001789 }
Michael J. Spencer3d796932010-10-18 07:10:59 +00001790
Chris Lattneraa339182009-09-23 06:06:36 +00001791 int getEHDataRegisterNumber(unsigned RegNo) const {
1792 if (RegNo == 0) return 0;
1793 if (RegNo == 1) return 1;
1794 return -1;
1795 }
Eli Friedman872996c2008-08-20 02:34:37 +00001796};
1797} // end anonymous namespace
1798
1799namespace {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001800// x86-64 Windows target
Michael J. Spencer01e70082010-10-21 05:21:48 +00001801class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001802public:
1803 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencer01e70082010-10-21 05:21:48 +00001804 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001805 TLSSupported = false;
1806 WCharType = UnsignedShort;
Mike Stump4da7a162009-10-08 23:00:00 +00001807 LongWidth = LongAlign = 32;
Michael J. Spencer3d796932010-10-18 07:10:59 +00001808 DoubleAlign = LongLongAlign = 64;
Nate Begeman472bd992010-07-21 02:02:56 +00001809 IntMaxType = SignedLongLong;
1810 UIntMaxType = UnsignedLongLong;
1811 Int64Type = SignedLongLong;
Cameron Esfahani32083822010-09-15 00:28:12 +00001812 SizeType = UnsignedLongLong;
1813 PtrDiffType = SignedLongLong;
1814 IntPtrType = SignedLongLong;
NAKAMURA Takumi8c959d92011-01-17 22:56:08 +00001815 this->UserLabelPrefix = "";
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001816 }
1817 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001818 MacroBuilder &Builder) const {
Michael J. Spencer01e70082010-10-21 05:21:48 +00001819 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001820 Builder.defineMacro("_WIN64");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001821 }
NAKAMURA Takumi79521992011-01-17 22:56:23 +00001822 virtual const char *getVAListDeclaration() const {
1823 return "typedef char* __builtin_va_list;";
1824 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001825};
1826} // end anonymous namespace
1827
1828namespace {
1829// x86-64 Windows Visual Studio target
1830class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
1831public:
1832 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
1833 : WindowsX86_64TargetInfo(triple) {
Eli Friedmand9c3fa32011-03-22 21:25:11 +00001834 LongDoubleWidth = LongDoubleAlign = 64;
1835 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001836 }
1837 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001838 MacroBuilder &Builder) const {
1839 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00001840 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001841 Builder.defineMacro("_M_X64");
Michael J. Spencer01e70082010-10-21 05:21:48 +00001842 Builder.defineMacro("_M_AMD64");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001843 }
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001844};
1845} // end anonymous namespace
1846
1847namespace {
1848// x86-64 MinGW target
1849class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
1850public:
1851 MinGWX86_64TargetInfo(const std::string& triple)
1852 : WindowsX86_64TargetInfo(triple) {
1853 }
1854 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001855 MacroBuilder &Builder) const {
1856 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer4fb461c2010-10-21 08:22:51 +00001857 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001858 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi17c964a2011-03-08 12:06:46 +00001859 Builder.defineMacro("__MINGW32__");
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00001860 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumi853134a2011-03-15 02:32:50 +00001861
1862 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
1863 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
1864 if (Opts.Microsoft)
1865 // Provide "as-is" __declspec.
1866 Builder.defineMacro("__declspec", "__declspec");
1867 else
1868 // Provide alias of __attribute__ like mingw32-gcc.
1869 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00001870 }
1871};
1872} // end anonymous namespace
1873
1874namespace {
Eli Friedman38e31802009-07-01 03:36:11 +00001875class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
1876public:
Mike Stump25cf7602009-09-09 15:08:12 +00001877 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman38e31802009-07-01 03:36:11 +00001878 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
1879 Int64Type = SignedLongLong;
1880 }
1881};
1882} // end anonymous namespace
1883
1884namespace {
Eli Friedman96ada022009-07-05 22:31:18 +00001885class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
1886public:
Mike Stump25cf7602009-09-09 15:08:12 +00001887 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman96ada022009-07-05 22:31:18 +00001888 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
1889 IntMaxType = SignedLongLong;
1890 UIntMaxType = UnsignedLongLong;
1891 Int64Type = SignedLongLong;
1892 }
1893};
1894} // end anonymous namespace
1895
1896namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00001897class ARMTargetInfo : public TargetInfo {
Daniel Dunbar96be2a42009-12-21 23:28:17 +00001898 // Possible FPU choices.
1899 enum FPUMode {
1900 NoFPU,
1901 VFP2FPU,
1902 VFP3FPU,
1903 NeonFPU
1904 };
1905
1906 static bool FPUModeIsVFP(FPUMode Mode) {
1907 return Mode >= VFP2FPU && Mode <= NeonFPU;
1908 }
1909
1910 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1911 static const char * const GCCRegNames[];
Daniel Dunbar40b774e2009-09-17 07:03:19 +00001912
Daniel Dunbar33b40752009-12-18 18:42:37 +00001913 std::string ABI, CPU;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00001914
1915 unsigned FPU : 3;
1916
Daniel Dunbar48075d82009-12-19 04:15:38 +00001917 unsigned IsThumb : 1;
1918
1919 // Initialized via features.
1920 unsigned SoftFloat : 1;
1921 unsigned SoftFloatABI : 1;
Daniel Dunbar0d83d512009-09-14 00:35:03 +00001922
Chris Lattnerb4527522010-03-03 19:03:45 +00001923 static const Builtin::Info BuiltinInfo[];
1924
Chris Lattner9fd73612008-04-21 18:56:49 +00001925public:
Daniel Dunbarf0156562009-09-17 16:21:10 +00001926 ARMTargetInfo(const std::string &TripleStr)
Daniel Dunbar33b40752009-12-18 18:42:37 +00001927 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
Daniel Dunbar0d83d512009-09-14 00:35:03 +00001928 {
Daniel Dunbarb9531632009-09-14 00:02:24 +00001929 SizeType = UnsignedInt;
1930 PtrDiffType = SignedInt;
Daniel Dunbarf0156562009-09-17 16:21:10 +00001931
Chris Lattnere20b8122010-04-23 16:29:58 +00001932 // {} in inline assembly are neon specifiers, not assembly variant
1933 // specifiers.
1934 NoAsmVariants = true;
Michael J. Spencerd5513a32010-10-21 03:16:25 +00001935
Daniel Dunbar33b40752009-12-18 18:42:37 +00001936 // FIXME: Should we just treat this as a feature?
Daniel Dunbar0a542ca2009-12-18 19:57:13 +00001937 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar54f62dc2009-09-22 21:44:58 +00001938 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00001939 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1940 // so set preferred for small types to 32.
Daniel Dunbar54f62dc2009-09-22 21:44:58 +00001941 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
1942 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001943 "v64:64:64-v128:64:128-a0:0:32-n32");
Daniel Dunbar54f62dc2009-09-22 21:44:58 +00001944 } else {
1945 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1946 "i64:64:64-f32:32:32-f64:64:64-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001947 "v64:64:64-v128:64:128-a0:0:64-n32");
Daniel Dunbar54f62dc2009-09-22 21:44:58 +00001948 }
John McCall68086b92010-08-21 22:46:04 +00001949
1950 // ARM targets default to using the ARM C++ ABI.
1951 CXXABI = CXXABI_ARM;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00001952 }
Daniel Dunbar0d83d512009-09-14 00:35:03 +00001953 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbarb9531632009-09-14 00:02:24 +00001954 virtual bool setABI(const std::string &Name) {
Daniel Dunbar0d83d512009-09-14 00:35:03 +00001955 ABI = Name;
1956
Daniel Dunbarb9531632009-09-14 00:02:24 +00001957 // The defaults (above) are for AAPCS, check if we need to change them.
1958 //
1959 // FIXME: We need support for -meabi... we could just mangle it into the
1960 // name.
1961 if (Name == "apcs-gnu") {
Daniel Dunbarda94a772010-01-27 20:23:08 +00001962 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
Daniel Dunbarb9531632009-09-14 00:02:24 +00001963 SizeType = UnsignedLong;
1964
Daniel Dunbar9eb811b2010-04-22 16:14:54 +00001965 // Do not respect the alignment of bit-field types when laying out
1966 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
1967 UseBitFieldTypeAlignment = false;
1968
Daniel Dunbar54f62dc2009-09-22 21:44:58 +00001969 if (IsThumb) {
Sandeep Patel3a41d142011-04-04 22:58:12 +00001970 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
1971 // so set preferred for small types to 32.
Daniel Dunbar54f62dc2009-09-22 21:44:58 +00001972 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 +00001973 "i64:32:64-f32:32:32-f64:32:64-"
Bob Wilsoncd5ce092011-04-04 16:53:11 +00001974 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbar54f62dc2009-09-22 21:44:58 +00001975 } else {
1976 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 +00001977 "i64:32:64-f32:32:32-f64:32:64-"
1978 "v64:32:64-v128:32:128-a0:0:32-n32");
Daniel Dunbar54f62dc2009-09-22 21:44:58 +00001979 }
1980
Daniel Dunbarb9531632009-09-14 00:02:24 +00001981 // FIXME: Override "preferred align" for double and long long.
1982 } else if (Name == "aapcs") {
1983 // FIXME: Enumerated types are variable width in straight AAPCS.
1984 } else if (Name == "aapcs-linux") {
1985 ;
1986 } else
1987 return false;
1988
1989 return true;
1990 }
Daniel Dunbar48075d82009-12-19 04:15:38 +00001991
Daniel Dunbar96be2a42009-12-21 23:28:17 +00001992 void getDefaultFeatures(const std::string &CPU,
1993 llvm::StringMap<bool> &Features) const {
Daniel Dunbar96be2a42009-12-21 23:28:17 +00001994 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
1995 Features["vfp2"] = true;
1996 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
1997 Features["neon"] = true;
1998 }
Michael J. Spencerd5513a32010-10-21 03:16:25 +00001999
Daniel Dunbar48075d82009-12-19 04:15:38 +00002000 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2001 const std::string &Name,
2002 bool Enabled) const {
Evan Chengf972b262011-07-08 06:40:11 +00002003 if (Name == "soft-float" || Name == "soft-float-abi" ||
Stephen Hines64f85312011-10-21 14:54:52 -07002004 Name == "vfp2" || Name == "vfp3" || Name == "neon" ||
2005 Name == "long64") {
Daniel Dunbar96be2a42009-12-21 23:28:17 +00002006 Features[Name] = Enabled;
2007 } else
Daniel Dunbar48075d82009-12-19 04:15:38 +00002008 return false;
2009
Daniel Dunbar48075d82009-12-19 04:15:38 +00002010 return true;
2011 }
2012
2013 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar96be2a42009-12-21 23:28:17 +00002014 FPU = NoFPU;
Daniel Dunbar48075d82009-12-19 04:15:38 +00002015 SoftFloat = SoftFloatABI = false;
2016 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2017 if (Features[i] == "+soft-float")
2018 SoftFloat = true;
2019 else if (Features[i] == "+soft-float-abi")
2020 SoftFloatABI = true;
Daniel Dunbar96be2a42009-12-21 23:28:17 +00002021 else if (Features[i] == "+vfp2")
2022 FPU = VFP2FPU;
2023 else if (Features[i] == "+vfp3")
2024 FPU = VFP3FPU;
2025 else if (Features[i] == "+neon")
2026 FPU = NeonFPU;
Stephen Hines64f85312011-10-21 14:54:52 -07002027 else if (Features[i] == "+long64")
2028 LongWidth = LongAlign = 64; // RenderScript uses a 64-bit long type
Daniel Dunbar48075d82009-12-19 04:15:38 +00002029 }
2030
2031 // Remove front-end specific options which the backend handles differently.
2032 std::vector<std::string>::iterator it;
2033 it = std::find(Features.begin(), Features.end(), "+soft-float");
2034 if (it != Features.end())
2035 Features.erase(it);
2036 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2037 if (it != Features.end())
2038 Features.erase(it);
2039 }
2040
Daniel Dunbar33b40752009-12-18 18:42:37 +00002041 static const char *getCPUDefineSuffix(llvm::StringRef Name) {
2042 return llvm::StringSwitch<const char*>(Name)
2043 .Cases("arm8", "arm810", "4")
2044 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2045 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2046 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2047 .Case("ep9312", "4T")
2048 .Cases("arm10tdmi", "arm1020t", "5T")
2049 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2050 .Case("arm926ej-s", "5TEJ")
2051 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2052 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar96be2a42009-12-21 23:28:17 +00002053 .Case("arm1136j-s", "6J")
Daniel Dunbar33b40752009-12-18 18:42:37 +00002054 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar96be2a42009-12-21 23:28:17 +00002055 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbar33b40752009-12-18 18:42:37 +00002056 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2057 .Cases("cortex-a8", "cortex-a9", "7A")
Bob Wilson06f45632011-01-06 16:57:20 +00002058 .Case("cortex-m3", "7M")
Bob Wilsona291d5f2011-03-21 21:55:25 +00002059 .Case("cortex-m0", "6M")
Daniel Dunbar33b40752009-12-18 18:42:37 +00002060 .Default(0);
2061 }
2062 virtual bool setCPU(const std::string &Name) {
2063 if (!getCPUDefineSuffix(Name))
2064 return false;
2065
2066 CPU = Name;
2067 return true;
2068 }
Chris Lattner79682402009-03-20 15:52:06 +00002069 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002070 MacroBuilder &Builder) const {
Chris Lattnerbef1d722009-03-02 22:27:17 +00002071 // Target identification.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002072 Builder.defineMacro("__arm");
2073 Builder.defineMacro("__arm__");
Anton Korobeynikove7772382009-05-03 13:42:53 +00002074
Chris Lattnerbef1d722009-03-02 22:27:17 +00002075 // Target properties.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002076 Builder.defineMacro("__ARMEL__");
2077 Builder.defineMacro("__LITTLE_ENDIAN__");
2078 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbar33b40752009-12-18 18:42:37 +00002079
2080 llvm::StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002081 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikove7772382009-05-03 13:42:53 +00002082
Mike Stumpf90a29f2009-04-08 02:07:04 +00002083 // Subtarget options.
Daniel Dunbarf0156562009-09-17 16:21:10 +00002084
Daniel Dunbar33b40752009-12-18 18:42:37 +00002085 // FIXME: It's more complicated than this and we don't really support
2086 // interworking.
2087 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002088 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbar33b40752009-12-18 18:42:37 +00002089
Daniel Dunbar33b40752009-12-18 18:42:37 +00002090 if (ABI == "aapcs" || ABI == "aapcs-linux")
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002091 Builder.defineMacro("__ARM_EABI__");
Daniel Dunbar33b40752009-12-18 18:42:37 +00002092
Daniel Dunbar48075d82009-12-19 04:15:38 +00002093 if (SoftFloat)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002094 Builder.defineMacro("__SOFTFP__");
Daniel Dunbar33b40752009-12-18 18:42:37 +00002095
2096 if (CPU == "xscale")
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002097 Builder.defineMacro("__XSCALE__");
Daniel Dunbarf0156562009-09-17 16:21:10 +00002098
Bob Wilson84f95cf2011-05-13 18:56:03 +00002099 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbarf0156562009-09-17 16:21:10 +00002100 if (IsThumb) {
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002101 Builder.defineMacro("__THUMBEL__");
2102 Builder.defineMacro("__thumb__");
Bob Wilson84f95cf2011-05-13 18:56:03 +00002103 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002104 Builder.defineMacro("__thumb2__");
Daniel Dunbarf0156562009-09-17 16:21:10 +00002105 }
2106
2107 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002108 Builder.defineMacro("__APCS_32__");
Daniel Dunbar96be2a42009-12-21 23:28:17 +00002109
2110 if (FPUModeIsVFP((FPUMode) FPU))
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002111 Builder.defineMacro("__VFP_FP__");
Daniel Dunbar96be2a42009-12-21 23:28:17 +00002112
2113 // This only gets set when Neon instructions are actually available, unlike
2114 // the VFP define, hence the soft float and arch check. This is subtly
2115 // different from gcc, we follow the intent which was that it should be set
2116 // when Neon instructions are actually available.
Bob Wilson84f95cf2011-05-13 18:56:03 +00002117 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002118 Builder.defineMacro("__ARM_NEON__");
Chris Lattner9fd73612008-04-21 18:56:49 +00002119 }
2120 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2121 unsigned &NumRecords) const {
Chris Lattnerb4527522010-03-03 19:03:45 +00002122 Records = BuiltinInfo;
2123 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner9fd73612008-04-21 18:56:49 +00002124 }
2125 virtual const char *getVAListDeclaration() const {
John McCall0e9972c2011-05-09 02:19:37 +00002126 return "typedef void* __builtin_va_list;";
Chris Lattner9fd73612008-04-21 18:56:49 +00002127 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00002128 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar40b774e2009-09-17 07:03:19 +00002129 unsigned &NumNames) const;
Anton Korobeynikove7772382009-05-03 13:42:53 +00002130 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar40b774e2009-09-17 07:03:19 +00002131 unsigned &NumAliases) const;
Anders Carlsson36834a72009-02-28 17:11:49 +00002132 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerc49cc1a2009-04-26 07:16:29 +00002133 TargetInfo::ConstraintInfo &Info) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00002134 // FIXME: Check if this is complete
Anders Carlsson36834a72009-02-28 17:11:49 +00002135 switch (*Name) {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00002136 default:
Nate Begeman222823a2008-04-22 05:03:19 +00002137 case 'l': // r0-r7
2138 case 'h': // r8-r15
2139 case 'w': // VFP Floating point register single precision
2140 case 'P': // VFP Floating point register double precision
Chris Lattnerc49cc1a2009-04-26 07:16:29 +00002141 Info.setAllowsRegister();
Nate Begeman222823a2008-04-22 05:03:19 +00002142 return true;
Stuart Hastings002333f2011-06-07 23:45:05 +00002143 case 'U': // a memory reference...
2144 switch (Name[1]) {
2145 case 'q': // ...ARMV4 ldrsb
2146 case 'v': // ...VFP load/store (reg+constant offset)
2147 case 'y': // ...iWMMXt load/store
Eric Christopherdda231a2011-06-17 01:40:49 +00002148 case 't': // address valid for load/store opaque types wider
2149 // than 128-bits
2150 case 'n': // valid address for Neon doubleword vector load/store
2151 case 'm': // valid address for Neon element and structure load/store
2152 case 's': // valid address for non-offset loads/stores of quad-word
2153 // values in four ARM registers
Stuart Hastings002333f2011-06-07 23:45:05 +00002154 Info.setAllowsMemory();
2155 Name++;
2156 return true;
2157 }
Nate Begeman222823a2008-04-22 05:03:19 +00002158 }
Chris Lattner9fd73612008-04-21 18:56:49 +00002159 return false;
2160 }
Evan Cheng8bfa2572011-06-16 19:13:15 +00002161 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings002333f2011-06-07 23:45:05 +00002162 std::string R;
2163 switch (*Constraint) {
2164 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings6ce33d62011-06-08 16:06:31 +00002165 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings002333f2011-06-07 23:45:05 +00002166 Constraint++;
2167 break;
Eric Christopher283f4472011-06-17 00:40:18 +00002168 case 'p': // 'p' should be translated to 'r' by default.
2169 R = std::string("r");
2170 break;
Stuart Hastings002333f2011-06-07 23:45:05 +00002171 default:
2172 return std::string(1, *Constraint);
2173 }
2174 return R;
2175 }
Chris Lattner9fd73612008-04-21 18:56:49 +00002176 virtual const char *getClobbers() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +00002177 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +00002178 return "";
2179 }
2180};
Daniel Dunbar40b774e2009-09-17 07:03:19 +00002181
2182const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar663e9f82010-08-11 02:17:20 +00002183 // Integer registers
Daniel Dunbar40b774e2009-09-17 07:03:19 +00002184 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar663e9f82010-08-11 02:17:20 +00002185 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2186
2187 // Float registers
2188 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2189 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2190 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00002191 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar663e9f82010-08-11 02:17:20 +00002192
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00002193 // Double registers
2194 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2195 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesen0d79b042010-10-28 01:05:37 +00002196 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2197 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00002198
2199 // Quad registers
Dale Johannesen0d79b042010-10-28 01:05:37 +00002200 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2201 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar40b774e2009-09-17 07:03:19 +00002202};
2203
2204void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar00ea8f02010-08-11 02:17:11 +00002205 unsigned &NumNames) const {
Daniel Dunbar40b774e2009-09-17 07:03:19 +00002206 Names = GCCRegNames;
2207 NumNames = llvm::array_lengthof(GCCRegNames);
2208}
2209
2210const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar40b774e2009-09-17 07:03:19 +00002211 { { "a1" }, "r0" },
2212 { { "a2" }, "r1" },
2213 { { "a3" }, "r2" },
2214 { { "a4" }, "r3" },
2215 { { "v1" }, "r4" },
2216 { { "v2" }, "r5" },
2217 { { "v3" }, "r6" },
2218 { { "v4" }, "r7" },
2219 { { "v5" }, "r8" },
2220 { { "v6", "rfp" }, "r9" },
2221 { { "sl" }, "r10" },
2222 { { "fp" }, "r11" },
2223 { { "ip" }, "r12" },
Daniel Dunbar00ea8f02010-08-11 02:17:11 +00002224 { { "r13" }, "sp" },
2225 { { "r14" }, "lr" },
2226 { { "r15" }, "pc" },
Dale Johannesen0bbb50d2010-10-27 23:34:42 +00002227 // The S, D and Q registers overlap, but aren't really aliases; we
2228 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar40b774e2009-09-17 07:03:19 +00002229};
2230
2231void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2232 unsigned &NumAliases) const {
2233 Aliases = GCCRegAliases;
2234 NumAliases = llvm::array_lengthof(GCCRegAliases);
2235}
Chris Lattnerb4527522010-03-03 19:03:45 +00002236
2237const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmane7e66f72011-07-05 21:53:01 +00002238#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahanian67aba812010-11-30 17:35:24 +00002239#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmane7e66f72011-07-05 21:53:01 +00002240 ALL_LANGUAGES },
Chris Lattnerb4527522010-03-03 19:03:45 +00002241#include "clang/Basic/BuiltinsARM.def"
2242};
Chris Lattner9fd73612008-04-21 18:56:49 +00002243} // end anonymous namespace.
2244
Eli Friedmanbe727fe2008-08-20 07:44:10 +00002245
2246namespace {
Mike Stump25cf7602009-09-09 15:08:12 +00002247class DarwinARMTargetInfo :
Edwin Török36565e52009-06-30 17:10:35 +00002248 public DarwinTargetInfo<ARMTargetInfo> {
2249protected:
Daniel Dunbar608b3882009-08-24 09:10:05 +00002250 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002251 MacroBuilder &Builder) const {
Douglas Gregor0a0d2b12011-03-23 00:50:03 +00002252 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedman8f575172009-04-19 21:38:35 +00002253 }
Eli Friedmanbe727fe2008-08-20 07:44:10 +00002254
Edwin Török36565e52009-06-30 17:10:35 +00002255public:
Mike Stump25cf7602009-09-09 15:08:12 +00002256 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar01045582010-05-27 07:00:26 +00002257 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2258 HasAlignMac68kSupport = true;
2259 }
Eli Friedmanbe727fe2008-08-20 07:44:10 +00002260};
2261} // end anonymous namespace.
2262
Chris Lattner4b009652007-07-25 00:24:17 +00002263namespace {
Eli Friedmanff158dd2008-08-20 07:28:14 +00002264class SparcV8TargetInfo : public TargetInfo {
Chris Lattnerff7c53d2009-01-27 01:58:38 +00002265 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2266 static const char * const GCCRegNames[];
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00002267 bool SoftFloat;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00002268public:
Eli Friedmanff158dd2008-08-20 07:28:14 +00002269 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2270 // FIXME: Support Sparc quad-precision long double?
Eli Friedman2b161652008-08-21 00:13:15 +00002271 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner2e17d912009-11-07 18:59:41 +00002272 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanff158dd2008-08-20 07:28:14 +00002273 }
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00002274 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2275 const std::string &Name,
2276 bool Enabled) const {
2277 if (Name == "soft-float")
2278 Features[Name] = Enabled;
2279 else
2280 return false;
2281
2282 return true;
2283 }
2284 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2285 SoftFloat = false;
2286 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2287 if (Features[i] == "+soft-float")
2288 SoftFloat = true;
2289 }
Chris Lattner79682402009-03-20 15:52:06 +00002290 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002291 MacroBuilder &Builder) const {
2292 DefineStd(Builder, "sparc", Opts);
2293 Builder.defineMacro("__sparcv8");
2294 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopes584a4562010-11-09 17:21:19 +00002295
2296 if (SoftFloat)
2297 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00002298 }
2299 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2300 unsigned &NumRecords) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00002301 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00002302 }
2303 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00002304 return "typedef void* __builtin_va_list;";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00002305 }
Anton Korobeynikove7772382009-05-03 13:42:53 +00002306 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattnerff7c53d2009-01-27 01:58:38 +00002307 unsigned &NumNames) const;
Anton Korobeynikove7772382009-05-03 13:42:53 +00002308 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnerff7c53d2009-01-27 01:58:38 +00002309 unsigned &NumAliases) const;
Anders Carlsson36834a72009-02-28 17:11:49 +00002310 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00002311 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00002312 // FIXME: Implement!
2313 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00002314 }
2315 virtual const char *getClobbers() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +00002316 // FIXME: Implement!
2317 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00002318 }
2319};
2320
Chris Lattnerff7c53d2009-01-27 01:58:38 +00002321const char * const SparcV8TargetInfo::GCCRegNames[] = {
2322 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2323 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2324 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2325 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2326};
2327
Anton Korobeynikove7772382009-05-03 13:42:53 +00002328void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattnerff7c53d2009-01-27 01:58:38 +00002329 unsigned &NumNames) const {
2330 Names = GCCRegNames;
2331 NumNames = llvm::array_lengthof(GCCRegNames);
2332}
2333
2334const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikove7772382009-05-03 13:42:53 +00002335 { { "g0" }, "r0" },
2336 { { "g1" }, "r1" },
2337 { { "g2" }, "r2" },
2338 { { "g3" }, "r3" },
2339 { { "g4" }, "r4" },
2340 { { "g5" }, "r5" },
2341 { { "g6" }, "r6" },
2342 { { "g7" }, "r7" },
2343 { { "o0" }, "r8" },
2344 { { "o1" }, "r9" },
2345 { { "o2" }, "r10" },
2346 { { "o3" }, "r11" },
2347 { { "o4" }, "r12" },
2348 { { "o5" }, "r13" },
2349 { { "o6", "sp" }, "r14" },
2350 { { "o7" }, "r15" },
2351 { { "l0" }, "r16" },
2352 { { "l1" }, "r17" },
2353 { { "l2" }, "r18" },
2354 { { "l3" }, "r19" },
2355 { { "l4" }, "r20" },
2356 { { "l5" }, "r21" },
2357 { { "l6" }, "r22" },
2358 { { "l7" }, "r23" },
2359 { { "i0" }, "r24" },
2360 { { "i1" }, "r25" },
2361 { { "i2" }, "r26" },
2362 { { "i3" }, "r27" },
2363 { { "i4" }, "r28" },
2364 { { "i5" }, "r29" },
2365 { { "i6", "fp" }, "r30" },
2366 { { "i7" }, "r31" },
Chris Lattnerff7c53d2009-01-27 01:58:38 +00002367};
2368
Anton Korobeynikove7772382009-05-03 13:42:53 +00002369void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattnerff7c53d2009-01-27 01:58:38 +00002370 unsigned &NumAliases) const {
2371 Aliases = GCCRegAliases;
2372 NumAliases = llvm::array_lengthof(GCCRegAliases);
2373}
Gabor Greif8a3ff0d2008-02-21 16:29:08 +00002374} // end anonymous namespace.
2375
Eli Friedmanff158dd2008-08-20 07:28:14 +00002376namespace {
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +00002377class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2378public:
2379 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2380 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2381 SizeType = UnsignedInt;
2382 PtrDiffType = SignedInt;
2383 }
2384};
Edwin Török36565e52009-06-30 17:10:35 +00002385class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanff158dd2008-08-20 07:28:14 +00002386public:
2387 SolarisSparcV8TargetInfo(const std::string& triple) :
Edwin Török36565e52009-06-30 17:10:35 +00002388 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedman7cca0982008-11-02 02:43:55 +00002389 SizeType = UnsignedInt;
2390 PtrDiffType = SignedInt;
Eli Friedmanff158dd2008-08-20 07:28:14 +00002391 }
2392};
2393} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +00002394
Chris Lattner85970f32008-05-08 05:58:21 +00002395namespace {
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00002396 class MSP430TargetInfo : public TargetInfo {
2397 static const char * const GCCRegNames[];
2398 public:
2399 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2400 TLSSupported = false;
Anton Korobeynikov2a6630a2010-01-30 12:55:11 +00002401 IntWidth = 16; IntAlign = 16;
2402 LongWidth = 32; LongLongWidth = 64;
2403 LongAlign = LongLongAlign = 16;
2404 PointerWidth = 16; PointerAlign = 16;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00002405 SizeType = UnsignedInt;
2406 IntMaxType = SignedLong;
2407 UIntMaxType = UnsignedLong;
2408 IntPtrType = SignedShort;
2409 PtrDiffType = SignedInt;
Edward O'Callaghan14a70a32009-11-21 00:49:54 +00002410 SigAtomicType = SignedLong;
Anton Korobeynikov314713f2009-12-19 01:32:37 +00002411 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00002412 }
2413 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002414 MacroBuilder &Builder) const {
2415 Builder.defineMacro("MSP430");
2416 Builder.defineMacro("__MSP430__");
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00002417 // FIXME: defines for different 'flavours' of MCU
2418 }
2419 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2420 unsigned &NumRecords) const {
2421 // FIXME: Implement.
2422 Records = 0;
2423 NumRecords = 0;
2424 }
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00002425 virtual void getGCCRegNames(const char * const *&Names,
2426 unsigned &NumNames) const;
2427 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2428 unsigned &NumAliases) const {
2429 // No aliases.
2430 Aliases = 0;
2431 NumAliases = 0;
2432 }
2433 virtual bool validateAsmConstraint(const char *&Name,
2434 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov174219b2009-10-15 23:17:13 +00002435 // No target constraints for now.
2436 return false;
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00002437 }
2438 virtual const char *getClobbers() const {
2439 // FIXME: Is this really right?
2440 return "";
2441 }
2442 virtual const char *getVAListDeclaration() const {
2443 // FIXME: implement
Anton Korobeynikovf5955592009-05-08 18:24:57 +00002444 return "typedef char* __builtin_va_list;";
Anton Korobeynikov954bd3f2009-05-03 13:43:08 +00002445 }
2446 };
2447
2448 const char * const MSP430TargetInfo::GCCRegNames[] = {
2449 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2450 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2451 };
2452
2453 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2454 unsigned &NumNames) const {
2455 Names = GCCRegNames;
2456 NumNames = llvm::array_lengthof(GCCRegNames);
2457 }
2458}
2459
2460
Anton Korobeynikov57f236f2009-07-16 20:09:57 +00002461namespace {
2462 class SystemZTargetInfo : public TargetInfo {
2463 static const char * const GCCRegNames[];
2464 public:
2465 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2466 TLSSupported = false;
2467 IntWidth = IntAlign = 32;
2468 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2469 PointerWidth = PointerAlign = 64;
Chris Lattner2e17d912009-11-07 18:59:41 +00002470 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2471 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
Anton Korobeynikov57f236f2009-07-16 20:09:57 +00002472 }
2473 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002474 MacroBuilder &Builder) const {
2475 Builder.defineMacro("__s390__");
2476 Builder.defineMacro("__s390x__");
Anton Korobeynikov57f236f2009-07-16 20:09:57 +00002477 }
2478 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2479 unsigned &NumRecords) const {
2480 // FIXME: Implement.
2481 Records = 0;
2482 NumRecords = 0;
2483 }
Anton Korobeynikov57f236f2009-07-16 20:09:57 +00002484
Anton Korobeynikov57f236f2009-07-16 20:09:57 +00002485 virtual void getGCCRegNames(const char * const *&Names,
2486 unsigned &NumNames) const;
2487 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2488 unsigned &NumAliases) const {
2489 // No aliases.
2490 Aliases = 0;
2491 NumAliases = 0;
2492 }
2493 virtual bool validateAsmConstraint(const char *&Name,
2494 TargetInfo::ConstraintInfo &info) const {
2495 // FIXME: implement
2496 return true;
2497 }
2498 virtual const char *getClobbers() const {
2499 // FIXME: Is this really right?
2500 return "";
2501 }
2502 virtual const char *getVAListDeclaration() const {
2503 // FIXME: implement
2504 return "typedef char* __builtin_va_list;";
2505 }
2506 };
2507
2508 const char * const SystemZTargetInfo::GCCRegNames[] = {
2509 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2510 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2511 };
2512
2513 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2514 unsigned &NumNames) const {
2515 Names = GCCRegNames;
2516 NumNames = llvm::array_lengthof(GCCRegNames);
2517 }
2518}
2519
Jakob Stoklund Olesen61774372009-08-17 20:08:44 +00002520namespace {
2521 class BlackfinTargetInfo : public TargetInfo {
2522 static const char * const GCCRegNames[];
2523 public:
2524 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2525 TLSSupported = false;
2526 DoubleAlign = 32;
2527 LongLongAlign = 32;
2528 LongDoubleAlign = 32;
Chris Lattner2e17d912009-11-07 18:59:41 +00002529 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
Jakob Stoklund Olesen61774372009-08-17 20:08:44 +00002530 }
2531
2532 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002533 MacroBuilder &Builder) const {
2534 DefineStd(Builder, "bfin", Opts);
2535 DefineStd(Builder, "BFIN", Opts);
2536 Builder.defineMacro("__ADSPBLACKFIN__");
Jakob Stoklund Olesen61774372009-08-17 20:08:44 +00002537 // FIXME: This one is really dependent on -mcpu
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002538 Builder.defineMacro("__ADSPLPBLACKFIN__");
Jakob Stoklund Olesen61774372009-08-17 20:08:44 +00002539 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
2540 }
2541
2542 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2543 unsigned &NumRecords) const {
2544 // FIXME: Implement.
2545 Records = 0;
2546 NumRecords = 0;
2547 }
2548
Jakob Stoklund Olesen61774372009-08-17 20:08:44 +00002549 virtual void getGCCRegNames(const char * const *&Names,
2550 unsigned &NumNames) const;
2551
2552 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2553 unsigned &NumAliases) const {
2554 // No aliases.
2555 Aliases = 0;
2556 NumAliases = 0;
2557 }
2558
2559 virtual bool validateAsmConstraint(const char *&Name,
2560 TargetInfo::ConstraintInfo &Info) const {
2561 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
2562 Info.setAllowsRegister();
2563 return true;
2564 }
2565 return false;
2566 }
2567
2568 virtual const char *getClobbers() const {
2569 return "";
2570 }
2571
2572 virtual const char *getVAListDeclaration() const {
2573 return "typedef char* __builtin_va_list;";
2574 }
2575 };
2576
2577 const char * const BlackfinTargetInfo::GCCRegNames[] = {
2578 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2579 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
2580 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
2581 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
2582 "a0", "a1", "cc",
2583 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
2584 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
2585 };
2586
2587 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
2588 unsigned &NumNames) const {
2589 Names = GCCRegNames;
2590 NumNames = llvm::array_lengthof(GCCRegNames);
2591 }
2592}
2593
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00002594namespace {
2595
Mike Stump25cf7602009-09-09 15:08:12 +00002596 // LLVM and Clang cannot be used directly to output native binaries for
2597 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00002598 // type and alignment information.
Mike Stump25cf7602009-09-09 15:08:12 +00002599 //
2600 // TCE uses the llvm bitcode as input and uses it for generating customized
2601 // target processor and program binary. TCE co-design environment is
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00002602 // publicly available in http://tce.cs.tut.fi
2603
2604 class TCETargetInfo : public TargetInfo{
2605 public:
2606 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
2607 TLSSupported = false;
2608 IntWidth = 32;
2609 LongWidth = LongLongWidth = 32;
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00002610 PointerWidth = 32;
2611 IntAlign = 32;
2612 LongAlign = LongLongAlign = 32;
2613 PointerAlign = 32;
2614 SizeType = UnsignedInt;
2615 IntMaxType = SignedLong;
2616 UIntMaxType = UnsignedLong;
2617 IntPtrType = SignedInt;
2618 PtrDiffType = SignedInt;
2619 FloatWidth = 32;
2620 FloatAlign = 32;
2621 DoubleWidth = 32;
2622 DoubleAlign = 32;
2623 LongDoubleWidth = 32;
2624 LongDoubleAlign = 32;
2625 FloatFormat = &llvm::APFloat::IEEEsingle;
2626 DoubleFormat = &llvm::APFloat::IEEEsingle;
2627 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner8a1db932010-03-04 21:07:38 +00002628 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
2629 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumic9109292011-02-18 08:44:38 +00002630 "f32:32:32-f64:32:32-v64:32:32-"
2631 "v128:32:32-a0:0:32-n32";
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00002632 }
2633
2634 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002635 MacroBuilder &Builder) const {
2636 DefineStd(Builder, "tce", Opts);
2637 Builder.defineMacro("__TCE__");
2638 Builder.defineMacro("__TCE_V1__");
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00002639 }
2640 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2641 unsigned &NumRecords) const {}
Daniel Dunbar2e967de2009-08-24 09:54:37 +00002642 virtual const char *getClobbers() const {
2643 return "";
2644 }
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00002645 virtual const char *getVAListDeclaration() const {
2646 return "typedef void* __builtin_va_list;";
2647 }
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00002648 virtual void getGCCRegNames(const char * const *&Names,
2649 unsigned &NumNames) const {}
2650 virtual bool validateAsmConstraint(const char *&Name,
2651 TargetInfo::ConstraintInfo &info) const {
2652 return true;
2653 }
2654 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2655 unsigned &NumAliases) const {}
2656 };
2657}
2658
Edward O'Callaghan097309f2009-11-15 10:22:07 +00002659namespace {
2660class MipsTargetInfo : public TargetInfo {
Eric Christopher03cc0ef2010-03-02 02:41:08 +00002661 std::string ABI, CPU;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00002662 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2663 static const char * const GCCRegNames[];
2664public:
Eric Christopher03cc0ef2010-03-02 02:41:08 +00002665 MipsTargetInfo(const std::string& triple) : TargetInfo(triple), ABI("o32") {
Edward O'Callaghan097309f2009-11-15 10:22:07 +00002666 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanaka619e8872011-06-02 00:09:17 +00002667 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
2668 SizeType = UnsignedInt;
2669 PtrDiffType = SignedInt;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00002670 }
Eric Christopher03cc0ef2010-03-02 02:41:08 +00002671 virtual const char *getABI() const { return ABI.c_str(); }
2672 virtual bool setABI(const std::string &Name) {
2673
2674 if ((Name == "o32") || (Name == "eabi")) {
2675 ABI = Name;
2676 return true;
2677 } else
2678 return false;
2679 }
2680 virtual bool setCPU(const std::string &Name) {
2681 CPU = Name;
2682 return true;
2683 }
2684 void getDefaultFeatures(const std::string &CPU,
2685 llvm::StringMap<bool> &Features) const {
2686 Features[ABI] = true;
2687 Features[CPU] = true;
2688 }
2689 virtual void getArchDefines(const LangOptions &Opts,
2690 MacroBuilder &Builder) const {
2691 if (ABI == "o32")
2692 Builder.defineMacro("__mips_o32");
2693 else if (ABI == "eabi")
2694 Builder.defineMacro("__mips_eabi");
2695 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00002696 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002697 MacroBuilder &Builder) const {
2698 DefineStd(Builder, "mips", Opts);
2699 Builder.defineMacro("_mips");
2700 DefineStd(Builder, "MIPSEB", Opts);
2701 Builder.defineMacro("_MIPSEB");
2702 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher03cc0ef2010-03-02 02:41:08 +00002703 getArchDefines(Opts, Builder);
Edward O'Callaghan097309f2009-11-15 10:22:07 +00002704 }
2705 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2706 unsigned &NumRecords) const {
2707 // FIXME: Implement!
2708 }
2709 virtual const char *getVAListDeclaration() const {
2710 return "typedef void* __builtin_va_list;";
2711 }
2712 virtual void getGCCRegNames(const char * const *&Names,
2713 unsigned &NumNames) const;
2714 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2715 unsigned &NumAliases) const;
2716 virtual bool validateAsmConstraint(const char *&Name,
2717 TargetInfo::ConstraintInfo &Info) const {
2718 switch (*Name) {
2719 default:
2720 case 'r': // CPU registers.
2721 case 'd': // Equivalent to "r" unless generating MIPS16 code.
2722 case 'y': // Equivalent to "r", backwards compatibility only.
2723 case 'f': // floating-point registers.
2724 Info.setAllowsRegister();
2725 return true;
2726 }
2727 return false;
2728 }
2729
2730 virtual const char *getClobbers() const {
2731 // FIXME: Implement!
2732 return "";
2733 }
2734};
2735
2736const char * const MipsTargetInfo::GCCRegNames[] = {
Michael J. Spencerd5513a32010-10-21 03:16:25 +00002737 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
Edward O'Callaghan097309f2009-11-15 10:22:07 +00002738 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
2739 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
2740 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
2741 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
2742 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
2743 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
2744 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
2745 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
2746 "$fcc5","$fcc6","$fcc7"
2747};
2748
2749void MipsTargetInfo::getGCCRegNames(const char * const *&Names,
2750 unsigned &NumNames) const {
2751 Names = GCCRegNames;
2752 NumNames = llvm::array_lengthof(GCCRegNames);
2753}
2754
2755const TargetInfo::GCCRegAlias MipsTargetInfo::GCCRegAliases[] = {
2756 { { "at" }, "$1" },
2757 { { "v0" }, "$2" },
2758 { { "v1" }, "$3" },
2759 { { "a0" }, "$4" },
2760 { { "a1" }, "$5" },
2761 { { "a2" }, "$6" },
2762 { { "a3" }, "$7" },
2763 { { "t0" }, "$8" },
2764 { { "t1" }, "$9" },
2765 { { "t2" }, "$10" },
2766 { { "t3" }, "$11" },
2767 { { "t4" }, "$12" },
2768 { { "t5" }, "$13" },
2769 { { "t6" }, "$14" },
2770 { { "t7" }, "$15" },
2771 { { "s0" }, "$16" },
2772 { { "s1" }, "$17" },
2773 { { "s2" }, "$18" },
2774 { { "s3" }, "$19" },
2775 { { "s4" }, "$20" },
2776 { { "s5" }, "$21" },
2777 { { "s6" }, "$22" },
2778 { { "s7" }, "$23" },
2779 { { "t8" }, "$24" },
2780 { { "t9" }, "$25" },
2781 { { "k0" }, "$26" },
2782 { { "k1" }, "$27" },
2783 { { "gp" }, "$28" },
2784 { { "sp" }, "$29" },
2785 { { "fp" }, "$30" },
2786 { { "ra" }, "$31" }
2787};
2788
2789void MipsTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2790 unsigned &NumAliases) const {
2791 Aliases = GCCRegAliases;
2792 NumAliases = llvm::array_lengthof(GCCRegAliases);
2793}
2794} // end anonymous namespace.
2795
2796namespace {
2797class MipselTargetInfo : public MipsTargetInfo {
2798public:
2799 MipselTargetInfo(const std::string& triple) : MipsTargetInfo(triple) {
2800 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanaka619e8872011-06-02 00:09:17 +00002801 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Edward O'Callaghan097309f2009-11-15 10:22:07 +00002802 }
2803
2804 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002805 MacroBuilder &Builder) const;
Edward O'Callaghan097309f2009-11-15 10:22:07 +00002806};
2807
2808void MipselTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer9ffb10432010-01-09 17:55:51 +00002809 MacroBuilder &Builder) const {
2810 DefineStd(Builder, "mips", Opts);
2811 Builder.defineMacro("_mips");
2812 DefineStd(Builder, "MIPSEL", Opts);
2813 Builder.defineMacro("_MIPSEL");
2814 Builder.defineMacro("__REGISTER_PREFIX__", "");
Eric Christopher03cc0ef2010-03-02 02:41:08 +00002815 getArchDefines(Opts, Builder);
Edward O'Callaghan097309f2009-11-15 10:22:07 +00002816}
2817} // end anonymous namespace.
2818
Chris Lattner4b009652007-07-25 00:24:17 +00002819//===----------------------------------------------------------------------===//
2820// Driver code
2821//===----------------------------------------------------------------------===//
2822
Daniel Dunbarca3e9912009-11-15 06:48:46 +00002823static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002824 llvm::Triple Triple(T);
2825 llvm::Triple::OSType os = Triple.getOS();
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00002826
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002827 switch (Triple.getArch()) {
2828 default:
2829 return NULL;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00002830
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002831 case llvm::Triple::arm:
Daniel Dunbar3f361b52009-09-11 01:14:50 +00002832 case llvm::Triple::thumb:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002833 if (Triple.isOSDarwin())
2834 return new DarwinARMTargetInfo(T);
2835
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002836 switch (os) {
Rafael Espindolad16a2202010-06-10 00:46:51 +00002837 case llvm::Triple::Linux:
2838 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002839 case llvm::Triple::FreeBSD:
Edwin Török36565e52009-06-30 17:10:35 +00002840 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002841 case llvm::Triple::NetBSD:
2842 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Douglas Gregordca52262011-07-01 22:41:14 +00002843 case llvm::Triple::RTEMS:
2844 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002845 default:
2846 return new ARMTargetInfo(T);
2847 }
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00002848
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002849 case llvm::Triple::bfin:
Douglas Gregordca52262011-07-01 22:41:14 +00002850 if ( os == llvm::Triple::RTEMS )
2851 return new RTEMSTargetInfo<BlackfinTargetInfo>(T);
Jakob Stoklund Olesen61774372009-08-17 20:08:44 +00002852 return new BlackfinTargetInfo(T);
2853
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002854 case llvm::Triple::msp430:
2855 return new MSP430TargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +00002856
Edward O'Callaghan097309f2009-11-15 10:22:07 +00002857 case llvm::Triple::mips:
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00002858 switch (os) {
2859 case llvm::Triple::Psp:
Edward O'Callaghan097309f2009-11-15 10:22:07 +00002860 return new PSPTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00002861 case llvm::Triple::Linux:
Edward O'Callaghan097309f2009-11-15 10:22:07 +00002862 return new LinuxTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00002863 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00002864 return new RTEMSTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00002865 case llvm::Triple::FreeBSD:
Joerg Sonnenberger8e627062011-07-07 17:01:45 +00002866 return new FreeBSDTargetInfo<MipsTargetInfo>(T);
Joerg Sonnenbergerfa9772b2011-07-05 18:05:54 +00002867 case llvm::Triple::NetBSD:
2868 return new NetBSDTargetInfo<MipsTargetInfo>(T);
2869 default:
2870 return new MipsTargetInfo(T);
2871 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00002872
2873 case llvm::Triple::mipsel:
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00002874 switch (os) {
2875 case llvm::Triple::Psp:
Edward O'Callaghan097309f2009-11-15 10:22:07 +00002876 return new PSPTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00002877 case llvm::Triple::Linux:
Edward O'Callaghan097309f2009-11-15 10:22:07 +00002878 return new LinuxTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00002879 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00002880 return new RTEMSTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00002881 case llvm::Triple::FreeBSD:
Joerg Sonnenbergercaf01c52011-07-06 11:00:56 +00002882 return new FreeBSDTargetInfo<MipselTargetInfo>(T);
Joerg Sonnenberger94c9ce52011-07-05 18:24:04 +00002883 case llvm::Triple::NetBSD:
2884 return new NetBSDTargetInfo<MipselTargetInfo>(T);
2885 default:
2886 return new MipsTargetInfo(T);
2887 }
Edward O'Callaghan097309f2009-11-15 10:22:07 +00002888
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002889 case llvm::Triple::ppc:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002890 if (Triple.isOSDarwin())
Roman Divackyc81f2a22011-01-06 08:27:10 +00002891 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002892 switch (os) {
2893 case llvm::Triple::FreeBSD:
Chris Lattnerf8030412010-02-16 18:14:57 +00002894 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002895 case llvm::Triple::NetBSD:
2896 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
2897 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00002898 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002899 default:
2900 return new PPC32TargetInfo(T);
2901 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002902
2903 case llvm::Triple::ppc64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002904 if (Triple.isOSDarwin())
Daniel Dunbar6501cab2010-05-30 00:07:30 +00002905 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002906 switch (os) {
2907 case llvm::Triple::Lv2:
John Thompsoned7bdbc2009-11-19 17:18:50 +00002908 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002909 case llvm::Triple::FreeBSD:
Chris Lattnerf8030412010-02-16 18:14:57 +00002910 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002911 case llvm::Triple::NetBSD:
2912 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
2913 default:
2914 return new PPC64TargetInfo(T);
2915 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002916
Justin Holewinski285dc652011-04-20 19:34:15 +00002917 case llvm::Triple::ptx32:
2918 return new PTX32TargetInfo(T);
2919 case llvm::Triple::ptx64:
2920 return new PTX64TargetInfo(T);
2921
Chris Lattner2c026472010-03-06 21:21:27 +00002922 case llvm::Triple::mblaze:
2923 return new MBlazeTargetInfo(T);
2924
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002925 case llvm::Triple::sparc:
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002926 switch (os) {
2927 case llvm::Triple::AuroraUX:
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +00002928 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002929 case llvm::Triple::Solaris:
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002930 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002931 case llvm::Triple::NetBSD:
2932 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
2933 case llvm::Triple::RTEMS:
Douglas Gregordca52262011-07-01 22:41:14 +00002934 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger9a11b742011-07-04 21:59:44 +00002935 default:
2936 return new SparcV8TargetInfo(T);
2937 }
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002938
John Thompsoned7bdbc2009-11-19 17:18:50 +00002939 // FIXME: Need a real SPU target.
2940 case llvm::Triple::cellspu:
2941 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
2942
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002943 case llvm::Triple::systemz:
2944 return new SystemZTargetInfo(T);
2945
Eli Friedmanf0ff32f2009-08-19 20:47:07 +00002946 case llvm::Triple::tce:
2947 return new TCETargetInfo(T);
2948
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002949 case llvm::Triple::x86:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002950 if (Triple.isOSDarwin())
2951 return new DarwinI386TargetInfo(T);
2952
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002953 switch (os) {
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +00002954 case llvm::Triple::AuroraUX:
2955 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002956 case llvm::Triple::Linux:
2957 return new LinuxTargetInfo<X86_32TargetInfo>(T);
2958 case llvm::Triple::DragonFly:
2959 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
2960 case llvm::Triple::NetBSD:
2961 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
2962 case llvm::Triple::OpenBSD:
2963 return new OpenBSDI386TargetInfo(T);
2964 case llvm::Triple::FreeBSD:
2965 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner6f4bed52010-07-07 16:01:42 +00002966 case llvm::Triple::Minix:
2967 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002968 case llvm::Triple::Solaris:
2969 return new SolarisTargetInfo<X86_32TargetInfo>(T);
2970 case llvm::Triple::Cygwin:
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00002971 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002972 case llvm::Triple::MinGW32:
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00002973 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002974 case llvm::Triple::Win32:
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00002975 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattnerf853e732010-04-11 19:29:39 +00002976 case llvm::Triple::Haiku:
2977 return new HaikuX86_32TargetInfo(T);
Douglas Gregordca52262011-07-01 22:41:14 +00002978 case llvm::Triple::RTEMS:
2979 return new RTEMSX86_32TargetInfo(T);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002980 default:
2981 return new X86_32TargetInfo(T);
2982 }
2983
2984 case llvm::Triple::x86_64:
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00002985 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
2986 return new DarwinX86_64TargetInfo(T);
2987
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002988 switch (os) {
Edward O'Callaghan0a7ef9a2009-10-18 13:33:59 +00002989 case llvm::Triple::AuroraUX:
2990 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002991 case llvm::Triple::Linux:
2992 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner1eac0812010-01-09 05:41:14 +00002993 case llvm::Triple::DragonFly:
2994 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00002995 case llvm::Triple::NetBSD:
2996 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
2997 case llvm::Triple::OpenBSD:
2998 return new OpenBSDX86_64TargetInfo(T);
2999 case llvm::Triple::FreeBSD:
3000 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
3001 case llvm::Triple::Solaris:
3002 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00003003 case llvm::Triple::MinGW32:
Daniel Dunbar8d8e9d62009-09-23 07:31:35 +00003004 return new MinGWX86_64TargetInfo(T);
3005 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00003006 return new VisualStudioWindowsX86_64TargetInfo(T);
Daniel Dunbar8ba3de02009-08-18 05:47:58 +00003007 default:
3008 return new X86_64TargetInfo(T);
3009 }
3010 }
Chris Lattner4b009652007-07-25 00:24:17 +00003011}
Daniel Dunbarca3e9912009-11-15 06:48:46 +00003012
3013/// CreateTargetInfo - Return the target info object for the specified target
3014/// triple.
3015TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags,
Daniel Dunbar4f7cd962009-12-19 03:30:57 +00003016 TargetOptions &Opts) {
Daniel Dunbarca3e9912009-11-15 06:48:46 +00003017 llvm::Triple Triple(Opts.Triple);
3018
3019 // Construct the target
3020 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
3021 if (!Target) {
3022 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
3023 return 0;
3024 }
3025
Daniel Dunbar33b40752009-12-18 18:42:37 +00003026 // Set the target CPU if specified.
3027 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
3028 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
3029 return 0;
3030 }
3031
Daniel Dunbarca3e9912009-11-15 06:48:46 +00003032 // Set the target ABI if specified.
3033 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
3034 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
3035 return 0;
3036 }
3037
Charles Davisfed3a2b2010-06-11 01:06:47 +00003038 // Set the target C++ ABI.
John McCall68086b92010-08-21 22:46:04 +00003039 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
Charles Davisfed3a2b2010-06-11 01:06:47 +00003040 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
3041 return 0;
3042 }
3043
Daniel Dunbarca3e9912009-11-15 06:48:46 +00003044 // Compute the default target features, we need the target to handle this
3045 // because features may have dependencies on one another.
3046 llvm::StringMap<bool> Features;
3047 Target->getDefaultFeatures(Opts.CPU, Features);
3048
3049 // Apply the user specified deltas.
3050 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
3051 ie = Opts.Features.end(); it != ie; ++it) {
3052 const char *Name = it->c_str();
3053
3054 // Apply the feature via the target.
3055 if ((Name[0] != '-' && Name[0] != '+') ||
3056 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
3057 Diags.Report(diag::err_target_invalid_feature) << Name;
3058 return 0;
3059 }
3060 }
3061
3062 // Add the features to the compile options.
3063 //
3064 // FIXME: If we are completely confident that we have the right set, we only
3065 // need to pass the minuses.
Daniel Dunbar4f7cd962009-12-19 03:30:57 +00003066 Opts.Features.clear();
Daniel Dunbarca3e9912009-11-15 06:48:46 +00003067 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
3068 ie = Features.end(); it != ie; ++it)
Chris Lattner1e5f83b2011-07-14 18:24:21 +00003069 Opts.Features.push_back(std::string(it->second ? "+" : "-") +
Chris Lattner48b78bd2011-07-14 18:45:41 +00003070 it->first().str());
Daniel Dunbar4f7cd962009-12-19 03:30:57 +00003071 Target->HandleTargetFeatures(Opts.Features);
Daniel Dunbarca3e9912009-11-15 06:48:46 +00003072
3073 return Target.take();
3074}