1 //===--- Targets.cpp - Implement -arch option and targets -----------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements construction of a TargetInfo object from a
11 // target triple.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "clang/Basic/TargetInfo.h"
16 #include "clang/Basic/Builtins.h"
17 #include "clang/Basic/Diagnostic.h"
18 #include "clang/Basic/LangOptions.h"
19 #include "clang/Basic/MacroBuilder.h"
20 #include "clang/Basic/TargetBuiltins.h"
21 #include "clang/Basic/TargetOptions.h"
22 #include "llvm/ADT/APFloat.h"
23 #include "llvm/ADT/OwningPtr.h"
24 #include "llvm/ADT/STLExtras.h"
25 #include "llvm/ADT/StringRef.h"
26 #include "llvm/ADT/StringSwitch.h"
27 #include "llvm/ADT/Triple.h"
28 #include "llvm/MC/MCSectionMachO.h"
29 #include "llvm/Support/ErrorHandling.h"
30 #include "llvm/Type.h"
31 #include <algorithm>
32 using namespace clang;
33
34 //===----------------------------------------------------------------------===//
35 // Common code shared among targets.
36 //===----------------------------------------------------------------------===//
37
38 /// DefineStd - Define a macro name and standard variants. For example if
39 /// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40 /// when in GNU mode.
DefineStd(MacroBuilder & Builder,StringRef MacroName,const LangOptions & Opts)41 static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
42 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
44
45 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
47 if (Opts.GNUMode)
48 Builder.defineMacro(MacroName);
49
50 // Define __unix.
51 Builder.defineMacro("__" + MacroName);
52
53 // Define __unix__.
54 Builder.defineMacro("__" + MacroName + "__");
55 }
56
defineCPUMacros(MacroBuilder & Builder,StringRef CPUName,bool Tuning=true)57 static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58 bool Tuning = true) {
59 Builder.defineMacro("__" + CPUName);
60 Builder.defineMacro("__" + CPUName + "__");
61 if (Tuning)
62 Builder.defineMacro("__tune_" + CPUName + "__");
63 }
64
65 //===----------------------------------------------------------------------===//
66 // Defines specific to certain operating systems.
67 //===----------------------------------------------------------------------===//
68
69 namespace {
70 template<typename TgtInfo>
71 class OSTargetInfo : public TgtInfo {
72 protected:
73 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
74 MacroBuilder &Builder) const=0;
75 public:
OSTargetInfo(const std::string & triple)76 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const77 virtual void getTargetDefines(const LangOptions &Opts,
78 MacroBuilder &Builder) const {
79 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
81 }
82
83 };
84 } // end anonymous namespace
85
86
getDarwinDefines(MacroBuilder & Builder,const LangOptions & Opts,const llvm::Triple & Triple,StringRef & PlatformName,VersionTuple & PlatformMinVersion)87 static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
88 const llvm::Triple &Triple,
89 StringRef &PlatformName,
90 VersionTuple &PlatformMinVersion) {
91 Builder.defineMacro("__APPLE_CC__", "5621");
92 Builder.defineMacro("__APPLE__");
93 Builder.defineMacro("__MACH__");
94 Builder.defineMacro("OBJC_NEW_PROPERTIES");
95
96 if (!Opts.ObjCAutoRefCount) {
97 // __weak is always defined, for use in blocks and with objc pointers.
98 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
99
100 // Darwin defines __strong even in C mode (just to nothing).
101 if (Opts.getGC() != LangOptions::NonGC)
102 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
103 else
104 Builder.defineMacro("__strong", "");
105
106 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
107 // allow this in C, since one might have block pointers in structs that
108 // are used in pure C code and in Objective-C ARC.
109 Builder.defineMacro("__unsafe_unretained", "");
110 }
111
112 if (Opts.Static)
113 Builder.defineMacro("__STATIC__");
114 else
115 Builder.defineMacro("__DYNAMIC__");
116
117 if (Opts.POSIXThreads)
118 Builder.defineMacro("_REENTRANT");
119
120 // Get the platform type and version number from the triple.
121 unsigned Maj, Min, Rev;
122 if (Triple.isMacOSX()) {
123 Triple.getMacOSXVersion(Maj, Min, Rev);
124 PlatformName = "macosx";
125 } else {
126 Triple.getOSVersion(Maj, Min, Rev);
127 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
128 }
129
130 // If -target arch-pc-win32-macho option specified, we're
131 // generating code for Win32 ABI. No need to emit
132 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
133 if (PlatformName == "win32") {
134 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
135 return;
136 }
137
138 // Set the appropriate OS version define.
139 if (Triple.getOS() == llvm::Triple::IOS) {
140 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
141 char Str[6];
142 Str[0] = '0' + Maj;
143 Str[1] = '0' + (Min / 10);
144 Str[2] = '0' + (Min % 10);
145 Str[3] = '0' + (Rev / 10);
146 Str[4] = '0' + (Rev % 10);
147 Str[5] = '\0';
148 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
149 } else {
150 // Note that the Driver allows versions which aren't representable in the
151 // define (because we only get a single digit for the minor and micro
152 // revision numbers). So, we limit them to the maximum representable
153 // version.
154 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
155 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
156 char Str[5];
157 Str[0] = '0' + (Maj / 10);
158 Str[1] = '0' + (Maj % 10);
159 Str[2] = '0' + std::min(Min, 9U);
160 Str[3] = '0' + std::min(Rev, 9U);
161 Str[4] = '\0';
162 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
163 }
164
165 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
166 }
167
168 namespace {
169 template<typename Target>
170 class DarwinTargetInfo : public OSTargetInfo<Target> {
171 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const172 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
173 MacroBuilder &Builder) const {
174 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
175 this->PlatformMinVersion);
176 }
177
178 public:
DarwinTargetInfo(const std::string & triple)179 DarwinTargetInfo(const std::string& triple) :
180 OSTargetInfo<Target>(triple) {
181 llvm::Triple T = llvm::Triple(triple);
182 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
183 this->MCountName = "\01mcount";
184 }
185
isValidSectionSpecifier(StringRef SR) const186 virtual std::string isValidSectionSpecifier(StringRef SR) const {
187 // Let MCSectionMachO validate this.
188 StringRef Segment, Section;
189 unsigned TAA, StubSize;
190 bool HasTAA;
191 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
192 TAA, HasTAA, StubSize);
193 }
194
getStaticInitSectionSpecifier() const195 virtual const char *getStaticInitSectionSpecifier() const {
196 // FIXME: We should return 0 when building kexts.
197 return "__TEXT,__StaticInit,regular,pure_instructions";
198 }
199
200 /// Darwin does not support protected visibility. Darwin's "default"
201 /// is very similar to ELF's "protected"; Darwin requires a "weak"
202 /// attribute on declarations that can be dynamically replaced.
hasProtectedVisibility() const203 virtual bool hasProtectedVisibility() const {
204 return false;
205 }
206 };
207
208
209 // DragonFlyBSD Target
210 template<typename Target>
211 class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
212 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const213 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
214 MacroBuilder &Builder) const {
215 // DragonFly defines; list based off of gcc output
216 Builder.defineMacro("__DragonFly__");
217 Builder.defineMacro("__DragonFly_cc_version", "100001");
218 Builder.defineMacro("__ELF__");
219 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
220 Builder.defineMacro("__tune_i386__");
221 DefineStd(Builder, "unix", Opts);
222 }
223 public:
DragonFlyBSDTargetInfo(const std::string & triple)224 DragonFlyBSDTargetInfo(const std::string &triple)
225 : OSTargetInfo<Target>(triple) {
226 this->UserLabelPrefix = "";
227
228 llvm::Triple Triple(triple);
229 switch (Triple.getArch()) {
230 default:
231 case llvm::Triple::x86:
232 case llvm::Triple::x86_64:
233 this->MCountName = ".mcount";
234 break;
235 }
236 }
237 };
238
239 // FreeBSD Target
240 template<typename Target>
241 class FreeBSDTargetInfo : public OSTargetInfo<Target> {
242 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const243 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
244 MacroBuilder &Builder) const {
245 // FreeBSD defines; list based off of gcc output
246
247 unsigned Release = Triple.getOSMajorVersion();
248 if (Release == 0U)
249 Release = 8;
250
251 Builder.defineMacro("__FreeBSD__", Twine(Release));
252 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
253 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
254 DefineStd(Builder, "unix", Opts);
255 Builder.defineMacro("__ELF__");
256 }
257 public:
FreeBSDTargetInfo(const std::string & triple)258 FreeBSDTargetInfo(const std::string &triple)
259 : OSTargetInfo<Target>(triple) {
260 this->UserLabelPrefix = "";
261
262 llvm::Triple Triple(triple);
263 switch (Triple.getArch()) {
264 default:
265 case llvm::Triple::x86:
266 case llvm::Triple::x86_64:
267 this->MCountName = ".mcount";
268 break;
269 case llvm::Triple::mips:
270 case llvm::Triple::mipsel:
271 case llvm::Triple::ppc:
272 case llvm::Triple::ppc64:
273 this->MCountName = "_mcount";
274 break;
275 case llvm::Triple::arm:
276 this->MCountName = "__mcount";
277 break;
278 }
279
280 }
281 };
282
283 // Minix Target
284 template<typename Target>
285 class MinixTargetInfo : public OSTargetInfo<Target> {
286 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const287 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
288 MacroBuilder &Builder) const {
289 // Minix defines
290
291 Builder.defineMacro("__minix", "3");
292 Builder.defineMacro("_EM_WSIZE", "4");
293 Builder.defineMacro("_EM_PSIZE", "4");
294 Builder.defineMacro("_EM_SSIZE", "2");
295 Builder.defineMacro("_EM_LSIZE", "4");
296 Builder.defineMacro("_EM_FSIZE", "4");
297 Builder.defineMacro("_EM_DSIZE", "8");
298 Builder.defineMacro("__ELF__");
299 DefineStd(Builder, "unix", Opts);
300 }
301 public:
MinixTargetInfo(const std::string & triple)302 MinixTargetInfo(const std::string &triple)
303 : OSTargetInfo<Target>(triple) {
304 this->UserLabelPrefix = "";
305 }
306 };
307
308 // Linux target
309 template<typename Target>
310 class LinuxTargetInfo : public OSTargetInfo<Target> {
311 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const312 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
313 MacroBuilder &Builder) const {
314 // Linux defines; list based off of gcc output
315 DefineStd(Builder, "unix", Opts);
316 DefineStd(Builder, "linux", Opts);
317 Builder.defineMacro("__gnu_linux__");
318 Builder.defineMacro("__ELF__");
319 if (Triple.getEnvironment() == llvm::Triple::Android)
320 Builder.defineMacro("__ANDROID__", "1");
321 if (Opts.POSIXThreads)
322 Builder.defineMacro("_REENTRANT");
323 if (Opts.CPlusPlus)
324 Builder.defineMacro("_GNU_SOURCE");
325 }
326 public:
LinuxTargetInfo(const std::string & triple)327 LinuxTargetInfo(const std::string& triple)
328 : OSTargetInfo<Target>(triple) {
329 this->UserLabelPrefix = "";
330 this->WIntType = TargetInfo::UnsignedInt;
331 }
332
getStaticInitSectionSpecifier() const333 virtual const char *getStaticInitSectionSpecifier() const {
334 return ".text.startup";
335 }
336 };
337
338 // NetBSD Target
339 template<typename Target>
340 class NetBSDTargetInfo : public OSTargetInfo<Target> {
341 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const342 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
343 MacroBuilder &Builder) const {
344 // NetBSD defines; list based off of gcc output
345 Builder.defineMacro("__NetBSD__");
346 Builder.defineMacro("__unix__");
347 Builder.defineMacro("__ELF__");
348 if (Opts.POSIXThreads)
349 Builder.defineMacro("_POSIX_THREADS");
350 }
351 public:
NetBSDTargetInfo(const std::string & triple)352 NetBSDTargetInfo(const std::string &triple)
353 : OSTargetInfo<Target>(triple) {
354 this->UserLabelPrefix = "";
355 }
356 };
357
358 // OpenBSD Target
359 template<typename Target>
360 class OpenBSDTargetInfo : public OSTargetInfo<Target> {
361 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const362 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
363 MacroBuilder &Builder) const {
364 // OpenBSD defines; list based off of gcc output
365
366 Builder.defineMacro("__OpenBSD__");
367 DefineStd(Builder, "unix", Opts);
368 Builder.defineMacro("__ELF__");
369 if (Opts.POSIXThreads)
370 Builder.defineMacro("_REENTRANT");
371 }
372 public:
OpenBSDTargetInfo(const std::string & triple)373 OpenBSDTargetInfo(const std::string &triple)
374 : OSTargetInfo<Target>(triple) {
375 this->UserLabelPrefix = "";
376 this->TLSSupported = false;
377
378 llvm::Triple Triple(triple);
379 switch (Triple.getArch()) {
380 default:
381 case llvm::Triple::x86:
382 case llvm::Triple::x86_64:
383 case llvm::Triple::arm:
384 case llvm::Triple::sparc:
385 this->MCountName = "__mcount";
386 break;
387 case llvm::Triple::mips64:
388 case llvm::Triple::mips64el:
389 case llvm::Triple::ppc:
390 case llvm::Triple::sparcv9:
391 this->MCountName = "_mcount";
392 break;
393 }
394 }
395 };
396
397 // Bitrig Target
398 template<typename Target>
399 class BitrigTargetInfo : public OSTargetInfo<Target> {
400 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const401 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
402 MacroBuilder &Builder) const {
403 // Bitrig defines; list based off of gcc output
404
405 Builder.defineMacro("__Bitrig__");
406 DefineStd(Builder, "unix", Opts);
407 Builder.defineMacro("__ELF__");
408 if (Opts.POSIXThreads)
409 Builder.defineMacro("_REENTRANT");
410 }
411 public:
BitrigTargetInfo(const std::string & triple)412 BitrigTargetInfo(const std::string &triple)
413 : OSTargetInfo<Target>(triple) {
414 this->UserLabelPrefix = "";
415 this->TLSSupported = false;
416 this->MCountName = "__mcount";
417 }
418 };
419
420 // PSP Target
421 template<typename Target>
422 class PSPTargetInfo : public OSTargetInfo<Target> {
423 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const424 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
425 MacroBuilder &Builder) const {
426 // PSP defines; list based on the output of the pspdev gcc toolchain.
427 Builder.defineMacro("PSP");
428 Builder.defineMacro("_PSP");
429 Builder.defineMacro("__psp__");
430 Builder.defineMacro("__ELF__");
431 }
432 public:
PSPTargetInfo(const std::string & triple)433 PSPTargetInfo(const std::string& triple)
434 : OSTargetInfo<Target>(triple) {
435 this->UserLabelPrefix = "";
436 }
437 };
438
439 // PS3 PPU Target
440 template<typename Target>
441 class PS3PPUTargetInfo : public OSTargetInfo<Target> {
442 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const443 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
444 MacroBuilder &Builder) const {
445 // PS3 PPU defines.
446 Builder.defineMacro("__PPC__");
447 Builder.defineMacro("__PPU__");
448 Builder.defineMacro("__CELLOS_LV2__");
449 Builder.defineMacro("__ELF__");
450 Builder.defineMacro("__LP32__");
451 Builder.defineMacro("_ARCH_PPC64");
452 Builder.defineMacro("__powerpc64__");
453 }
454 public:
PS3PPUTargetInfo(const std::string & triple)455 PS3PPUTargetInfo(const std::string& triple)
456 : OSTargetInfo<Target>(triple) {
457 this->UserLabelPrefix = "";
458 this->LongWidth = this->LongAlign = 32;
459 this->PointerWidth = this->PointerAlign = 32;
460 this->IntMaxType = TargetInfo::SignedLongLong;
461 this->UIntMaxType = TargetInfo::UnsignedLongLong;
462 this->Int64Type = TargetInfo::SignedLongLong;
463 this->SizeType = TargetInfo::UnsignedInt;
464 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
465 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
466 }
467 };
468
469 // FIXME: Need a real SPU target.
470 // PS3 SPU Target
471 template<typename Target>
472 class PS3SPUTargetInfo : public OSTargetInfo<Target> {
473 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const474 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
475 MacroBuilder &Builder) const {
476 // PS3 PPU defines.
477 Builder.defineMacro("__SPU__");
478 Builder.defineMacro("__ELF__");
479 }
480 public:
PS3SPUTargetInfo(const std::string & triple)481 PS3SPUTargetInfo(const std::string& triple)
482 : OSTargetInfo<Target>(triple) {
483 this->UserLabelPrefix = "";
484 }
485 };
486
487 // AuroraUX target
488 template<typename Target>
489 class AuroraUXTargetInfo : public OSTargetInfo<Target> {
490 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const491 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
492 MacroBuilder &Builder) const {
493 DefineStd(Builder, "sun", Opts);
494 DefineStd(Builder, "unix", Opts);
495 Builder.defineMacro("__ELF__");
496 Builder.defineMacro("__svr4__");
497 Builder.defineMacro("__SVR4");
498 }
499 public:
AuroraUXTargetInfo(const std::string & triple)500 AuroraUXTargetInfo(const std::string& triple)
501 : OSTargetInfo<Target>(triple) {
502 this->UserLabelPrefix = "";
503 this->WCharType = this->SignedLong;
504 // FIXME: WIntType should be SignedLong
505 }
506 };
507
508 // Solaris target
509 template<typename Target>
510 class SolarisTargetInfo : public OSTargetInfo<Target> {
511 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const512 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
513 MacroBuilder &Builder) const {
514 DefineStd(Builder, "sun", Opts);
515 DefineStd(Builder, "unix", Opts);
516 Builder.defineMacro("__ELF__");
517 Builder.defineMacro("__svr4__");
518 Builder.defineMacro("__SVR4");
519 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
520 // newer, but to 500 for everything else. feature_test.h has a check to
521 // ensure that you are not using C99 with an old version of X/Open or C89
522 // with a new version.
523 if (Opts.C99 || Opts.C11)
524 Builder.defineMacro("_XOPEN_SOURCE", "600");
525 else
526 Builder.defineMacro("_XOPEN_SOURCE", "500");
527 if (Opts.CPlusPlus)
528 Builder.defineMacro("__C99FEATURES__");
529 Builder.defineMacro("_LARGEFILE_SOURCE");
530 Builder.defineMacro("_LARGEFILE64_SOURCE");
531 Builder.defineMacro("__EXTENSIONS__");
532 Builder.defineMacro("_REENTRANT");
533 }
534 public:
SolarisTargetInfo(const std::string & triple)535 SolarisTargetInfo(const std::string& triple)
536 : OSTargetInfo<Target>(triple) {
537 this->UserLabelPrefix = "";
538 this->WCharType = this->SignedInt;
539 // FIXME: WIntType should be SignedLong
540 }
541 };
542
543 // Windows target
544 template<typename Target>
545 class WindowsTargetInfo : public OSTargetInfo<Target> {
546 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const547 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
548 MacroBuilder &Builder) const {
549 Builder.defineMacro("_WIN32");
550 }
getVisualStudioDefines(const LangOptions & Opts,MacroBuilder & Builder) const551 void getVisualStudioDefines(const LangOptions &Opts,
552 MacroBuilder &Builder) const {
553 if (Opts.CPlusPlus) {
554 if (Opts.RTTI)
555 Builder.defineMacro("_CPPRTTI");
556
557 if (Opts.Exceptions)
558 Builder.defineMacro("_CPPUNWIND");
559 }
560
561 if (!Opts.CharIsSigned)
562 Builder.defineMacro("_CHAR_UNSIGNED");
563
564 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
565 // but it works for now.
566 if (Opts.POSIXThreads)
567 Builder.defineMacro("_MT");
568
569 if (Opts.MSCVersion != 0)
570 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
571
572 if (Opts.MicrosoftExt) {
573 Builder.defineMacro("_MSC_EXTENSIONS");
574
575 if (Opts.CPlusPlus0x) {
576 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
577 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
578 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
579 }
580 }
581
582 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
583 }
584
585 public:
WindowsTargetInfo(const std::string & triple)586 WindowsTargetInfo(const std::string &triple)
587 : OSTargetInfo<Target>(triple) {}
588 };
589
590 } // end anonymous namespace.
591
592 //===----------------------------------------------------------------------===//
593 // Specific target implementations.
594 //===----------------------------------------------------------------------===//
595
596 namespace {
597 // PPC abstract base class
598 class PPCTargetInfo : public TargetInfo {
599 static const Builtin::Info BuiltinInfo[];
600 static const char * const GCCRegNames[];
601 static const TargetInfo::GCCRegAlias GCCRegAliases[];
602 std::string CPU;
603 public:
PPCTargetInfo(const std::string & triple)604 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
605 LongDoubleWidth = LongDoubleAlign = 128;
606 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
607 }
608
609 /// \brief Flags for architecture specific defines.
610 typedef enum {
611 ArchDefineNone = 0,
612 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
613 ArchDefinePpcgr = 1 << 1,
614 ArchDefinePpcsq = 1 << 2,
615 ArchDefine440 = 1 << 3,
616 ArchDefine603 = 1 << 4,
617 ArchDefine604 = 1 << 5,
618 ArchDefinePwr4 = 1 << 6,
619 ArchDefinePwr6 = 1 << 7
620 } ArchDefineTypes;
621
setCPU(const std::string & Name)622 virtual bool setCPU(const std::string &Name) {
623 bool CPUKnown = llvm::StringSwitch<bool>(Name)
624 .Case("generic", true)
625 .Case("440", true)
626 .Case("450", true)
627 .Case("601", true)
628 .Case("602", true)
629 .Case("603", true)
630 .Case("603e", true)
631 .Case("603ev", true)
632 .Case("604", true)
633 .Case("604e", true)
634 .Case("620", true)
635 .Case("g3", true)
636 .Case("7400", true)
637 .Case("g4", true)
638 .Case("7450", true)
639 .Case("g4+", true)
640 .Case("750", true)
641 .Case("970", true)
642 .Case("g5", true)
643 .Case("a2", true)
644 .Case("pwr6", true)
645 .Case("pwr7", true)
646 .Case("ppc", true)
647 .Case("ppc64", true)
648 .Default(false);
649
650 if (CPUKnown)
651 CPU = Name;
652
653 return CPUKnown;
654 }
655
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const656 virtual void getTargetBuiltins(const Builtin::Info *&Records,
657 unsigned &NumRecords) const {
658 Records = BuiltinInfo;
659 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
660 }
661
isCLZForZeroUndef() const662 virtual bool isCLZForZeroUndef() const { return false; }
663
664 virtual void getTargetDefines(const LangOptions &Opts,
665 MacroBuilder &Builder) const;
666
667 virtual bool hasFeature(StringRef Feature) const;
668
669 virtual void getGCCRegNames(const char * const *&Names,
670 unsigned &NumNames) const;
671 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
672 unsigned &NumAliases) const;
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info) const673 virtual bool validateAsmConstraint(const char *&Name,
674 TargetInfo::ConstraintInfo &Info) const {
675 switch (*Name) {
676 default: return false;
677 case 'O': // Zero
678 break;
679 case 'b': // Base register
680 case 'f': // Floating point register
681 Info.setAllowsRegister();
682 break;
683 // FIXME: The following are added to allow parsing.
684 // I just took a guess at what the actions should be.
685 // Also, is more specific checking needed? I.e. specific registers?
686 case 'd': // Floating point register (containing 64-bit value)
687 case 'v': // Altivec vector register
688 Info.setAllowsRegister();
689 break;
690 case 'w':
691 switch (Name[1]) {
692 case 'd':// VSX vector register to hold vector double data
693 case 'f':// VSX vector register to hold vector float data
694 case 's':// VSX vector register to hold scalar float data
695 case 'a':// Any VSX register
696 break;
697 default:
698 return false;
699 }
700 Info.setAllowsRegister();
701 Name++; // Skip over 'w'.
702 break;
703 case 'h': // `MQ', `CTR', or `LINK' register
704 case 'q': // `MQ' register
705 case 'c': // `CTR' register
706 case 'l': // `LINK' register
707 case 'x': // `CR' register (condition register) number 0
708 case 'y': // `CR' register (condition register)
709 case 'z': // `XER[CA]' carry bit (part of the XER register)
710 Info.setAllowsRegister();
711 break;
712 case 'I': // Signed 16-bit constant
713 case 'J': // Unsigned 16-bit constant shifted left 16 bits
714 // (use `L' instead for SImode constants)
715 case 'K': // Unsigned 16-bit constant
716 case 'L': // Signed 16-bit constant shifted left 16 bits
717 case 'M': // Constant larger than 31
718 case 'N': // Exact power of 2
719 case 'P': // Constant whose negation is a signed 16-bit constant
720 case 'G': // Floating point constant that can be loaded into a
721 // register with one instruction per word
722 case 'H': // Integer/Floating point constant that can be loaded
723 // into a register using three instructions
724 break;
725 case 'm': // Memory operand. Note that on PowerPC targets, m can
726 // include addresses that update the base register. It
727 // is therefore only safe to use `m' in an asm statement
728 // if that asm statement accesses the operand exactly once.
729 // The asm statement must also use `%U<opno>' as a
730 // placeholder for the "update" flag in the corresponding
731 // load or store instruction. For example:
732 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
733 // is correct but:
734 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
735 // is not. Use es rather than m if you don't want the base
736 // register to be updated.
737 case 'e':
738 if (Name[1] != 's')
739 return false;
740 // es: A "stable" memory operand; that is, one which does not
741 // include any automodification of the base register. Unlike
742 // `m', this constraint can be used in asm statements that
743 // might access the operand several times, or that might not
744 // access it at all.
745 Info.setAllowsMemory();
746 Name++; // Skip over 'e'.
747 break;
748 case 'Q': // Memory operand that is an offset from a register (it is
749 // usually better to use `m' or `es' in asm statements)
750 case 'Z': // Memory operand that is an indexed or indirect from a
751 // register (it is usually better to use `m' or `es' in
752 // asm statements)
753 Info.setAllowsMemory();
754 Info.setAllowsRegister();
755 break;
756 case 'R': // AIX TOC entry
757 case 'a': // Address operand that is an indexed or indirect from a
758 // register (`p' is preferable for asm statements)
759 case 'S': // Constant suitable as a 64-bit mask operand
760 case 'T': // Constant suitable as a 32-bit mask operand
761 case 'U': // System V Release 4 small data area reference
762 case 't': // AND masks that can be performed by two rldic{l, r}
763 // instructions
764 case 'W': // Vector constant that does not require memory
765 case 'j': // Vector constant that is all zeros.
766 break;
767 // End FIXME.
768 }
769 return true;
770 }
getClobbers() const771 virtual const char *getClobbers() const {
772 return "";
773 }
774 };
775
776 const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
777 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
778 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
779 ALL_LANGUAGES },
780 #include "clang/Basic/BuiltinsPPC.def"
781 };
782
783
784 /// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
785 /// #defines that are not tied to a specific subtarget.
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const786 void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
787 MacroBuilder &Builder) const {
788 // Target identification.
789 Builder.defineMacro("__ppc__");
790 Builder.defineMacro("_ARCH_PPC");
791 Builder.defineMacro("__powerpc__");
792 Builder.defineMacro("__POWERPC__");
793 if (PointerWidth == 64) {
794 Builder.defineMacro("_ARCH_PPC64");
795 Builder.defineMacro("__powerpc64__");
796 Builder.defineMacro("__ppc64__");
797 } else {
798 Builder.defineMacro("__ppc__");
799 }
800
801 // Target properties.
802 if (getTriple().getOS() != llvm::Triple::NetBSD &&
803 getTriple().getOS() != llvm::Triple::OpenBSD)
804 Builder.defineMacro("_BIG_ENDIAN");
805 Builder.defineMacro("__BIG_ENDIAN__");
806
807 // Subtarget options.
808 Builder.defineMacro("__NATURAL_ALIGNMENT__");
809 Builder.defineMacro("__REGISTER_PREFIX__", "");
810
811 // FIXME: Should be controlled by command line option.
812 Builder.defineMacro("__LONG_DOUBLE_128__");
813
814 if (Opts.AltiVec) {
815 Builder.defineMacro("__VEC__", "10206");
816 Builder.defineMacro("__ALTIVEC__");
817 }
818
819 // CPU identification.
820 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
821 .Case("440", ArchDefineName)
822 .Case("450", ArchDefineName | ArchDefine440)
823 .Case("601", ArchDefineName)
824 .Case("602", ArchDefineName | ArchDefinePpcgr)
825 .Case("603", ArchDefineName | ArchDefinePpcgr)
826 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
827 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
828 .Case("604", ArchDefineName | ArchDefinePpcgr)
829 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
830 .Case("620", ArchDefineName | ArchDefinePpcgr)
831 .Case("7400", ArchDefineName | ArchDefinePpcgr)
832 .Case("7450", ArchDefineName | ArchDefinePpcgr)
833 .Case("750", ArchDefineName | ArchDefinePpcgr)
834 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
835 | ArchDefinePpcsq)
836 .Case("pwr6", ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
837 .Case("pwr7", ArchDefineName | ArchDefinePwr6 | ArchDefinePpcgr
838 | ArchDefinePpcsq)
839 .Default(ArchDefineNone);
840
841 if (defs & ArchDefineName)
842 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
843 if (defs & ArchDefinePpcgr)
844 Builder.defineMacro("_ARCH_PPCGR");
845 if (defs & ArchDefinePpcsq)
846 Builder.defineMacro("_ARCH_PPCSQ");
847 if (defs & ArchDefine440)
848 Builder.defineMacro("_ARCH_440");
849 if (defs & ArchDefine603)
850 Builder.defineMacro("_ARCH_603");
851 if (defs & ArchDefine604)
852 Builder.defineMacro("_ARCH_604");
853 if (defs & (ArchDefinePwr4 | ArchDefinePwr6))
854 Builder.defineMacro("_ARCH_PWR4");
855 if (defs & ArchDefinePwr6) {
856 Builder.defineMacro("_ARCH_PWR5");
857 Builder.defineMacro("_ARCH_PWR6");
858 }
859 }
860
hasFeature(StringRef Feature) const861 bool PPCTargetInfo::hasFeature(StringRef Feature) const {
862 return Feature == "powerpc";
863 }
864
865
866 const char * const PPCTargetInfo::GCCRegNames[] = {
867 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
868 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
869 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
870 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
871 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
872 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
873 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
874 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
875 "mq", "lr", "ctr", "ap",
876 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
877 "xer",
878 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
879 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
880 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
881 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
882 "vrsave", "vscr",
883 "spe_acc", "spefscr",
884 "sfp"
885 };
886
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const887 void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
888 unsigned &NumNames) const {
889 Names = GCCRegNames;
890 NumNames = llvm::array_lengthof(GCCRegNames);
891 }
892
893 const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
894 // While some of these aliases do map to different registers
895 // they still share the same register name.
896 { { "0" }, "r0" },
897 { { "1"}, "r1" },
898 { { "2" }, "r2" },
899 { { "3" }, "r3" },
900 { { "4" }, "r4" },
901 { { "5" }, "r5" },
902 { { "6" }, "r6" },
903 { { "7" }, "r7" },
904 { { "8" }, "r8" },
905 { { "9" }, "r9" },
906 { { "10" }, "r10" },
907 { { "11" }, "r11" },
908 { { "12" }, "r12" },
909 { { "13" }, "r13" },
910 { { "14" }, "r14" },
911 { { "15" }, "r15" },
912 { { "16" }, "r16" },
913 { { "17" }, "r17" },
914 { { "18" }, "r18" },
915 { { "19" }, "r19" },
916 { { "20" }, "r20" },
917 { { "21" }, "r21" },
918 { { "22" }, "r22" },
919 { { "23" }, "r23" },
920 { { "24" }, "r24" },
921 { { "25" }, "r25" },
922 { { "26" }, "r26" },
923 { { "27" }, "r27" },
924 { { "28" }, "r28" },
925 { { "29" }, "r29" },
926 { { "30" }, "r30" },
927 { { "31" }, "r31" },
928 { { "fr0" }, "f0" },
929 { { "fr1" }, "f1" },
930 { { "fr2" }, "f2" },
931 { { "fr3" }, "f3" },
932 { { "fr4" }, "f4" },
933 { { "fr5" }, "f5" },
934 { { "fr6" }, "f6" },
935 { { "fr7" }, "f7" },
936 { { "fr8" }, "f8" },
937 { { "fr9" }, "f9" },
938 { { "fr10" }, "f10" },
939 { { "fr11" }, "f11" },
940 { { "fr12" }, "f12" },
941 { { "fr13" }, "f13" },
942 { { "fr14" }, "f14" },
943 { { "fr15" }, "f15" },
944 { { "fr16" }, "f16" },
945 { { "fr17" }, "f17" },
946 { { "fr18" }, "f18" },
947 { { "fr19" }, "f19" },
948 { { "fr20" }, "f20" },
949 { { "fr21" }, "f21" },
950 { { "fr22" }, "f22" },
951 { { "fr23" }, "f23" },
952 { { "fr24" }, "f24" },
953 { { "fr25" }, "f25" },
954 { { "fr26" }, "f26" },
955 { { "fr27" }, "f27" },
956 { { "fr28" }, "f28" },
957 { { "fr29" }, "f29" },
958 { { "fr30" }, "f30" },
959 { { "fr31" }, "f31" },
960 { { "cc" }, "cr0" },
961 };
962
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const963 void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
964 unsigned &NumAliases) const {
965 Aliases = GCCRegAliases;
966 NumAliases = llvm::array_lengthof(GCCRegAliases);
967 }
968 } // end anonymous namespace.
969
970 namespace {
971 class PPC32TargetInfo : public PPCTargetInfo {
972 public:
PPC32TargetInfo(const std::string & triple)973 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
974 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
975 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
976
977 switch (getTriple().getOS()) {
978 case llvm::Triple::Linux:
979 case llvm::Triple::FreeBSD:
980 case llvm::Triple::NetBSD:
981 SizeType = UnsignedInt;
982 PtrDiffType = SignedInt;
983 IntPtrType = SignedInt;
984 break;
985 default:
986 break;
987 }
988
989 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
990 LongDoubleWidth = LongDoubleAlign = 64;
991 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
992 }
993 }
994
getBuiltinVaListKind() const995 virtual BuiltinVaListKind getBuiltinVaListKind() const {
996 // This is the ELF definition, and is overridden by the Darwin sub-target
997 return TargetInfo::PowerABIBuiltinVaList;
998 }
999 };
1000 } // end anonymous namespace.
1001
1002 namespace {
1003 class PPC64TargetInfo : public PPCTargetInfo {
1004 public:
PPC64TargetInfo(const std::string & triple)1005 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
1006 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
1007 IntMaxType = SignedLong;
1008 UIntMaxType = UnsignedLong;
1009 Int64Type = SignedLong;
1010 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1011 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
1012
1013 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1014 LongDoubleWidth = LongDoubleAlign = 64;
1015 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1016 }
1017 }
getBuiltinVaListKind() const1018 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1019 return TargetInfo::CharPtrBuiltinVaList;
1020 }
1021 };
1022 } // end anonymous namespace.
1023
1024
1025 namespace {
1026 class DarwinPPC32TargetInfo :
1027 public DarwinTargetInfo<PPC32TargetInfo> {
1028 public:
DarwinPPC32TargetInfo(const std::string & triple)1029 DarwinPPC32TargetInfo(const std::string& triple)
1030 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
1031 HasAlignMac68kSupport = true;
1032 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
1033 LongLongAlign = 32;
1034 SuitableAlign = 128;
1035 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1036 "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
1037 }
getBuiltinVaListKind() const1038 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1039 return TargetInfo::CharPtrBuiltinVaList;
1040 }
1041 };
1042
1043 class DarwinPPC64TargetInfo :
1044 public DarwinTargetInfo<PPC64TargetInfo> {
1045 public:
DarwinPPC64TargetInfo(const std::string & triple)1046 DarwinPPC64TargetInfo(const std::string& triple)
1047 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
1048 HasAlignMac68kSupport = true;
1049 SuitableAlign = 128;
1050 }
1051 };
1052 } // end anonymous namespace.
1053
1054 namespace {
1055 static const unsigned NVPTXAddrSpaceMap[] = {
1056 1, // opencl_global
1057 3, // opencl_local
1058 4, // opencl_constant
1059 1, // cuda_device
1060 4, // cuda_constant
1061 3, // cuda_shared
1062 };
1063 class NVPTXTargetInfo : public TargetInfo {
1064 static const char * const GCCRegNames[];
1065 static const Builtin::Info BuiltinInfo[];
1066 std::vector<llvm::StringRef> AvailableFeatures;
1067 public:
NVPTXTargetInfo(const std::string & triple)1068 NVPTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
1069 BigEndian = false;
1070 TLSSupported = false;
1071 LongWidth = LongAlign = 64;
1072 AddrSpaceMap = &NVPTXAddrSpaceMap;
1073 // Define available target features
1074 // These must be defined in sorted order!
1075 NoAsmVariants = true;
1076 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const1077 virtual void getTargetDefines(const LangOptions &Opts,
1078 MacroBuilder &Builder) const {
1079 Builder.defineMacro("__PTX__");
1080 Builder.defineMacro("__NVPTX__");
1081 }
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const1082 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1083 unsigned &NumRecords) const {
1084 Records = BuiltinInfo;
1085 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
1086 }
hasFeature(StringRef Feature) const1087 virtual bool hasFeature(StringRef Feature) const {
1088 return Feature == "ptx" || Feature == "nvptx";
1089 }
1090
1091 virtual void getGCCRegNames(const char * const *&Names,
1092 unsigned &NumNames) const;
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const1093 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1094 unsigned &NumAliases) const {
1095 // No aliases.
1096 Aliases = 0;
1097 NumAliases = 0;
1098 }
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & info) const1099 virtual bool validateAsmConstraint(const char *&Name,
1100 TargetInfo::ConstraintInfo &info) const {
1101 // FIXME: implement
1102 return true;
1103 }
getClobbers() const1104 virtual const char *getClobbers() const {
1105 // FIXME: Is this really right?
1106 return "";
1107 }
getBuiltinVaListKind() const1108 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1109 // FIXME: implement
1110 return TargetInfo::CharPtrBuiltinVaList;
1111 }
setCPU(const std::string & Name)1112 virtual bool setCPU(const std::string &Name) {
1113 return Name == "sm_10" || Name == "sm_13" || Name == "sm_20";
1114 }
1115 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1116 StringRef Name,
1117 bool Enabled) const;
1118 };
1119
1120 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1121 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1122 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1123 ALL_LANGUAGES },
1124 #include "clang/Basic/BuiltinsNVPTX.def"
1125 };
1126
1127 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1128 "r0"
1129 };
1130
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const1131 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1132 unsigned &NumNames) const {
1133 Names = GCCRegNames;
1134 NumNames = llvm::array_lengthof(GCCRegNames);
1135 }
1136
setFeatureEnabled(llvm::StringMap<bool> & Features,StringRef Name,bool Enabled) const1137 bool NVPTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1138 StringRef Name,
1139 bool Enabled) const {
1140 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1141 Name)) {
1142 Features[Name] = Enabled;
1143 return true;
1144 } else {
1145 return false;
1146 }
1147 }
1148
1149 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1150 public:
NVPTX32TargetInfo(const std::string & triple)1151 NVPTX32TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
1152 PointerWidth = PointerAlign = 32;
1153 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
1154 DescriptionString
1155 = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1156 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1157 "n16:32:64";
1158 }
1159 };
1160
1161 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1162 public:
NVPTX64TargetInfo(const std::string & triple)1163 NVPTX64TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
1164 PointerWidth = PointerAlign = 64;
1165 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
1166 DescriptionString
1167 = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1168 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1169 "n16:32:64";
1170 }
1171 };
1172 }
1173
1174 namespace {
1175 // MBlaze abstract base class
1176 class MBlazeTargetInfo : public TargetInfo {
1177 static const char * const GCCRegNames[];
1178 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1179
1180 public:
MBlazeTargetInfo(const std::string & triple)1181 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
1182 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
1183 }
1184
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const1185 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1186 unsigned &NumRecords) const {
1187 // FIXME: Implement.
1188 Records = 0;
1189 NumRecords = 0;
1190 }
1191
1192 virtual void getTargetDefines(const LangOptions &Opts,
1193 MacroBuilder &Builder) const;
1194
hasFeature(StringRef Feature) const1195 virtual bool hasFeature(StringRef Feature) const {
1196 return Feature == "mblaze";
1197 }
1198
getBuiltinVaListKind() const1199 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1200 return TargetInfo::CharPtrBuiltinVaList;
1201 }
getTargetPrefix() const1202 virtual const char *getTargetPrefix() const {
1203 return "mblaze";
1204 }
1205 virtual void getGCCRegNames(const char * const *&Names,
1206 unsigned &NumNames) const;
1207 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1208 unsigned &NumAliases) const;
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info) const1209 virtual bool validateAsmConstraint(const char *&Name,
1210 TargetInfo::ConstraintInfo &Info) const {
1211 switch (*Name) {
1212 default: return false;
1213 case 'O': // Zero
1214 return true;
1215 case 'b': // Base register
1216 case 'f': // Floating point register
1217 Info.setAllowsRegister();
1218 return true;
1219 }
1220 }
getClobbers() const1221 virtual const char *getClobbers() const {
1222 return "";
1223 }
1224 };
1225
1226 /// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1227 /// #defines that are not tied to a specific subtarget.
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const1228 void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1229 MacroBuilder &Builder) const {
1230 // Target identification.
1231 Builder.defineMacro("__microblaze__");
1232 Builder.defineMacro("_ARCH_MICROBLAZE");
1233 Builder.defineMacro("__MICROBLAZE__");
1234
1235 // Target properties.
1236 Builder.defineMacro("_BIG_ENDIAN");
1237 Builder.defineMacro("__BIG_ENDIAN__");
1238
1239 // Subtarget options.
1240 Builder.defineMacro("__REGISTER_PREFIX__", "");
1241 }
1242
1243
1244 const char * const MBlazeTargetInfo::GCCRegNames[] = {
1245 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1246 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1247 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1248 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1249 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1250 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1251 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1252 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1253 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1254 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1255 };
1256
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const1257 void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1258 unsigned &NumNames) const {
1259 Names = GCCRegNames;
1260 NumNames = llvm::array_lengthof(GCCRegNames);
1261 }
1262
1263 const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1264 { {"f0"}, "r0" },
1265 { {"f1"}, "r1" },
1266 { {"f2"}, "r2" },
1267 { {"f3"}, "r3" },
1268 { {"f4"}, "r4" },
1269 { {"f5"}, "r5" },
1270 { {"f6"}, "r6" },
1271 { {"f7"}, "r7" },
1272 { {"f8"}, "r8" },
1273 { {"f9"}, "r9" },
1274 { {"f10"}, "r10" },
1275 { {"f11"}, "r11" },
1276 { {"f12"}, "r12" },
1277 { {"f13"}, "r13" },
1278 { {"f14"}, "r14" },
1279 { {"f15"}, "r15" },
1280 { {"f16"}, "r16" },
1281 { {"f17"}, "r17" },
1282 { {"f18"}, "r18" },
1283 { {"f19"}, "r19" },
1284 { {"f20"}, "r20" },
1285 { {"f21"}, "r21" },
1286 { {"f22"}, "r22" },
1287 { {"f23"}, "r23" },
1288 { {"f24"}, "r24" },
1289 { {"f25"}, "r25" },
1290 { {"f26"}, "r26" },
1291 { {"f27"}, "r27" },
1292 { {"f28"}, "r28" },
1293 { {"f29"}, "r29" },
1294 { {"f30"}, "r30" },
1295 { {"f31"}, "r31" },
1296 };
1297
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const1298 void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1299 unsigned &NumAliases) const {
1300 Aliases = GCCRegAliases;
1301 NumAliases = llvm::array_lengthof(GCCRegAliases);
1302 }
1303 } // end anonymous namespace.
1304
1305 namespace {
1306 // Namespace for x86 abstract base class
1307 const Builtin::Info BuiltinInfo[] = {
1308 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1309 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1310 ALL_LANGUAGES },
1311 #include "clang/Basic/BuiltinsX86.def"
1312 };
1313
1314 static const char* const GCCRegNames[] = {
1315 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1316 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
1317 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
1318 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1319 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1320 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1321 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
1322 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1323 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
1324 };
1325
1326 const TargetInfo::AddlRegName AddlRegNames[] = {
1327 { { "al", "ah", "eax", "rax" }, 0 },
1328 { { "bl", "bh", "ebx", "rbx" }, 3 },
1329 { { "cl", "ch", "ecx", "rcx" }, 2 },
1330 { { "dl", "dh", "edx", "rdx" }, 1 },
1331 { { "esi", "rsi" }, 4 },
1332 { { "edi", "rdi" }, 5 },
1333 { { "esp", "rsp" }, 7 },
1334 { { "ebp", "rbp" }, 6 },
1335 };
1336
1337 // X86 target abstract base class; x86-32 and x86-64 are very close, so
1338 // most of the implementation can be shared.
1339 class X86TargetInfo : public TargetInfo {
1340 enum X86SSEEnum {
1341 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
1342 } SSELevel;
1343 enum MMX3DNowEnum {
1344 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1345 } MMX3DNowLevel;
1346
1347 bool HasAES;
1348 bool HasPCLMUL;
1349 bool HasLZCNT;
1350 bool HasRDRND;
1351 bool HasBMI;
1352 bool HasBMI2;
1353 bool HasPOPCNT;
1354 bool HasSSE4a;
1355 bool HasFMA4;
1356 bool HasFMA;
1357 bool HasXOP;
1358
1359 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1360 ///
1361 /// Each enumeration represents a particular CPU supported by Clang. These
1362 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1363 enum CPUKind {
1364 CK_Generic,
1365
1366 /// \name i386
1367 /// i386-generation processors.
1368 //@{
1369 CK_i386,
1370 //@}
1371
1372 /// \name i486
1373 /// i486-generation processors.
1374 //@{
1375 CK_i486,
1376 CK_WinChipC6,
1377 CK_WinChip2,
1378 CK_C3,
1379 //@}
1380
1381 /// \name i586
1382 /// i586-generation processors, P5 microarchitecture based.
1383 //@{
1384 CK_i586,
1385 CK_Pentium,
1386 CK_PentiumMMX,
1387 //@}
1388
1389 /// \name i686
1390 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1391 //@{
1392 CK_i686,
1393 CK_PentiumPro,
1394 CK_Pentium2,
1395 CK_Pentium3,
1396 CK_Pentium3M,
1397 CK_PentiumM,
1398 CK_C3_2,
1399
1400 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1401 /// Clang however has some logic to suport this.
1402 // FIXME: Warn, deprecate, and potentially remove this.
1403 CK_Yonah,
1404 //@}
1405
1406 /// \name Netburst
1407 /// Netburst microarchitecture based processors.
1408 //@{
1409 CK_Pentium4,
1410 CK_Pentium4M,
1411 CK_Prescott,
1412 CK_Nocona,
1413 //@}
1414
1415 /// \name Core
1416 /// Core microarchitecture based processors.
1417 //@{
1418 CK_Core2,
1419
1420 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1421 /// codename which GCC no longer accepts as an option to -march, but Clang
1422 /// has some logic for recognizing it.
1423 // FIXME: Warn, deprecate, and potentially remove this.
1424 CK_Penryn,
1425 //@}
1426
1427 /// \name Atom
1428 /// Atom processors
1429 //@{
1430 CK_Atom,
1431 //@}
1432
1433 /// \name Nehalem
1434 /// Nehalem microarchitecture based processors.
1435 //@{
1436 CK_Corei7,
1437 CK_Corei7AVX,
1438 CK_CoreAVXi,
1439 CK_CoreAVX2,
1440 //@}
1441
1442 /// \name K6
1443 /// K6 architecture processors.
1444 //@{
1445 CK_K6,
1446 CK_K6_2,
1447 CK_K6_3,
1448 //@}
1449
1450 /// \name K7
1451 /// K7 architecture processors.
1452 //@{
1453 CK_Athlon,
1454 CK_AthlonThunderbird,
1455 CK_Athlon4,
1456 CK_AthlonXP,
1457 CK_AthlonMP,
1458 //@}
1459
1460 /// \name K8
1461 /// K8 architecture processors.
1462 //@{
1463 CK_Athlon64,
1464 CK_Athlon64SSE3,
1465 CK_AthlonFX,
1466 CK_K8,
1467 CK_K8SSE3,
1468 CK_Opteron,
1469 CK_OpteronSSE3,
1470 CK_AMDFAM10,
1471 //@}
1472
1473 /// \name Bobcat
1474 /// Bobcat architecture processors.
1475 //@{
1476 CK_BTVER1,
1477 //@}
1478
1479 /// \name Bulldozer
1480 /// Bulldozer architecture processors.
1481 //@{
1482 CK_BDVER1,
1483 CK_BDVER2,
1484 //@}
1485
1486 /// This specification is deprecated and will be removed in the future.
1487 /// Users should prefer \see CK_K8.
1488 // FIXME: Warn on this when the CPU is set to it.
1489 CK_x86_64,
1490 //@}
1491
1492 /// \name Geode
1493 /// Geode processors.
1494 //@{
1495 CK_Geode
1496 //@}
1497 } CPU;
1498
1499 public:
X86TargetInfo(const std::string & triple)1500 X86TargetInfo(const std::string& triple)
1501 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
1502 HasAES(false), HasPCLMUL(false), HasLZCNT(false), HasRDRND(false),
1503 HasBMI(false), HasBMI2(false), HasPOPCNT(false), HasSSE4a(false),
1504 HasFMA4(false), HasFMA(false), HasXOP(false), CPU(CK_Generic) {
1505 BigEndian = false;
1506 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
1507 }
getFloatEvalMethod() const1508 virtual unsigned getFloatEvalMethod() const {
1509 // X87 evaluates with 80 bits "long double" precision.
1510 return SSELevel == NoSSE ? 2 : 0;
1511 }
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const1512 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1513 unsigned &NumRecords) const {
1514 Records = BuiltinInfo;
1515 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
1516 }
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const1517 virtual void getGCCRegNames(const char * const *&Names,
1518 unsigned &NumNames) const {
1519 Names = GCCRegNames;
1520 NumNames = llvm::array_lengthof(GCCRegNames);
1521 }
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const1522 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1523 unsigned &NumAliases) const {
1524 Aliases = 0;
1525 NumAliases = 0;
1526 }
getGCCAddlRegNames(const AddlRegName * & Names,unsigned & NumNames) const1527 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1528 unsigned &NumNames) const {
1529 Names = AddlRegNames;
1530 NumNames = llvm::array_lengthof(AddlRegNames);
1531 }
1532 virtual bool validateAsmConstraint(const char *&Name,
1533 TargetInfo::ConstraintInfo &info) const;
1534 virtual std::string convertConstraint(const char *&Constraint) const;
getClobbers() const1535 virtual const char *getClobbers() const {
1536 return "~{dirflag},~{fpsr},~{flags}";
1537 }
1538 virtual void getTargetDefines(const LangOptions &Opts,
1539 MacroBuilder &Builder) const;
1540 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1541 StringRef Name,
1542 bool Enabled) const;
1543 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
1544 virtual bool hasFeature(StringRef Feature) const;
1545 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
getABI() const1546 virtual const char* getABI() const {
1547 if (PointerWidth == 64 && SSELevel >= AVX)
1548 return "avx";
1549 else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow)
1550 return "no-mmx";
1551 return "";
1552 }
setCPU(const std::string & Name)1553 virtual bool setCPU(const std::string &Name) {
1554 CPU = llvm::StringSwitch<CPUKind>(Name)
1555 .Case("i386", CK_i386)
1556 .Case("i486", CK_i486)
1557 .Case("winchip-c6", CK_WinChipC6)
1558 .Case("winchip2", CK_WinChip2)
1559 .Case("c3", CK_C3)
1560 .Case("i586", CK_i586)
1561 .Case("pentium", CK_Pentium)
1562 .Case("pentium-mmx", CK_PentiumMMX)
1563 .Case("i686", CK_i686)
1564 .Case("pentiumpro", CK_PentiumPro)
1565 .Case("pentium2", CK_Pentium2)
1566 .Case("pentium3", CK_Pentium3)
1567 .Case("pentium3m", CK_Pentium3M)
1568 .Case("pentium-m", CK_PentiumM)
1569 .Case("c3-2", CK_C3_2)
1570 .Case("yonah", CK_Yonah)
1571 .Case("pentium4", CK_Pentium4)
1572 .Case("pentium4m", CK_Pentium4M)
1573 .Case("prescott", CK_Prescott)
1574 .Case("nocona", CK_Nocona)
1575 .Case("core2", CK_Core2)
1576 .Case("penryn", CK_Penryn)
1577 .Case("atom", CK_Atom)
1578 .Case("corei7", CK_Corei7)
1579 .Case("corei7-avx", CK_Corei7AVX)
1580 .Case("core-avx-i", CK_CoreAVXi)
1581 .Case("core-avx2", CK_CoreAVX2)
1582 .Case("k6", CK_K6)
1583 .Case("k6-2", CK_K6_2)
1584 .Case("k6-3", CK_K6_3)
1585 .Case("athlon", CK_Athlon)
1586 .Case("athlon-tbird", CK_AthlonThunderbird)
1587 .Case("athlon-4", CK_Athlon4)
1588 .Case("athlon-xp", CK_AthlonXP)
1589 .Case("athlon-mp", CK_AthlonMP)
1590 .Case("athlon64", CK_Athlon64)
1591 .Case("athlon64-sse3", CK_Athlon64SSE3)
1592 .Case("athlon-fx", CK_AthlonFX)
1593 .Case("k8", CK_K8)
1594 .Case("k8-sse3", CK_K8SSE3)
1595 .Case("opteron", CK_Opteron)
1596 .Case("opteron-sse3", CK_OpteronSSE3)
1597 .Case("amdfam10", CK_AMDFAM10)
1598 .Case("btver1", CK_BTVER1)
1599 .Case("bdver1", CK_BDVER1)
1600 .Case("bdver2", CK_BDVER2)
1601 .Case("x86-64", CK_x86_64)
1602 .Case("geode", CK_Geode)
1603 .Default(CK_Generic);
1604
1605 // Perform any per-CPU checks necessary to determine if this CPU is
1606 // acceptable.
1607 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1608 // invalid without explaining *why*.
1609 switch (CPU) {
1610 case CK_Generic:
1611 // No processor selected!
1612 return false;
1613
1614 case CK_i386:
1615 case CK_i486:
1616 case CK_WinChipC6:
1617 case CK_WinChip2:
1618 case CK_C3:
1619 case CK_i586:
1620 case CK_Pentium:
1621 case CK_PentiumMMX:
1622 case CK_i686:
1623 case CK_PentiumPro:
1624 case CK_Pentium2:
1625 case CK_Pentium3:
1626 case CK_Pentium3M:
1627 case CK_PentiumM:
1628 case CK_Yonah:
1629 case CK_C3_2:
1630 case CK_Pentium4:
1631 case CK_Pentium4M:
1632 case CK_Prescott:
1633 case CK_K6:
1634 case CK_K6_2:
1635 case CK_K6_3:
1636 case CK_Athlon:
1637 case CK_AthlonThunderbird:
1638 case CK_Athlon4:
1639 case CK_AthlonXP:
1640 case CK_AthlonMP:
1641 case CK_Geode:
1642 // Only accept certain architectures when compiling in 32-bit mode.
1643 if (PointerWidth != 32)
1644 return false;
1645
1646 // Fallthrough
1647 case CK_Nocona:
1648 case CK_Core2:
1649 case CK_Penryn:
1650 case CK_Atom:
1651 case CK_Corei7:
1652 case CK_Corei7AVX:
1653 case CK_CoreAVXi:
1654 case CK_CoreAVX2:
1655 case CK_Athlon64:
1656 case CK_Athlon64SSE3:
1657 case CK_AthlonFX:
1658 case CK_K8:
1659 case CK_K8SSE3:
1660 case CK_Opteron:
1661 case CK_OpteronSSE3:
1662 case CK_AMDFAM10:
1663 case CK_BTVER1:
1664 case CK_BDVER1:
1665 case CK_BDVER2:
1666 case CK_x86_64:
1667 return true;
1668 }
1669 llvm_unreachable("Unhandled CPU kind");
1670 }
1671 };
1672
getDefaultFeatures(llvm::StringMap<bool> & Features) const1673 void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1674 // FIXME: This should not be here.
1675 Features["3dnow"] = false;
1676 Features["3dnowa"] = false;
1677 Features["mmx"] = false;
1678 Features["sse"] = false;
1679 Features["sse2"] = false;
1680 Features["sse3"] = false;
1681 Features["ssse3"] = false;
1682 Features["sse41"] = false;
1683 Features["sse42"] = false;
1684 Features["sse4a"] = false;
1685 Features["aes"] = false;
1686 Features["pclmul"] = false;
1687 Features["avx"] = false;
1688 Features["avx2"] = false;
1689 Features["lzcnt"] = false;
1690 Features["rdrand"] = false;
1691 Features["bmi"] = false;
1692 Features["bmi2"] = false;
1693 Features["popcnt"] = false;
1694 Features["fma4"] = false;
1695 Features["fma"] = false;
1696 Features["xop"] = false;
1697
1698 // FIXME: This *really* should not be here.
1699
1700 // X86_64 always has SSE2.
1701 if (PointerWidth == 64)
1702 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1703
1704 switch (CPU) {
1705 case CK_Generic:
1706 case CK_i386:
1707 case CK_i486:
1708 case CK_i586:
1709 case CK_Pentium:
1710 case CK_i686:
1711 case CK_PentiumPro:
1712 break;
1713 case CK_PentiumMMX:
1714 case CK_Pentium2:
1715 setFeatureEnabled(Features, "mmx", true);
1716 break;
1717 case CK_Pentium3:
1718 case CK_Pentium3M:
1719 setFeatureEnabled(Features, "mmx", true);
1720 setFeatureEnabled(Features, "sse", true);
1721 break;
1722 case CK_PentiumM:
1723 case CK_Pentium4:
1724 case CK_Pentium4M:
1725 case CK_x86_64:
1726 setFeatureEnabled(Features, "mmx", true);
1727 setFeatureEnabled(Features, "sse2", true);
1728 break;
1729 case CK_Yonah:
1730 case CK_Prescott:
1731 case CK_Nocona:
1732 setFeatureEnabled(Features, "mmx", true);
1733 setFeatureEnabled(Features, "sse3", true);
1734 break;
1735 case CK_Core2:
1736 setFeatureEnabled(Features, "mmx", true);
1737 setFeatureEnabled(Features, "ssse3", true);
1738 break;
1739 case CK_Penryn:
1740 setFeatureEnabled(Features, "mmx", true);
1741 setFeatureEnabled(Features, "sse4.1", true);
1742 break;
1743 case CK_Atom:
1744 setFeatureEnabled(Features, "mmx", true);
1745 setFeatureEnabled(Features, "ssse3", true);
1746 break;
1747 case CK_Corei7:
1748 setFeatureEnabled(Features, "mmx", true);
1749 setFeatureEnabled(Features, "sse4", true);
1750 break;
1751 case CK_Corei7AVX:
1752 setFeatureEnabled(Features, "mmx", true);
1753 setFeatureEnabled(Features, "avx", true);
1754 setFeatureEnabled(Features, "aes", true);
1755 setFeatureEnabled(Features, "pclmul", true);
1756 break;
1757 case CK_CoreAVXi:
1758 setFeatureEnabled(Features, "mmx", true);
1759 setFeatureEnabled(Features, "avx", true);
1760 setFeatureEnabled(Features, "aes", true);
1761 setFeatureEnabled(Features, "pclmul", true);
1762 setFeatureEnabled(Features, "rdrnd", true);
1763 break;
1764 case CK_CoreAVX2:
1765 setFeatureEnabled(Features, "mmx", true);
1766 setFeatureEnabled(Features, "avx2", true);
1767 setFeatureEnabled(Features, "aes", true);
1768 setFeatureEnabled(Features, "pclmul", true);
1769 setFeatureEnabled(Features, "lzcnt", true);
1770 setFeatureEnabled(Features, "rdrnd", true);
1771 setFeatureEnabled(Features, "bmi", true);
1772 setFeatureEnabled(Features, "bmi2", true);
1773 setFeatureEnabled(Features, "fma", true);
1774 break;
1775 case CK_K6:
1776 case CK_WinChipC6:
1777 setFeatureEnabled(Features, "mmx", true);
1778 break;
1779 case CK_K6_2:
1780 case CK_K6_3:
1781 case CK_WinChip2:
1782 case CK_C3:
1783 setFeatureEnabled(Features, "3dnow", true);
1784 break;
1785 case CK_Athlon:
1786 case CK_AthlonThunderbird:
1787 case CK_Geode:
1788 setFeatureEnabled(Features, "3dnowa", true);
1789 break;
1790 case CK_Athlon4:
1791 case CK_AthlonXP:
1792 case CK_AthlonMP:
1793 setFeatureEnabled(Features, "sse", true);
1794 setFeatureEnabled(Features, "3dnowa", true);
1795 break;
1796 case CK_K8:
1797 case CK_Opteron:
1798 case CK_Athlon64:
1799 case CK_AthlonFX:
1800 setFeatureEnabled(Features, "sse2", true);
1801 setFeatureEnabled(Features, "3dnowa", true);
1802 break;
1803 case CK_K8SSE3:
1804 case CK_OpteronSSE3:
1805 case CK_Athlon64SSE3:
1806 setFeatureEnabled(Features, "sse3", true);
1807 setFeatureEnabled(Features, "3dnowa", true);
1808 break;
1809 case CK_AMDFAM10:
1810 setFeatureEnabled(Features, "sse3", true);
1811 setFeatureEnabled(Features, "sse4a", true);
1812 setFeatureEnabled(Features, "3dnowa", true);
1813 break;
1814 case CK_BTVER1:
1815 setFeatureEnabled(Features, "ssse3", true);
1816 setFeatureEnabled(Features, "sse4a", true);
1817 break;
1818 case CK_BDVER1:
1819 case CK_BDVER2:
1820 setFeatureEnabled(Features, "avx", true);
1821 setFeatureEnabled(Features, "xop", true);
1822 setFeatureEnabled(Features, "aes", true);
1823 setFeatureEnabled(Features, "pclmul", true);
1824 break;
1825 case CK_C3_2:
1826 setFeatureEnabled(Features, "mmx", true);
1827 setFeatureEnabled(Features, "sse", true);
1828 break;
1829 }
1830 }
1831
setFeatureEnabled(llvm::StringMap<bool> & Features,StringRef Name,bool Enabled) const1832 bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1833 StringRef Name,
1834 bool Enabled) const {
1835 // FIXME: This *really* should not be here. We need some way of translating
1836 // options into llvm subtarget features.
1837 if (!Features.count(Name) &&
1838 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1" &&
1839 Name != "rdrnd"))
1840 return false;
1841
1842 // FIXME: this should probably use a switch with fall through.
1843
1844 if (Enabled) {
1845 if (Name == "mmx")
1846 Features["mmx"] = true;
1847 else if (Name == "sse")
1848 Features["mmx"] = Features["sse"] = true;
1849 else if (Name == "sse2")
1850 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
1851 else if (Name == "sse3")
1852 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1853 true;
1854 else if (Name == "ssse3")
1855 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1856 Features["ssse3"] = true;
1857 else if (Name == "sse4" || Name == "sse4.2")
1858 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1859 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1860 Features["popcnt"] = true;
1861 else if (Name == "sse4.1")
1862 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1863 Features["ssse3"] = Features["sse41"] = true;
1864 else if (Name == "3dnow")
1865 Features["mmx"] = Features["3dnow"] = true;
1866 else if (Name == "3dnowa")
1867 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
1868 else if (Name == "aes")
1869 Features["sse"] = Features["sse2"] = Features["aes"] = true;
1870 else if (Name == "pclmul")
1871 Features["sse"] = Features["sse2"] = Features["pclmul"] = true;
1872 else if (Name == "avx")
1873 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1874 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1875 Features["popcnt"] = Features["avx"] = true;
1876 else if (Name == "avx2")
1877 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1878 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1879 Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
1880 else if (Name == "fma")
1881 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1882 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1883 Features["popcnt"] = Features["avx"] = Features["fma"] = true;
1884 else if (Name == "fma4")
1885 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1886 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1887 Features["popcnt"] = Features["avx"] = Features["sse4a"] =
1888 Features["fma4"] = true;
1889 else if (Name == "xop")
1890 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1891 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1892 Features["popcnt"] = Features["avx"] = Features["sse4a"] =
1893 Features["fma4"] = Features["xop"] = true;
1894 else if (Name == "sse4a")
1895 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1896 Features["sse4a"] = true;
1897 else if (Name == "lzcnt")
1898 Features["lzcnt"] = true;
1899 else if (Name == "rdrnd")
1900 Features["rdrand"] = true;
1901 else if (Name == "bmi")
1902 Features["bmi"] = true;
1903 else if (Name == "bmi2")
1904 Features["bmi2"] = true;
1905 else if (Name == "popcnt")
1906 Features["popcnt"] = true;
1907 } else {
1908 if (Name == "mmx")
1909 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
1910 else if (Name == "sse")
1911 Features["sse"] = Features["sse2"] = Features["sse3"] =
1912 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1913 Features["sse4a"] = Features["avx"] = Features["avx2"] =
1914 Features["fma"] = Features["fma4"] = Features["aes"] =
1915 Features["pclmul"] = Features["xop"] = false;
1916 else if (Name == "sse2")
1917 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
1918 Features["sse41"] = Features["sse42"] = Features["sse4a"] =
1919 Features["avx"] = Features["avx2"] = Features["fma"] =
1920 Features["fma4"] = Features["aes"] = Features["pclmul"] =
1921 Features["xop"] = false;
1922 else if (Name == "sse3")
1923 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
1924 Features["sse42"] = Features["sse4a"] = Features["avx"] =
1925 Features["avx2"] = Features["fma"] = Features["fma4"] =
1926 Features["xop"] = false;
1927 else if (Name == "ssse3")
1928 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
1929 Features["avx"] = Features["avx2"] = Features["fma"] = false;
1930 else if (Name == "sse4" || Name == "sse4.1")
1931 Features["sse41"] = Features["sse42"] = Features["avx"] =
1932 Features["avx2"] = Features["fma"] = false;
1933 else if (Name == "sse4.2")
1934 Features["sse42"] = Features["avx"] = Features["avx2"] =
1935 Features["fma"] = false;
1936 else if (Name == "3dnow")
1937 Features["3dnow"] = Features["3dnowa"] = false;
1938 else if (Name == "3dnowa")
1939 Features["3dnowa"] = false;
1940 else if (Name == "aes")
1941 Features["aes"] = false;
1942 else if (Name == "pclmul")
1943 Features["pclmul"] = false;
1944 else if (Name == "avx")
1945 Features["avx"] = Features["avx2"] = Features["fma"] =
1946 Features["fma4"] = Features["xop"] = false;
1947 else if (Name == "avx2")
1948 Features["avx2"] = false;
1949 else if (Name == "fma")
1950 Features["fma"] = false;
1951 else if (Name == "sse4a")
1952 Features["sse4a"] = Features["fma4"] = Features["xop"] = false;
1953 else if (Name == "lzcnt")
1954 Features["lzcnt"] = false;
1955 else if (Name == "rdrnd")
1956 Features["rdrand"] = false;
1957 else if (Name == "bmi")
1958 Features["bmi"] = false;
1959 else if (Name == "bmi2")
1960 Features["bmi2"] = false;
1961 else if (Name == "popcnt")
1962 Features["popcnt"] = false;
1963 else if (Name == "fma4")
1964 Features["fma4"] = Features["xop"] = false;
1965 else if (Name == "xop")
1966 Features["xop"] = false;
1967 }
1968
1969 return true;
1970 }
1971
1972 /// HandleTargetOptions - Perform initialization based on the user
1973 /// configured set of features.
HandleTargetFeatures(std::vector<std::string> & Features)1974 void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
1975 // Remember the maximum enabled sselevel.
1976 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1977 // Ignore disabled features.
1978 if (Features[i][0] == '-')
1979 continue;
1980
1981 StringRef Feature = StringRef(Features[i]).substr(1);
1982
1983 if (Feature == "aes") {
1984 HasAES = true;
1985 continue;
1986 }
1987
1988 if (Feature == "pclmul") {
1989 HasPCLMUL = true;
1990 continue;
1991 }
1992
1993 if (Feature == "lzcnt") {
1994 HasLZCNT = true;
1995 continue;
1996 }
1997
1998 if (Feature == "rdrand") {
1999 HasRDRND = true;
2000 continue;
2001 }
2002
2003 if (Feature == "bmi") {
2004 HasBMI = true;
2005 continue;
2006 }
2007
2008 if (Feature == "bmi2") {
2009 HasBMI2 = true;
2010 continue;
2011 }
2012
2013 if (Feature == "popcnt") {
2014 HasPOPCNT = true;
2015 continue;
2016 }
2017
2018 if (Feature == "sse4a") {
2019 HasSSE4a = true;
2020 continue;
2021 }
2022
2023 if (Feature == "fma4") {
2024 HasFMA4 = true;
2025 continue;
2026 }
2027
2028 if (Feature == "fma") {
2029 HasFMA = true;
2030 continue;
2031 }
2032
2033 if (Feature == "xop") {
2034 HasXOP = true;
2035 continue;
2036 }
2037
2038 assert(Features[i][0] == '+' && "Invalid target feature!");
2039 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
2040 .Case("avx2", AVX2)
2041 .Case("avx", AVX)
2042 .Case("sse42", SSE42)
2043 .Case("sse41", SSE41)
2044 .Case("ssse3", SSSE3)
2045 .Case("sse3", SSE3)
2046 .Case("sse2", SSE2)
2047 .Case("sse", SSE1)
2048 .Default(NoSSE);
2049 SSELevel = std::max(SSELevel, Level);
2050
2051 MMX3DNowEnum ThreeDNowLevel =
2052 llvm::StringSwitch<MMX3DNowEnum>(Feature)
2053 .Case("3dnowa", AMD3DNowAthlon)
2054 .Case("3dnow", AMD3DNow)
2055 .Case("mmx", MMX)
2056 .Default(NoMMX3DNow);
2057
2058 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
2059 }
2060
2061 // Don't tell the backend if we're turning off mmx; it will end up disabling
2062 // SSE, which we don't want.
2063 std::vector<std::string>::iterator it;
2064 it = std::find(Features.begin(), Features.end(), "-mmx");
2065 if (it != Features.end())
2066 Features.erase(it);
2067 }
2068
2069 /// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2070 /// definitions for this particular subtarget.
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2071 void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
2072 MacroBuilder &Builder) const {
2073 // Target identification.
2074 if (PointerWidth == 64) {
2075 Builder.defineMacro("__amd64__");
2076 Builder.defineMacro("__amd64");
2077 Builder.defineMacro("__x86_64");
2078 Builder.defineMacro("__x86_64__");
2079 } else {
2080 DefineStd(Builder, "i386", Opts);
2081 }
2082
2083 // Subtarget options.
2084 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2085 // truly should be based on -mtune options.
2086 switch (CPU) {
2087 case CK_Generic:
2088 break;
2089 case CK_i386:
2090 // The rest are coming from the i386 define above.
2091 Builder.defineMacro("__tune_i386__");
2092 break;
2093 case CK_i486:
2094 case CK_WinChipC6:
2095 case CK_WinChip2:
2096 case CK_C3:
2097 defineCPUMacros(Builder, "i486");
2098 break;
2099 case CK_PentiumMMX:
2100 Builder.defineMacro("__pentium_mmx__");
2101 Builder.defineMacro("__tune_pentium_mmx__");
2102 // Fallthrough
2103 case CK_i586:
2104 case CK_Pentium:
2105 defineCPUMacros(Builder, "i586");
2106 defineCPUMacros(Builder, "pentium");
2107 break;
2108 case CK_Pentium3:
2109 case CK_Pentium3M:
2110 case CK_PentiumM:
2111 Builder.defineMacro("__tune_pentium3__");
2112 // Fallthrough
2113 case CK_Pentium2:
2114 case CK_C3_2:
2115 Builder.defineMacro("__tune_pentium2__");
2116 // Fallthrough
2117 case CK_PentiumPro:
2118 Builder.defineMacro("__tune_i686__");
2119 Builder.defineMacro("__tune_pentiumpro__");
2120 // Fallthrough
2121 case CK_i686:
2122 Builder.defineMacro("__i686");
2123 Builder.defineMacro("__i686__");
2124 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2125 Builder.defineMacro("__pentiumpro");
2126 Builder.defineMacro("__pentiumpro__");
2127 break;
2128 case CK_Pentium4:
2129 case CK_Pentium4M:
2130 defineCPUMacros(Builder, "pentium4");
2131 break;
2132 case CK_Yonah:
2133 case CK_Prescott:
2134 case CK_Nocona:
2135 defineCPUMacros(Builder, "nocona");
2136 break;
2137 case CK_Core2:
2138 case CK_Penryn:
2139 defineCPUMacros(Builder, "core2");
2140 break;
2141 case CK_Atom:
2142 defineCPUMacros(Builder, "atom");
2143 break;
2144 case CK_Corei7:
2145 case CK_Corei7AVX:
2146 case CK_CoreAVXi:
2147 case CK_CoreAVX2:
2148 defineCPUMacros(Builder, "corei7");
2149 break;
2150 case CK_K6_2:
2151 Builder.defineMacro("__k6_2__");
2152 Builder.defineMacro("__tune_k6_2__");
2153 // Fallthrough
2154 case CK_K6_3:
2155 if (CPU != CK_K6_2) { // In case of fallthrough
2156 // FIXME: GCC may be enabling these in cases where some other k6
2157 // architecture is specified but -m3dnow is explicitly provided. The
2158 // exact semantics need to be determined and emulated here.
2159 Builder.defineMacro("__k6_3__");
2160 Builder.defineMacro("__tune_k6_3__");
2161 }
2162 // Fallthrough
2163 case CK_K6:
2164 defineCPUMacros(Builder, "k6");
2165 break;
2166 case CK_Athlon:
2167 case CK_AthlonThunderbird:
2168 case CK_Athlon4:
2169 case CK_AthlonXP:
2170 case CK_AthlonMP:
2171 defineCPUMacros(Builder, "athlon");
2172 if (SSELevel != NoSSE) {
2173 Builder.defineMacro("__athlon_sse__");
2174 Builder.defineMacro("__tune_athlon_sse__");
2175 }
2176 break;
2177 case CK_K8:
2178 case CK_K8SSE3:
2179 case CK_x86_64:
2180 case CK_Opteron:
2181 case CK_OpteronSSE3:
2182 case CK_Athlon64:
2183 case CK_Athlon64SSE3:
2184 case CK_AthlonFX:
2185 defineCPUMacros(Builder, "k8");
2186 break;
2187 case CK_AMDFAM10:
2188 defineCPUMacros(Builder, "amdfam10");
2189 break;
2190 case CK_BTVER1:
2191 defineCPUMacros(Builder, "btver1");
2192 break;
2193 case CK_BDVER1:
2194 defineCPUMacros(Builder, "bdver1");
2195 break;
2196 case CK_BDVER2:
2197 defineCPUMacros(Builder, "bdver2");
2198 break;
2199 case CK_Geode:
2200 defineCPUMacros(Builder, "geode");
2201 break;
2202 }
2203
2204 // Target properties.
2205 Builder.defineMacro("__LITTLE_ENDIAN__");
2206 Builder.defineMacro("__REGISTER_PREFIX__", "");
2207
2208 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2209 // functions in glibc header files that use FP Stack inline asm which the
2210 // backend can't deal with (PR879).
2211 Builder.defineMacro("__NO_MATH_INLINES");
2212
2213 if (HasAES)
2214 Builder.defineMacro("__AES__");
2215
2216 if (HasPCLMUL)
2217 Builder.defineMacro("__PCLMUL__");
2218
2219 if (HasLZCNT)
2220 Builder.defineMacro("__LZCNT__");
2221
2222 if (HasRDRND)
2223 Builder.defineMacro("__RDRND__");
2224
2225 if (HasBMI)
2226 Builder.defineMacro("__BMI__");
2227
2228 if (HasBMI2)
2229 Builder.defineMacro("__BMI2__");
2230
2231 if (HasPOPCNT)
2232 Builder.defineMacro("__POPCNT__");
2233
2234 if (HasSSE4a)
2235 Builder.defineMacro("__SSE4A__");
2236
2237 if (HasFMA4)
2238 Builder.defineMacro("__FMA4__");
2239
2240 if (HasFMA)
2241 Builder.defineMacro("__FMA__");
2242
2243 if (HasXOP)
2244 Builder.defineMacro("__XOP__");
2245
2246 // Each case falls through to the previous one here.
2247 switch (SSELevel) {
2248 case AVX2:
2249 Builder.defineMacro("__AVX2__");
2250 case AVX:
2251 Builder.defineMacro("__AVX__");
2252 case SSE42:
2253 Builder.defineMacro("__SSE4_2__");
2254 case SSE41:
2255 Builder.defineMacro("__SSE4_1__");
2256 case SSSE3:
2257 Builder.defineMacro("__SSSE3__");
2258 case SSE3:
2259 Builder.defineMacro("__SSE3__");
2260 case SSE2:
2261 Builder.defineMacro("__SSE2__");
2262 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
2263 case SSE1:
2264 Builder.defineMacro("__SSE__");
2265 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
2266 case NoSSE:
2267 break;
2268 }
2269
2270 if (Opts.MicrosoftExt && PointerWidth == 32) {
2271 switch (SSELevel) {
2272 case AVX2:
2273 case AVX:
2274 case SSE42:
2275 case SSE41:
2276 case SSSE3:
2277 case SSE3:
2278 case SSE2:
2279 Builder.defineMacro("_M_IX86_FP", Twine(2));
2280 break;
2281 case SSE1:
2282 Builder.defineMacro("_M_IX86_FP", Twine(1));
2283 break;
2284 default:
2285 Builder.defineMacro("_M_IX86_FP", Twine(0));
2286 }
2287 }
2288
2289 // Each case falls through to the previous one here.
2290 switch (MMX3DNowLevel) {
2291 case AMD3DNowAthlon:
2292 Builder.defineMacro("__3dNOW_A__");
2293 case AMD3DNow:
2294 Builder.defineMacro("__3dNOW__");
2295 case MMX:
2296 Builder.defineMacro("__MMX__");
2297 case NoMMX3DNow:
2298 break;
2299 }
2300 }
2301
hasFeature(StringRef Feature) const2302 bool X86TargetInfo::hasFeature(StringRef Feature) const {
2303 return llvm::StringSwitch<bool>(Feature)
2304 .Case("aes", HasAES)
2305 .Case("avx", SSELevel >= AVX)
2306 .Case("avx2", SSELevel >= AVX2)
2307 .Case("bmi", HasBMI)
2308 .Case("bmi2", HasBMI2)
2309 .Case("fma", HasFMA)
2310 .Case("fma4", HasFMA4)
2311 .Case("lzcnt", HasLZCNT)
2312 .Case("rdrnd", HasRDRND)
2313 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2314 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2315 .Case("mmx", MMX3DNowLevel >= MMX)
2316 .Case("pclmul", HasPCLMUL)
2317 .Case("popcnt", HasPOPCNT)
2318 .Case("sse", SSELevel >= SSE1)
2319 .Case("sse2", SSELevel >= SSE2)
2320 .Case("sse3", SSELevel >= SSE3)
2321 .Case("ssse3", SSELevel >= SSSE3)
2322 .Case("sse41", SSELevel >= SSE41)
2323 .Case("sse42", SSELevel >= SSE42)
2324 .Case("sse4a", HasSSE4a)
2325 .Case("x86", true)
2326 .Case("x86_32", PointerWidth == 32)
2327 .Case("x86_64", PointerWidth == 64)
2328 .Case("xop", HasXOP)
2329 .Default(false);
2330 }
2331
2332 bool
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info) const2333 X86TargetInfo::validateAsmConstraint(const char *&Name,
2334 TargetInfo::ConstraintInfo &Info) const {
2335 switch (*Name) {
2336 default: return false;
2337 case 'Y': // first letter of a pair:
2338 switch (*(Name+1)) {
2339 default: return false;
2340 case '0': // First SSE register.
2341 case 't': // Any SSE register, when SSE2 is enabled.
2342 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2343 case 'm': // any MMX register, when inter-unit moves enabled.
2344 break; // falls through to setAllowsRegister.
2345 }
2346 case 'a': // eax.
2347 case 'b': // ebx.
2348 case 'c': // ecx.
2349 case 'd': // edx.
2350 case 'S': // esi.
2351 case 'D': // edi.
2352 case 'A': // edx:eax.
2353 case 'f': // any x87 floating point stack register.
2354 case 't': // top of floating point stack.
2355 case 'u': // second from top of floating point stack.
2356 case 'q': // Any register accessible as [r]l: a, b, c, and d.
2357 case 'y': // Any MMX register.
2358 case 'x': // Any SSE register.
2359 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
2360 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2361 case 'l': // "Index" registers: any general register that can be used as an
2362 // index in a base+index memory access.
2363 Info.setAllowsRegister();
2364 return true;
2365 case 'C': // SSE floating point constant.
2366 case 'G': // x87 floating point constant.
2367 case 'e': // 32-bit signed integer constant for use with zero-extending
2368 // x86_64 instructions.
2369 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
2370 // x86_64 instructions.
2371 return true;
2372 }
2373 }
2374
2375
2376 std::string
convertConstraint(const char * & Constraint) const2377 X86TargetInfo::convertConstraint(const char *&Constraint) const {
2378 switch (*Constraint) {
2379 case 'a': return std::string("{ax}");
2380 case 'b': return std::string("{bx}");
2381 case 'c': return std::string("{cx}");
2382 case 'd': return std::string("{dx}");
2383 case 'S': return std::string("{si}");
2384 case 'D': return std::string("{di}");
2385 case 'p': // address
2386 return std::string("im");
2387 case 't': // top of floating point stack.
2388 return std::string("{st}");
2389 case 'u': // second from top of floating point stack.
2390 return std::string("{st(1)}"); // second from top of floating point stack.
2391 default:
2392 return std::string(1, *Constraint);
2393 }
2394 }
2395 } // end anonymous namespace
2396
2397 namespace {
2398 // X86-32 generic target
2399 class X86_32TargetInfo : public X86TargetInfo {
2400 public:
X86_32TargetInfo(const std::string & triple)2401 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2402 DoubleAlign = LongLongAlign = 32;
2403 LongDoubleWidth = 96;
2404 LongDoubleAlign = 32;
2405 SuitableAlign = 128;
2406 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2407 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
2408 "a0:0:64-f80:32:32-n8:16:32-S128";
2409 SizeType = UnsignedInt;
2410 PtrDiffType = SignedInt;
2411 IntPtrType = SignedInt;
2412 RegParmMax = 3;
2413
2414 // Use fpret for all types.
2415 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2416 (1 << TargetInfo::Double) |
2417 (1 << TargetInfo::LongDouble));
2418
2419 // x86-32 has atomics up to 8 bytes
2420 // FIXME: Check that we actually have cmpxchg8b before setting
2421 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2422 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
2423 }
getBuiltinVaListKind() const2424 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2425 return TargetInfo::CharPtrBuiltinVaList;
2426 }
2427
getEHDataRegisterNumber(unsigned RegNo) const2428 int getEHDataRegisterNumber(unsigned RegNo) const {
2429 if (RegNo == 0) return 0;
2430 if (RegNo == 1) return 2;
2431 return -1;
2432 }
2433 };
2434 } // end anonymous namespace
2435
2436 namespace {
2437 class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2438 public:
NetBSDI386TargetInfo(const std::string & triple)2439 NetBSDI386TargetInfo(const std::string &triple) :
2440 NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2441 }
2442
getFloatEvalMethod() const2443 virtual unsigned getFloatEvalMethod() const {
2444 // NetBSD defaults to "double" rounding
2445 return 1;
2446 }
2447 };
2448 } // end anonymous namespace
2449
2450 namespace {
2451 class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2452 public:
OpenBSDI386TargetInfo(const std::string & triple)2453 OpenBSDI386TargetInfo(const std::string& triple) :
2454 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2455 SizeType = UnsignedLong;
2456 IntPtrType = SignedLong;
2457 PtrDiffType = SignedLong;
2458 }
2459 };
2460 } // end anonymous namespace
2461
2462 namespace {
2463 class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
2464 public:
BitrigI386TargetInfo(const std::string & triple)2465 BitrigI386TargetInfo(const std::string& triple) :
2466 BitrigTargetInfo<X86_32TargetInfo>(triple) {
2467 SizeType = UnsignedLong;
2468 IntPtrType = SignedLong;
2469 PtrDiffType = SignedLong;
2470 }
2471 };
2472 } // end anonymous namespace
2473
2474 namespace {
2475 class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
2476 public:
DarwinI386TargetInfo(const std::string & triple)2477 DarwinI386TargetInfo(const std::string& triple) :
2478 DarwinTargetInfo<X86_32TargetInfo>(triple) {
2479 LongDoubleWidth = 128;
2480 LongDoubleAlign = 128;
2481 SuitableAlign = 128;
2482 MaxVectorAlign = 256;
2483 SizeType = UnsignedLong;
2484 IntPtrType = SignedLong;
2485 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2486 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
2487 "a0:0:64-f80:128:128-n8:16:32-S128";
2488 HasAlignMac68kSupport = true;
2489 }
2490
2491 };
2492 } // end anonymous namespace
2493
2494 namespace {
2495 // x86-32 Windows target
2496 class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
2497 public:
WindowsX86_32TargetInfo(const std::string & triple)2498 WindowsX86_32TargetInfo(const std::string& triple)
2499 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
2500 TLSSupported = false;
2501 WCharType = UnsignedShort;
2502 DoubleAlign = LongLongAlign = 64;
2503 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2504 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
2505 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
2506 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2507 virtual void getTargetDefines(const LangOptions &Opts,
2508 MacroBuilder &Builder) const {
2509 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2510 }
2511 };
2512 } // end anonymous namespace
2513
2514 namespace {
2515
2516 // x86-32 Windows Visual Studio target
2517 class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2518 public:
VisualStudioWindowsX86_32TargetInfo(const std::string & triple)2519 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2520 : WindowsX86_32TargetInfo(triple) {
2521 LongDoubleWidth = LongDoubleAlign = 64;
2522 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2523 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2524 virtual void getTargetDefines(const LangOptions &Opts,
2525 MacroBuilder &Builder) const {
2526 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2527 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2528 // The value of the following reflects processor type.
2529 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2530 // We lost the original triple, so we use the default.
2531 Builder.defineMacro("_M_IX86", "600");
2532 }
2533 };
2534 } // end anonymous namespace
2535
2536 namespace {
2537 // x86-32 MinGW target
2538 class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2539 public:
MinGWX86_32TargetInfo(const std::string & triple)2540 MinGWX86_32TargetInfo(const std::string& triple)
2541 : WindowsX86_32TargetInfo(triple) {
2542 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2543 virtual void getTargetDefines(const LangOptions &Opts,
2544 MacroBuilder &Builder) const {
2545 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2546 DefineStd(Builder, "WIN32", Opts);
2547 DefineStd(Builder, "WINNT", Opts);
2548 Builder.defineMacro("_X86_");
2549 Builder.defineMacro("__MSVCRT__");
2550 Builder.defineMacro("__MINGW32__");
2551
2552 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2553 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
2554 if (Opts.MicrosoftExt)
2555 // Provide "as-is" __declspec.
2556 Builder.defineMacro("__declspec", "__declspec");
2557 else
2558 // Provide alias of __attribute__ like mingw32-gcc.
2559 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
2560 }
2561 };
2562 } // end anonymous namespace
2563
2564 namespace {
2565 // x86-32 Cygwin target
2566 class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2567 public:
CygwinX86_32TargetInfo(const std::string & triple)2568 CygwinX86_32TargetInfo(const std::string& triple)
2569 : X86_32TargetInfo(triple) {
2570 TLSSupported = false;
2571 WCharType = UnsignedShort;
2572 DoubleAlign = LongLongAlign = 64;
2573 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2574 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
2575 "a0:0:64-f80:32:32-n8:16:32-S32";
2576 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2577 virtual void getTargetDefines(const LangOptions &Opts,
2578 MacroBuilder &Builder) const {
2579 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2580 Builder.defineMacro("__CYGWIN__");
2581 Builder.defineMacro("__CYGWIN32__");
2582 DefineStd(Builder, "unix", Opts);
2583 if (Opts.CPlusPlus)
2584 Builder.defineMacro("_GNU_SOURCE");
2585 }
2586 };
2587 } // end anonymous namespace
2588
2589 namespace {
2590 // x86-32 Haiku target
2591 class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2592 public:
HaikuX86_32TargetInfo(const std::string & triple)2593 HaikuX86_32TargetInfo(const std::string& triple)
2594 : X86_32TargetInfo(triple) {
2595 SizeType = UnsignedLong;
2596 IntPtrType = SignedLong;
2597 PtrDiffType = SignedLong;
2598 this->UserLabelPrefix = "";
2599 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2600 virtual void getTargetDefines(const LangOptions &Opts,
2601 MacroBuilder &Builder) const {
2602 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2603 Builder.defineMacro("__INTEL__");
2604 Builder.defineMacro("__HAIKU__");
2605 }
2606 };
2607 } // end anonymous namespace
2608
2609 // RTEMS Target
2610 template<typename Target>
2611 class RTEMSTargetInfo : public OSTargetInfo<Target> {
2612 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const2613 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2614 MacroBuilder &Builder) const {
2615 // RTEMS defines; list based off of gcc output
2616
2617 Builder.defineMacro("__rtems__");
2618 Builder.defineMacro("__ELF__");
2619 }
2620 public:
RTEMSTargetInfo(const std::string & triple)2621 RTEMSTargetInfo(const std::string &triple)
2622 : OSTargetInfo<Target>(triple) {
2623 this->UserLabelPrefix = "";
2624
2625 llvm::Triple Triple(triple);
2626 switch (Triple.getArch()) {
2627 default:
2628 case llvm::Triple::x86:
2629 // this->MCountName = ".mcount";
2630 break;
2631 case llvm::Triple::mips:
2632 case llvm::Triple::mipsel:
2633 case llvm::Triple::ppc:
2634 case llvm::Triple::ppc64:
2635 // this->MCountName = "_mcount";
2636 break;
2637 case llvm::Triple::arm:
2638 // this->MCountName = "__mcount";
2639 break;
2640 }
2641
2642 }
2643 };
2644
2645 namespace {
2646 // x86-32 RTEMS target
2647 class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
2648 public:
RTEMSX86_32TargetInfo(const std::string & triple)2649 RTEMSX86_32TargetInfo(const std::string& triple)
2650 : X86_32TargetInfo(triple) {
2651 SizeType = UnsignedLong;
2652 IntPtrType = SignedLong;
2653 PtrDiffType = SignedLong;
2654 this->UserLabelPrefix = "";
2655 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2656 virtual void getTargetDefines(const LangOptions &Opts,
2657 MacroBuilder &Builder) const {
2658 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2659 Builder.defineMacro("__INTEL__");
2660 Builder.defineMacro("__rtems__");
2661 }
2662 };
2663 } // end anonymous namespace
2664
2665 namespace {
2666 // x86-64 generic target
2667 class X86_64TargetInfo : public X86TargetInfo {
2668 public:
X86_64TargetInfo(const std::string & triple)2669 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
2670 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
2671 LongDoubleWidth = 128;
2672 LongDoubleAlign = 128;
2673 LargeArrayMinWidth = 128;
2674 LargeArrayAlign = 128;
2675 SuitableAlign = 128;
2676 IntMaxType = SignedLong;
2677 UIntMaxType = UnsignedLong;
2678 Int64Type = SignedLong;
2679 RegParmMax = 6;
2680
2681 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2682 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
2683 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
2684
2685 // Use fpret only for long double.
2686 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
2687
2688 // Use fp2ret for _Complex long double.
2689 ComplexLongDoubleUsesFP2Ret = true;
2690
2691 // x86-64 has atomics up to 16 bytes.
2692 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
2693 // on CPUs with cmpxchg16b
2694 MaxAtomicPromoteWidth = 128;
2695 MaxAtomicInlineWidth = 64;
2696 }
getBuiltinVaListKind() const2697 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2698 return TargetInfo::X86_64ABIBuiltinVaList;
2699 }
2700
getEHDataRegisterNumber(unsigned RegNo) const2701 int getEHDataRegisterNumber(unsigned RegNo) const {
2702 if (RegNo == 0) return 0;
2703 if (RegNo == 1) return 1;
2704 return -1;
2705 }
2706 };
2707 } // end anonymous namespace
2708
2709 namespace {
2710 // x86-64 Windows target
2711 class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
2712 public:
WindowsX86_64TargetInfo(const std::string & triple)2713 WindowsX86_64TargetInfo(const std::string& triple)
2714 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
2715 TLSSupported = false;
2716 WCharType = UnsignedShort;
2717 LongWidth = LongAlign = 32;
2718 DoubleAlign = LongLongAlign = 64;
2719 IntMaxType = SignedLongLong;
2720 UIntMaxType = UnsignedLongLong;
2721 Int64Type = SignedLongLong;
2722 SizeType = UnsignedLongLong;
2723 PtrDiffType = SignedLongLong;
2724 IntPtrType = SignedLongLong;
2725 this->UserLabelPrefix = "";
2726 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2727 virtual void getTargetDefines(const LangOptions &Opts,
2728 MacroBuilder &Builder) const {
2729 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
2730 Builder.defineMacro("_WIN64");
2731 }
getBuiltinVaListKind() const2732 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2733 return TargetInfo::CharPtrBuiltinVaList;
2734 }
2735 };
2736 } // end anonymous namespace
2737
2738 namespace {
2739 // x86-64 Windows Visual Studio target
2740 class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
2741 public:
VisualStudioWindowsX86_64TargetInfo(const std::string & triple)2742 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
2743 : WindowsX86_64TargetInfo(triple) {
2744 LongDoubleWidth = LongDoubleAlign = 64;
2745 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2746 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2747 virtual void getTargetDefines(const LangOptions &Opts,
2748 MacroBuilder &Builder) const {
2749 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2750 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
2751 Builder.defineMacro("_M_X64");
2752 Builder.defineMacro("_M_AMD64");
2753 }
2754 };
2755 } // end anonymous namespace
2756
2757 namespace {
2758 // x86-64 MinGW target
2759 class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
2760 public:
MinGWX86_64TargetInfo(const std::string & triple)2761 MinGWX86_64TargetInfo(const std::string& triple)
2762 : WindowsX86_64TargetInfo(triple) {
2763 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const2764 virtual void getTargetDefines(const LangOptions &Opts,
2765 MacroBuilder &Builder) const {
2766 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2767 DefineStd(Builder, "WIN64", Opts);
2768 Builder.defineMacro("__MSVCRT__");
2769 Builder.defineMacro("__MINGW32__");
2770 Builder.defineMacro("__MINGW64__");
2771
2772 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2773 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
2774 if (Opts.MicrosoftExt)
2775 // Provide "as-is" __declspec.
2776 Builder.defineMacro("__declspec", "__declspec");
2777 else
2778 // Provide alias of __attribute__ like mingw32-gcc.
2779 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
2780 }
2781 };
2782 } // end anonymous namespace
2783
2784 namespace {
2785 class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
2786 public:
DarwinX86_64TargetInfo(const std::string & triple)2787 DarwinX86_64TargetInfo(const std::string& triple)
2788 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
2789 Int64Type = SignedLongLong;
2790 MaxVectorAlign = 256;
2791 }
2792 };
2793 } // end anonymous namespace
2794
2795 namespace {
2796 class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
2797 public:
OpenBSDX86_64TargetInfo(const std::string & triple)2798 OpenBSDX86_64TargetInfo(const std::string& triple)
2799 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
2800 IntMaxType = SignedLongLong;
2801 UIntMaxType = UnsignedLongLong;
2802 Int64Type = SignedLongLong;
2803 }
2804 };
2805 } // end anonymous namespace
2806
2807 namespace {
2808 class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
2809 public:
BitrigX86_64TargetInfo(const std::string & triple)2810 BitrigX86_64TargetInfo(const std::string& triple)
2811 : BitrigTargetInfo<X86_64TargetInfo>(triple) {
2812 IntMaxType = SignedLongLong;
2813 UIntMaxType = UnsignedLongLong;
2814 Int64Type = SignedLongLong;
2815 }
2816 };
2817 } // end anonymous namespace
2818
2819 namespace {
2820 class ARMTargetInfo : public TargetInfo {
2821 // Possible FPU choices.
2822 enum FPUMode {
2823 NoFPU,
2824 VFP2FPU,
2825 VFP3FPU,
2826 NeonFPU
2827 };
2828
FPUModeIsVFP(FPUMode Mode)2829 static bool FPUModeIsVFP(FPUMode Mode) {
2830 return Mode >= VFP2FPU && Mode <= NeonFPU;
2831 }
2832
2833 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2834 static const char * const GCCRegNames[];
2835
2836 std::string ABI, CPU;
2837
2838 unsigned FPU : 3;
2839
2840 unsigned IsThumb : 1;
2841
2842 // Initialized via features.
2843 unsigned SoftFloat : 1;
2844 unsigned SoftFloatABI : 1;
2845
2846 static const Builtin::Info BuiltinInfo[];
2847
2848 public:
ARMTargetInfo(const std::string & TripleStr)2849 ARMTargetInfo(const std::string &TripleStr)
2850 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
2851 {
2852 BigEndian = false;
2853 SizeType = UnsignedInt;
2854 PtrDiffType = SignedInt;
2855 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
2856 WCharType = UnsignedInt;
2857
2858 // {} in inline assembly are neon specifiers, not assembly variant
2859 // specifiers.
2860 NoAsmVariants = true;
2861
2862 // FIXME: Should we just treat this as a feature?
2863 IsThumb = getTriple().getArchName().startswith("thumb");
2864 if (IsThumb) {
2865 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2866 // so set preferred for small types to 32.
2867 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2868 "i64:64:64-f32:32:32-f64:64:64-"
2869 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
2870 } else {
2871 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2872 "i64:64:64-f32:32:32-f64:64:64-"
2873 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
2874 }
2875
2876 // ARM targets default to using the ARM C++ ABI.
2877 CXXABI = CXXABI_ARM;
2878
2879 // ARM has atomics up to 8 bytes
2880 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
2881 MaxAtomicPromoteWidth = 64;
2882
2883 // Do force alignment of members that follow zero length bitfields. If
2884 // the alignment of the zero-length bitfield is greater than the member
2885 // that follows it, `bar', `bar' will be aligned as the type of the
2886 // zero length bitfield.
2887 UseZeroLengthBitfieldAlignment = true;
2888 }
getABI() const2889 virtual const char *getABI() const { return ABI.c_str(); }
setABI(const std::string & Name)2890 virtual bool setABI(const std::string &Name) {
2891 ABI = Name;
2892
2893 // The defaults (above) are for AAPCS, check if we need to change them.
2894 //
2895 // FIXME: We need support for -meabi... we could just mangle it into the
2896 // name.
2897 if (Name == "apcs-gnu") {
2898 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
2899 SizeType = UnsignedLong;
2900
2901 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
2902 WCharType = SignedInt;
2903
2904 // Do not respect the alignment of bit-field types when laying out
2905 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
2906 UseBitFieldTypeAlignment = false;
2907
2908 /// gcc forces the alignment to 4 bytes, regardless of the type of the
2909 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
2910 /// gcc.
2911 ZeroLengthBitfieldBoundary = 32;
2912
2913 if (IsThumb) {
2914 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2915 // so set preferred for small types to 32.
2916 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2917 "i64:32:64-f32:32:32-f64:32:64-"
2918 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
2919 } else {
2920 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2921 "i64:32:64-f32:32:32-f64:32:64-"
2922 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
2923 }
2924
2925 // FIXME: Override "preferred align" for double and long long.
2926 } else if (Name == "aapcs") {
2927 // FIXME: Enumerated types are variable width in straight AAPCS.
2928 } else if (Name == "aapcs-linux") {
2929 ;
2930 } else
2931 return false;
2932
2933 return true;
2934 }
2935
getDefaultFeatures(llvm::StringMap<bool> & Features) const2936 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
2937 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
2938 Features["vfp2"] = true;
2939 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
2940 Features["neon"] = true;
2941 }
2942
setFeatureEnabled(llvm::StringMap<bool> & Features,StringRef Name,bool Enabled) const2943 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2944 StringRef Name,
2945 bool Enabled) const {
2946 if (Name == "soft-float" || Name == "soft-float-abi" ||
2947 Name == "vfp2" || Name == "vfp3" || Name == "neon" || Name == "d16" ||
2948 Name == "neonfp" || Name == "long64") {
2949 Features[Name] = Enabled;
2950 } else
2951 return false;
2952
2953 return true;
2954 }
2955
HandleTargetFeatures(std::vector<std::string> & Features)2956 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2957 FPU = NoFPU;
2958 SoftFloat = SoftFloatABI = false;
2959 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2960 if (Features[i] == "+soft-float")
2961 SoftFloat = true;
2962 else if (Features[i] == "+soft-float-abi")
2963 SoftFloatABI = true;
2964 else if (Features[i] == "+vfp2")
2965 FPU = VFP2FPU;
2966 else if (Features[i] == "+vfp3")
2967 FPU = VFP3FPU;
2968 else if (Features[i] == "+neon")
2969 FPU = NeonFPU;
2970 else if (Features[i] == "+long64")
2971 LongWidth = LongAlign = 64; // RenderScript uses a 64-bit long type
2972 }
2973
2974 // Remove front-end specific options which the backend handles differently.
2975 std::vector<std::string>::iterator it;
2976 it = std::find(Features.begin(), Features.end(), "+soft-float");
2977 if (it != Features.end())
2978 Features.erase(it);
2979 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2980 if (it != Features.end())
2981 Features.erase(it);
2982 }
2983
hasFeature(StringRef Feature) const2984 virtual bool hasFeature(StringRef Feature) const {
2985 return llvm::StringSwitch<bool>(Feature)
2986 .Case("arm", true)
2987 .Case("softfloat", SoftFloat)
2988 .Case("thumb", IsThumb)
2989 .Case("neon", FPU == NeonFPU && !SoftFloat &&
2990 StringRef(getCPUDefineSuffix(CPU)).startswith("7"))
2991 .Default(false);
2992 }
2993 // FIXME: Should we actually have some table instead of these switches?
getCPUDefineSuffix(StringRef Name)2994 static const char *getCPUDefineSuffix(StringRef Name) {
2995 return llvm::StringSwitch<const char*>(Name)
2996 .Cases("arm8", "arm810", "4")
2997 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2998 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2999 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3000 .Case("ep9312", "4T")
3001 .Cases("arm10tdmi", "arm1020t", "5T")
3002 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3003 .Case("arm926ej-s", "5TEJ")
3004 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3005 .Cases("xscale", "iwmmxt", "5TE")
3006 .Case("arm1136j-s", "6J")
3007 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
3008 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
3009 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
3010 .Cases("cortex-a8", "cortex-a9", "7A")
3011 .Cases("cortex-m3", "cortex-m4", "7M")
3012 .Case("cortex-m0", "6M")
3013 .Default(0);
3014 }
getCPUProfile(StringRef Name)3015 static const char *getCPUProfile(StringRef Name) {
3016 return llvm::StringSwitch<const char*>(Name)
3017 .Cases("cortex-a8", "cortex-a9", "A")
3018 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
3019 .Default("");
3020 }
setCPU(const std::string & Name)3021 virtual bool setCPU(const std::string &Name) {
3022 if (!getCPUDefineSuffix(Name))
3023 return false;
3024
3025 CPU = Name;
3026 return true;
3027 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3028 virtual void getTargetDefines(const LangOptions &Opts,
3029 MacroBuilder &Builder) const {
3030 // Target identification.
3031 Builder.defineMacro("__arm");
3032 Builder.defineMacro("__arm__");
3033
3034 // Target properties.
3035 Builder.defineMacro("__ARMEL__");
3036 Builder.defineMacro("__LITTLE_ENDIAN__");
3037 Builder.defineMacro("__REGISTER_PREFIX__", "");
3038
3039 StringRef CPUArch = getCPUDefineSuffix(CPU);
3040 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
3041 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3042 StringRef CPUProfile = getCPUProfile(CPU);
3043 if (!CPUProfile.empty())
3044 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3045
3046 // Subtarget options.
3047
3048 // FIXME: It's more complicated than this and we don't really support
3049 // interworking.
3050 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
3051 Builder.defineMacro("__THUMB_INTERWORK__");
3052
3053 if (ABI == "aapcs" || ABI == "aapcs-linux") {
3054 Builder.defineMacro("__ARM_EABI__");
3055 Builder.defineMacro("__ARM_PCS", "1");
3056
3057 if (!SoftFloat && !SoftFloatABI)
3058 Builder.defineMacro("__ARM_PCS_VFP", "1");
3059 }
3060
3061 if (SoftFloat)
3062 Builder.defineMacro("__SOFTFP__");
3063
3064 if (CPU == "xscale")
3065 Builder.defineMacro("__XSCALE__");
3066
3067 bool IsARMv7 = CPUArch.startswith("7");
3068 if (IsThumb) {
3069 Builder.defineMacro("__THUMBEL__");
3070 Builder.defineMacro("__thumb__");
3071 if (CPUArch == "6T2" || IsARMv7)
3072 Builder.defineMacro("__thumb2__");
3073 }
3074
3075 // Note, this is always on in gcc, even though it doesn't make sense.
3076 Builder.defineMacro("__APCS_32__");
3077
3078 if (FPUModeIsVFP((FPUMode) FPU))
3079 Builder.defineMacro("__VFP_FP__");
3080
3081 // This only gets set when Neon instructions are actually available, unlike
3082 // the VFP define, hence the soft float and arch check. This is subtly
3083 // different from gcc, we follow the intent which was that it should be set
3084 // when Neon instructions are actually available.
3085 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
3086 Builder.defineMacro("__ARM_NEON__");
3087 }
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const3088 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3089 unsigned &NumRecords) const {
3090 Records = BuiltinInfo;
3091 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
3092 }
isCLZForZeroUndef() const3093 virtual bool isCLZForZeroUndef() const { return false; }
getBuiltinVaListKind() const3094 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3095 return TargetInfo::VoidPtrBuiltinVaList;
3096 }
3097 virtual void getGCCRegNames(const char * const *&Names,
3098 unsigned &NumNames) const;
3099 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3100 unsigned &NumAliases) const;
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info) const3101 virtual bool validateAsmConstraint(const char *&Name,
3102 TargetInfo::ConstraintInfo &Info) const {
3103 switch (*Name) {
3104 default: break;
3105 case 'l': // r0-r7
3106 case 'h': // r8-r15
3107 case 'w': // VFP Floating point register single precision
3108 case 'P': // VFP Floating point register double precision
3109 Info.setAllowsRegister();
3110 return true;
3111 case 'Q': // A memory address that is a single base register.
3112 Info.setAllowsMemory();
3113 return true;
3114 case 'U': // a memory reference...
3115 switch (Name[1]) {
3116 case 'q': // ...ARMV4 ldrsb
3117 case 'v': // ...VFP load/store (reg+constant offset)
3118 case 'y': // ...iWMMXt load/store
3119 case 't': // address valid for load/store opaque types wider
3120 // than 128-bits
3121 case 'n': // valid address for Neon doubleword vector load/store
3122 case 'm': // valid address for Neon element and structure load/store
3123 case 's': // valid address for non-offset loads/stores of quad-word
3124 // values in four ARM registers
3125 Info.setAllowsMemory();
3126 Name++;
3127 return true;
3128 }
3129 }
3130 return false;
3131 }
convertConstraint(const char * & Constraint) const3132 virtual std::string convertConstraint(const char *&Constraint) const {
3133 std::string R;
3134 switch (*Constraint) {
3135 case 'U': // Two-character constraint; add "^" hint for later parsing.
3136 R = std::string("^") + std::string(Constraint, 2);
3137 Constraint++;
3138 break;
3139 case 'p': // 'p' should be translated to 'r' by default.
3140 R = std::string("r");
3141 break;
3142 default:
3143 return std::string(1, *Constraint);
3144 }
3145 return R;
3146 }
getClobbers() const3147 virtual const char *getClobbers() const {
3148 // FIXME: Is this really right?
3149 return "";
3150 }
3151 };
3152
3153 const char * const ARMTargetInfo::GCCRegNames[] = {
3154 // Integer registers
3155 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3156 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
3157
3158 // Float registers
3159 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3160 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3161 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3162 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3163
3164 // Double registers
3165 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3166 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3167 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3168 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3169
3170 // Quad registers
3171 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3172 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
3173 };
3174
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const3175 void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
3176 unsigned &NumNames) const {
3177 Names = GCCRegNames;
3178 NumNames = llvm::array_lengthof(GCCRegNames);
3179 }
3180
3181 const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
3182 { { "a1" }, "r0" },
3183 { { "a2" }, "r1" },
3184 { { "a3" }, "r2" },
3185 { { "a4" }, "r3" },
3186 { { "v1" }, "r4" },
3187 { { "v2" }, "r5" },
3188 { { "v3" }, "r6" },
3189 { { "v4" }, "r7" },
3190 { { "v5" }, "r8" },
3191 { { "v6", "rfp" }, "r9" },
3192 { { "sl" }, "r10" },
3193 { { "fp" }, "r11" },
3194 { { "ip" }, "r12" },
3195 { { "r13" }, "sp" },
3196 { { "r14" }, "lr" },
3197 { { "r15" }, "pc" },
3198 // The S, D and Q registers overlap, but aren't really aliases; we
3199 // don't want to substitute one of these for a different-sized one.
3200 };
3201
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const3202 void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3203 unsigned &NumAliases) const {
3204 Aliases = GCCRegAliases;
3205 NumAliases = llvm::array_lengthof(GCCRegAliases);
3206 }
3207
3208 const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
3209 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3210 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3211 ALL_LANGUAGES },
3212 #include "clang/Basic/BuiltinsARM.def"
3213 };
3214 } // end anonymous namespace.
3215
3216 namespace {
3217 class DarwinARMTargetInfo :
3218 public DarwinTargetInfo<ARMTargetInfo> {
3219 protected:
getOSDefines(const LangOptions & Opts,const llvm::Triple & Triple,MacroBuilder & Builder) const3220 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3221 MacroBuilder &Builder) const {
3222 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
3223 }
3224
3225 public:
DarwinARMTargetInfo(const std::string & triple)3226 DarwinARMTargetInfo(const std::string& triple)
3227 : DarwinTargetInfo<ARMTargetInfo>(triple) {
3228 HasAlignMac68kSupport = true;
3229 // iOS always has 64-bit atomic instructions.
3230 // FIXME: This should be based off of the target features in ARMTargetInfo.
3231 MaxAtomicInlineWidth = 64;
3232 }
3233 };
3234 } // end anonymous namespace.
3235
3236
3237 namespace {
3238 // Hexagon abstract base class
3239 class HexagonTargetInfo : public TargetInfo {
3240 static const Builtin::Info BuiltinInfo[];
3241 static const char * const GCCRegNames[];
3242 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3243 std::string CPU;
3244 public:
HexagonTargetInfo(const std::string & triple)3245 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) {
3246 BigEndian = false;
3247 DescriptionString = ("e-p:32:32:32-"
3248 "i64:64:64-i32:32:32-i16:16:16-i1:32:32"
3249 "f64:64:64-f32:32:32-a0:0-n32");
3250
3251 // {} in inline assembly are packet specifiers, not assembly variant
3252 // specifiers.
3253 NoAsmVariants = true;
3254 }
3255
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const3256 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3257 unsigned &NumRecords) const {
3258 Records = BuiltinInfo;
3259 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
3260 }
3261
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info) const3262 virtual bool validateAsmConstraint(const char *&Name,
3263 TargetInfo::ConstraintInfo &Info) const {
3264 return true;
3265 }
3266
3267 virtual void getTargetDefines(const LangOptions &Opts,
3268 MacroBuilder &Builder) const;
3269
hasFeature(StringRef Feature) const3270 virtual bool hasFeature(StringRef Feature) const {
3271 return Feature == "hexagon";
3272 }
3273
getBuiltinVaListKind() const3274 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3275 return TargetInfo::CharPtrBuiltinVaList;
3276 }
3277 virtual void getGCCRegNames(const char * const *&Names,
3278 unsigned &NumNames) const;
3279 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3280 unsigned &NumAliases) const;
getClobbers() const3281 virtual const char *getClobbers() const {
3282 return "";
3283 }
3284
getHexagonCPUSuffix(StringRef Name)3285 static const char *getHexagonCPUSuffix(StringRef Name) {
3286 return llvm::StringSwitch<const char*>(Name)
3287 .Case("hexagonv2", "2")
3288 .Case("hexagonv3", "3")
3289 .Case("hexagonv4", "4")
3290 .Case("hexagonv5", "5")
3291 .Default(0);
3292 }
3293
setCPU(const std::string & Name)3294 virtual bool setCPU(const std::string &Name) {
3295 if (!getHexagonCPUSuffix(Name))
3296 return false;
3297
3298 CPU = Name;
3299 return true;
3300 }
3301 };
3302
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3303 void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
3304 MacroBuilder &Builder) const {
3305 Builder.defineMacro("qdsp6");
3306 Builder.defineMacro("__qdsp6", "1");
3307 Builder.defineMacro("__qdsp6__", "1");
3308
3309 Builder.defineMacro("hexagon");
3310 Builder.defineMacro("__hexagon", "1");
3311 Builder.defineMacro("__hexagon__", "1");
3312
3313 if(CPU == "hexagonv1") {
3314 Builder.defineMacro("__HEXAGON_V1__");
3315 Builder.defineMacro("__HEXAGON_ARCH__", "1");
3316 if(Opts.HexagonQdsp6Compat) {
3317 Builder.defineMacro("__QDSP6_V1__");
3318 Builder.defineMacro("__QDSP6_ARCH__", "1");
3319 }
3320 }
3321 else if(CPU == "hexagonv2") {
3322 Builder.defineMacro("__HEXAGON_V2__");
3323 Builder.defineMacro("__HEXAGON_ARCH__", "2");
3324 if(Opts.HexagonQdsp6Compat) {
3325 Builder.defineMacro("__QDSP6_V2__");
3326 Builder.defineMacro("__QDSP6_ARCH__", "2");
3327 }
3328 }
3329 else if(CPU == "hexagonv3") {
3330 Builder.defineMacro("__HEXAGON_V3__");
3331 Builder.defineMacro("__HEXAGON_ARCH__", "3");
3332 if(Opts.HexagonQdsp6Compat) {
3333 Builder.defineMacro("__QDSP6_V3__");
3334 Builder.defineMacro("__QDSP6_ARCH__", "3");
3335 }
3336 }
3337 else if(CPU == "hexagonv4") {
3338 Builder.defineMacro("__HEXAGON_V4__");
3339 Builder.defineMacro("__HEXAGON_ARCH__", "4");
3340 if(Opts.HexagonQdsp6Compat) {
3341 Builder.defineMacro("__QDSP6_V4__");
3342 Builder.defineMacro("__QDSP6_ARCH__", "4");
3343 }
3344 }
3345 else if(CPU == "hexagonv5") {
3346 Builder.defineMacro("__HEXAGON_V5__");
3347 Builder.defineMacro("__HEXAGON_ARCH__", "5");
3348 if(Opts.HexagonQdsp6Compat) {
3349 Builder.defineMacro("__QDSP6_V5__");
3350 Builder.defineMacro("__QDSP6_ARCH__", "5");
3351 }
3352 }
3353 }
3354
3355 const char * const HexagonTargetInfo::GCCRegNames[] = {
3356 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3357 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3358 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3359 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3360 "p0", "p1", "p2", "p3",
3361 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
3362 };
3363
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const3364 void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
3365 unsigned &NumNames) const {
3366 Names = GCCRegNames;
3367 NumNames = llvm::array_lengthof(GCCRegNames);
3368 }
3369
3370
3371 const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
3372 { { "sp" }, "r29" },
3373 { { "fp" }, "r30" },
3374 { { "lr" }, "r31" },
3375 };
3376
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const3377 void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3378 unsigned &NumAliases) const {
3379 Aliases = GCCRegAliases;
3380 NumAliases = llvm::array_lengthof(GCCRegAliases);
3381 }
3382
3383
3384 const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
3385 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3386 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3387 ALL_LANGUAGES },
3388 #include "clang/Basic/BuiltinsHexagon.def"
3389 };
3390 }
3391
3392
3393 namespace {
3394 class SparcV8TargetInfo : public TargetInfo {
3395 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3396 static const char * const GCCRegNames[];
3397 bool SoftFloat;
3398 public:
SparcV8TargetInfo(const std::string & triple)3399 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
3400 // FIXME: Support Sparc quad-precision long double?
3401 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3402 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3403 }
setFeatureEnabled(llvm::StringMap<bool> & Features,StringRef Name,bool Enabled) const3404 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3405 StringRef Name,
3406 bool Enabled) const {
3407 if (Name == "soft-float")
3408 Features[Name] = Enabled;
3409 else
3410 return false;
3411
3412 return true;
3413 }
HandleTargetFeatures(std::vector<std::string> & Features)3414 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3415 SoftFloat = false;
3416 for (unsigned i = 0, e = Features.size(); i != e; ++i)
3417 if (Features[i] == "+soft-float")
3418 SoftFloat = true;
3419 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3420 virtual void getTargetDefines(const LangOptions &Opts,
3421 MacroBuilder &Builder) const {
3422 DefineStd(Builder, "sparc", Opts);
3423 Builder.defineMacro("__sparcv8");
3424 Builder.defineMacro("__REGISTER_PREFIX__", "");
3425
3426 if (SoftFloat)
3427 Builder.defineMacro("SOFT_FLOAT", "1");
3428 }
3429
hasFeature(StringRef Feature) const3430 virtual bool hasFeature(StringRef Feature) const {
3431 return llvm::StringSwitch<bool>(Feature)
3432 .Case("softfloat", SoftFloat)
3433 .Case("sparc", true)
3434 .Default(false);
3435 }
3436
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const3437 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3438 unsigned &NumRecords) const {
3439 // FIXME: Implement!
3440 }
getBuiltinVaListKind() const3441 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3442 return TargetInfo::VoidPtrBuiltinVaList;
3443 }
3444 virtual void getGCCRegNames(const char * const *&Names,
3445 unsigned &NumNames) const;
3446 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3447 unsigned &NumAliases) const;
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & info) const3448 virtual bool validateAsmConstraint(const char *&Name,
3449 TargetInfo::ConstraintInfo &info) const {
3450 // FIXME: Implement!
3451 return false;
3452 }
getClobbers() const3453 virtual const char *getClobbers() const {
3454 // FIXME: Implement!
3455 return "";
3456 }
3457 };
3458
3459 const char * const SparcV8TargetInfo::GCCRegNames[] = {
3460 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3461 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3462 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3463 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
3464 };
3465
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const3466 void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
3467 unsigned &NumNames) const {
3468 Names = GCCRegNames;
3469 NumNames = llvm::array_lengthof(GCCRegNames);
3470 }
3471
3472 const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
3473 { { "g0" }, "r0" },
3474 { { "g1" }, "r1" },
3475 { { "g2" }, "r2" },
3476 { { "g3" }, "r3" },
3477 { { "g4" }, "r4" },
3478 { { "g5" }, "r5" },
3479 { { "g6" }, "r6" },
3480 { { "g7" }, "r7" },
3481 { { "o0" }, "r8" },
3482 { { "o1" }, "r9" },
3483 { { "o2" }, "r10" },
3484 { { "o3" }, "r11" },
3485 { { "o4" }, "r12" },
3486 { { "o5" }, "r13" },
3487 { { "o6", "sp" }, "r14" },
3488 { { "o7" }, "r15" },
3489 { { "l0" }, "r16" },
3490 { { "l1" }, "r17" },
3491 { { "l2" }, "r18" },
3492 { { "l3" }, "r19" },
3493 { { "l4" }, "r20" },
3494 { { "l5" }, "r21" },
3495 { { "l6" }, "r22" },
3496 { { "l7" }, "r23" },
3497 { { "i0" }, "r24" },
3498 { { "i1" }, "r25" },
3499 { { "i2" }, "r26" },
3500 { { "i3" }, "r27" },
3501 { { "i4" }, "r28" },
3502 { { "i5" }, "r29" },
3503 { { "i6", "fp" }, "r30" },
3504 { { "i7" }, "r31" },
3505 };
3506
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const3507 void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3508 unsigned &NumAliases) const {
3509 Aliases = GCCRegAliases;
3510 NumAliases = llvm::array_lengthof(GCCRegAliases);
3511 }
3512 } // end anonymous namespace.
3513
3514 namespace {
3515 class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
3516 public:
AuroraUXSparcV8TargetInfo(const std::string & triple)3517 AuroraUXSparcV8TargetInfo(const std::string& triple) :
3518 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
3519 SizeType = UnsignedInt;
3520 PtrDiffType = SignedInt;
3521 }
3522 };
3523 class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
3524 public:
SolarisSparcV8TargetInfo(const std::string & triple)3525 SolarisSparcV8TargetInfo(const std::string& triple) :
3526 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
3527 SizeType = UnsignedInt;
3528 PtrDiffType = SignedInt;
3529 }
3530 };
3531 } // end anonymous namespace.
3532
3533 namespace {
3534 class MSP430TargetInfo : public TargetInfo {
3535 static const char * const GCCRegNames[];
3536 public:
MSP430TargetInfo(const std::string & triple)3537 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
3538 BigEndian = false;
3539 TLSSupported = false;
3540 IntWidth = 16; IntAlign = 16;
3541 LongWidth = 32; LongLongWidth = 64;
3542 LongAlign = LongLongAlign = 16;
3543 PointerWidth = 16; PointerAlign = 16;
3544 SuitableAlign = 16;
3545 SizeType = UnsignedInt;
3546 IntMaxType = SignedLong;
3547 UIntMaxType = UnsignedLong;
3548 IntPtrType = SignedShort;
3549 PtrDiffType = SignedInt;
3550 SigAtomicType = SignedLong;
3551 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
3552 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3553 virtual void getTargetDefines(const LangOptions &Opts,
3554 MacroBuilder &Builder) const {
3555 Builder.defineMacro("MSP430");
3556 Builder.defineMacro("__MSP430__");
3557 // FIXME: defines for different 'flavours' of MCU
3558 }
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const3559 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3560 unsigned &NumRecords) const {
3561 // FIXME: Implement.
3562 Records = 0;
3563 NumRecords = 0;
3564 }
hasFeature(StringRef Feature) const3565 virtual bool hasFeature(StringRef Feature) const {
3566 return Feature == "msp430";
3567 }
3568 virtual void getGCCRegNames(const char * const *&Names,
3569 unsigned &NumNames) const;
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const3570 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3571 unsigned &NumAliases) const {
3572 // No aliases.
3573 Aliases = 0;
3574 NumAliases = 0;
3575 }
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & info) const3576 virtual bool validateAsmConstraint(const char *&Name,
3577 TargetInfo::ConstraintInfo &info) const {
3578 // No target constraints for now.
3579 return false;
3580 }
getClobbers() const3581 virtual const char *getClobbers() const {
3582 // FIXME: Is this really right?
3583 return "";
3584 }
getBuiltinVaListKind() const3585 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3586 // FIXME: implement
3587 return TargetInfo::CharPtrBuiltinVaList;
3588 }
3589 };
3590
3591 const char * const MSP430TargetInfo::GCCRegNames[] = {
3592 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3593 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
3594 };
3595
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const3596 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
3597 unsigned &NumNames) const {
3598 Names = GCCRegNames;
3599 NumNames = llvm::array_lengthof(GCCRegNames);
3600 }
3601 }
3602
3603 namespace {
3604
3605 // LLVM and Clang cannot be used directly to output native binaries for
3606 // target, but is used to compile C code to llvm bitcode with correct
3607 // type and alignment information.
3608 //
3609 // TCE uses the llvm bitcode as input and uses it for generating customized
3610 // target processor and program binary. TCE co-design environment is
3611 // publicly available in http://tce.cs.tut.fi
3612
3613 static const unsigned TCEOpenCLAddrSpaceMap[] = {
3614 3, // opencl_global
3615 4, // opencl_local
3616 5, // opencl_constant
3617 0, // cuda_device
3618 0, // cuda_constant
3619 0 // cuda_shared
3620 };
3621
3622 class TCETargetInfo : public TargetInfo{
3623 public:
TCETargetInfo(const std::string & triple)3624 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
3625 TLSSupported = false;
3626 IntWidth = 32;
3627 LongWidth = LongLongWidth = 32;
3628 PointerWidth = 32;
3629 IntAlign = 32;
3630 LongAlign = LongLongAlign = 32;
3631 PointerAlign = 32;
3632 SuitableAlign = 32;
3633 SizeType = UnsignedInt;
3634 IntMaxType = SignedLong;
3635 UIntMaxType = UnsignedLong;
3636 IntPtrType = SignedInt;
3637 PtrDiffType = SignedInt;
3638 FloatWidth = 32;
3639 FloatAlign = 32;
3640 DoubleWidth = 32;
3641 DoubleAlign = 32;
3642 LongDoubleWidth = 32;
3643 LongDoubleAlign = 32;
3644 FloatFormat = &llvm::APFloat::IEEEsingle;
3645 DoubleFormat = &llvm::APFloat::IEEEsingle;
3646 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
3647 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
3648 "i16:16:32-i32:32:32-i64:32:32-"
3649 "f32:32:32-f64:32:32-v64:32:32-"
3650 "v128:32:32-a0:0:32-n32";
3651 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
3652 }
3653
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3654 virtual void getTargetDefines(const LangOptions &Opts,
3655 MacroBuilder &Builder) const {
3656 DefineStd(Builder, "tce", Opts);
3657 Builder.defineMacro("__TCE__");
3658 Builder.defineMacro("__TCE_V1__");
3659 }
hasFeature(StringRef Feature) const3660 virtual bool hasFeature(StringRef Feature) const {
3661 return Feature == "tce";
3662 }
3663
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const3664 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3665 unsigned &NumRecords) const {}
getClobbers() const3666 virtual const char *getClobbers() const {
3667 return "";
3668 }
getBuiltinVaListKind() const3669 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3670 return TargetInfo::VoidPtrBuiltinVaList;
3671 }
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const3672 virtual void getGCCRegNames(const char * const *&Names,
3673 unsigned &NumNames) const {}
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & info) const3674 virtual bool validateAsmConstraint(const char *&Name,
3675 TargetInfo::ConstraintInfo &info) const {
3676 return true;
3677 }
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const3678 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3679 unsigned &NumAliases) const {}
3680 };
3681 }
3682
3683 namespace {
3684 class MipsTargetInfoBase : public TargetInfo {
3685 static const Builtin::Info BuiltinInfo[];
3686 std::string CPU;
3687 bool IsMips16;
3688 enum MipsFloatABI {
3689 HardFloat, SingleFloat, SoftFloat
3690 } FloatABI;
3691 enum DspRevEnum {
3692 NoDSP, DSP1, DSP2
3693 } DspRev;
3694
3695 protected:
3696 std::string ABI;
3697
3698 public:
MipsTargetInfoBase(const std::string & triple,const std::string & ABIStr,const std::string & CPUStr)3699 MipsTargetInfoBase(const std::string& triple,
3700 const std::string& ABIStr,
3701 const std::string& CPUStr)
3702 : TargetInfo(triple),
3703 CPU(CPUStr),
3704 IsMips16(false),
3705 FloatABI(HardFloat),
3706 DspRev(NoDSP),
3707 ABI(ABIStr)
3708 {}
3709
getABI() const3710 virtual const char *getABI() const { return ABI.c_str(); }
3711 virtual bool setABI(const std::string &Name) = 0;
setCPU(const std::string & Name)3712 virtual bool setCPU(const std::string &Name) {
3713 CPU = Name;
3714 return true;
3715 }
getDefaultFeatures(llvm::StringMap<bool> & Features) const3716 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
3717 Features[ABI] = true;
3718 Features[CPU] = true;
3719 }
3720
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3721 virtual void getTargetDefines(const LangOptions &Opts,
3722 MacroBuilder &Builder) const {
3723 DefineStd(Builder, "mips", Opts);
3724 Builder.defineMacro("_mips");
3725 Builder.defineMacro("__REGISTER_PREFIX__", "");
3726
3727 switch (FloatABI) {
3728 case HardFloat:
3729 Builder.defineMacro("__mips_hard_float", Twine(1));
3730 break;
3731 case SingleFloat:
3732 Builder.defineMacro("__mips_hard_float", Twine(1));
3733 Builder.defineMacro("__mips_single_float", Twine(1));
3734 break;
3735 case SoftFloat:
3736 Builder.defineMacro("__mips_soft_float", Twine(1));
3737 break;
3738 }
3739
3740 if (IsMips16)
3741 Builder.defineMacro("__mips16", Twine(1));
3742
3743 switch (DspRev) {
3744 default:
3745 break;
3746 case DSP1:
3747 Builder.defineMacro("__mips_dsp_rev", Twine(1));
3748 Builder.defineMacro("__mips_dsp", Twine(1));
3749 break;
3750 case DSP2:
3751 Builder.defineMacro("__mips_dsp_rev", Twine(2));
3752 Builder.defineMacro("__mips_dspr2", Twine(1));
3753 Builder.defineMacro("__mips_dsp", Twine(1));
3754 break;
3755 }
3756
3757 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
3758 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
3759 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
3760
3761 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
3762 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
3763 }
3764
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const3765 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3766 unsigned &NumRecords) const {
3767 Records = BuiltinInfo;
3768 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
3769 }
hasFeature(StringRef Feature) const3770 virtual bool hasFeature(StringRef Feature) const {
3771 return Feature == "mips";
3772 }
getBuiltinVaListKind() const3773 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3774 return TargetInfo::VoidPtrBuiltinVaList;
3775 }
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const3776 virtual void getGCCRegNames(const char * const *&Names,
3777 unsigned &NumNames) const {
3778 static const char * const GCCRegNames[] = {
3779 // CPU register names
3780 // Must match second column of GCCRegAliases
3781 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
3782 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
3783 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
3784 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
3785 // Floating point register names
3786 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
3787 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
3788 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
3789 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
3790 // Hi/lo and condition register names
3791 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
3792 "$fcc5","$fcc6","$fcc7"
3793 };
3794 Names = GCCRegNames;
3795 NumNames = llvm::array_lengthof(GCCRegNames);
3796 }
3797 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3798 unsigned &NumAliases) const = 0;
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info) const3799 virtual bool validateAsmConstraint(const char *&Name,
3800 TargetInfo::ConstraintInfo &Info) const {
3801 switch (*Name) {
3802 default:
3803 return false;
3804
3805 case 'r': // CPU registers.
3806 case 'd': // Equivalent to "r" unless generating MIPS16 code.
3807 case 'y': // Equivalent to "r", backwards compatibility only.
3808 case 'f': // floating-point registers.
3809 case 'c': // $25 for indirect jumps
3810 case 'l': // lo register
3811 case 'x': // hilo register pair
3812 Info.setAllowsRegister();
3813 return true;
3814 }
3815 }
3816
getClobbers() const3817 virtual const char *getClobbers() const {
3818 // FIXME: Implement!
3819 return "";
3820 }
3821
setFeatureEnabled(llvm::StringMap<bool> & Features,StringRef Name,bool Enabled) const3822 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
3823 StringRef Name,
3824 bool Enabled) const {
3825 if (Name == "soft-float" || Name == "single-float" ||
3826 Name == "o32" || Name == "n32" || Name == "n64" || Name == "eabi" ||
3827 Name == "mips32" || Name == "mips32r2" ||
3828 Name == "mips64" || Name == "mips64r2" ||
3829 Name == "mips16" || Name == "dsp" || Name == "dspr2") {
3830 Features[Name] = Enabled;
3831 return true;
3832 }
3833 return false;
3834 }
3835
HandleTargetFeatures(std::vector<std::string> & Features)3836 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
3837 IsMips16 = false;
3838 FloatABI = HardFloat;
3839 DspRev = NoDSP;
3840
3841 for (std::vector<std::string>::iterator it = Features.begin(),
3842 ie = Features.end(); it != ie; ++it) {
3843 if (*it == "+single-float")
3844 FloatABI = SingleFloat;
3845 else if (*it == "+soft-float")
3846 FloatABI = SoftFloat;
3847 else if (*it == "+mips16")
3848 IsMips16 = true;
3849 else if (*it == "+dsp")
3850 DspRev = std::max(DspRev, DSP1);
3851 else if (*it == "+dspr2")
3852 DspRev = std::max(DspRev, DSP2);
3853 }
3854
3855 // Remove front-end specific option.
3856 std::vector<std::string>::iterator it =
3857 std::find(Features.begin(), Features.end(), "+soft-float");
3858 if (it != Features.end())
3859 Features.erase(it);
3860 }
3861 };
3862
3863 const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
3864 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3865 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3866 ALL_LANGUAGES },
3867 #include "clang/Basic/BuiltinsMips.def"
3868 };
3869
3870 class Mips32TargetInfoBase : public MipsTargetInfoBase {
3871 public:
Mips32TargetInfoBase(const std::string & triple)3872 Mips32TargetInfoBase(const std::string& triple) :
3873 MipsTargetInfoBase(triple, "o32", "mips32") {
3874 SizeType = UnsignedInt;
3875 PtrDiffType = SignedInt;
3876 }
setABI(const std::string & Name)3877 virtual bool setABI(const std::string &Name) {
3878 if ((Name == "o32") || (Name == "eabi")) {
3879 ABI = Name;
3880 return true;
3881 } else
3882 return false;
3883 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3884 virtual void getTargetDefines(const LangOptions &Opts,
3885 MacroBuilder &Builder) const {
3886 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
3887
3888 if (ABI == "o32") {
3889 Builder.defineMacro("__mips_o32");
3890 Builder.defineMacro("_ABIO32", "1");
3891 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
3892 }
3893 else if (ABI == "eabi")
3894 Builder.defineMacro("__mips_eabi");
3895 else
3896 llvm_unreachable("Invalid ABI for Mips32.");
3897 }
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const3898 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3899 unsigned &NumAliases) const {
3900 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3901 { { "at" }, "$1" },
3902 { { "v0" }, "$2" },
3903 { { "v1" }, "$3" },
3904 { { "a0" }, "$4" },
3905 { { "a1" }, "$5" },
3906 { { "a2" }, "$6" },
3907 { { "a3" }, "$7" },
3908 { { "t0" }, "$8" },
3909 { { "t1" }, "$9" },
3910 { { "t2" }, "$10" },
3911 { { "t3" }, "$11" },
3912 { { "t4" }, "$12" },
3913 { { "t5" }, "$13" },
3914 { { "t6" }, "$14" },
3915 { { "t7" }, "$15" },
3916 { { "s0" }, "$16" },
3917 { { "s1" }, "$17" },
3918 { { "s2" }, "$18" },
3919 { { "s3" }, "$19" },
3920 { { "s4" }, "$20" },
3921 { { "s5" }, "$21" },
3922 { { "s6" }, "$22" },
3923 { { "s7" }, "$23" },
3924 { { "t8" }, "$24" },
3925 { { "t9" }, "$25" },
3926 { { "k0" }, "$26" },
3927 { { "k1" }, "$27" },
3928 { { "gp" }, "$28" },
3929 { { "sp","$sp" }, "$29" },
3930 { { "fp","$fp" }, "$30" },
3931 { { "ra" }, "$31" }
3932 };
3933 Aliases = GCCRegAliases;
3934 NumAliases = llvm::array_lengthof(GCCRegAliases);
3935 }
3936 };
3937
3938 class Mips32EBTargetInfo : public Mips32TargetInfoBase {
3939 public:
Mips32EBTargetInfo(const std::string & triple)3940 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3941 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3942 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3943 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3944 virtual void getTargetDefines(const LangOptions &Opts,
3945 MacroBuilder &Builder) const {
3946 DefineStd(Builder, "MIPSEB", Opts);
3947 Builder.defineMacro("_MIPSEB");
3948 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
3949 }
3950 };
3951
3952 class Mips32ELTargetInfo : public Mips32TargetInfoBase {
3953 public:
Mips32ELTargetInfo(const std::string & triple)3954 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3955 BigEndian = false;
3956 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3957 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3958 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3959 virtual void getTargetDefines(const LangOptions &Opts,
3960 MacroBuilder &Builder) const {
3961 DefineStd(Builder, "MIPSEL", Opts);
3962 Builder.defineMacro("_MIPSEL");
3963 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
3964 }
3965 };
3966
3967 class Mips64TargetInfoBase : public MipsTargetInfoBase {
3968 virtual void SetDescriptionString(const std::string &Name) = 0;
3969 public:
Mips64TargetInfoBase(const std::string & triple)3970 Mips64TargetInfoBase(const std::string& triple) :
3971 MipsTargetInfoBase(triple, "n64", "mips64") {
3972 LongWidth = LongAlign = 64;
3973 PointerWidth = PointerAlign = 64;
3974 LongDoubleWidth = LongDoubleAlign = 128;
3975 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3976 SuitableAlign = 128;
3977 }
setABI(const std::string & Name)3978 virtual bool setABI(const std::string &Name) {
3979 SetDescriptionString(Name);
3980
3981 if (Name != "n32" && Name != "n64")
3982 return false;
3983
3984 ABI = Name;
3985
3986 if (Name == "n32") {
3987 LongWidth = LongAlign = 32;
3988 PointerWidth = PointerAlign = 32;
3989 }
3990
3991 return true;
3992 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const3993 virtual void getTargetDefines(const LangOptions &Opts,
3994 MacroBuilder &Builder) const {
3995 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
3996
3997 Builder.defineMacro("__mips64");
3998 Builder.defineMacro("__mips64__");
3999
4000 if (ABI == "n32") {
4001 Builder.defineMacro("__mips_n32");
4002 Builder.defineMacro("_ABIN32", "2");
4003 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
4004 }
4005 else if (ABI == "n64") {
4006 Builder.defineMacro("__mips_n64");
4007 Builder.defineMacro("_ABI64", "3");
4008 Builder.defineMacro("_MIPS_SIM", "_ABI64");
4009 }
4010 else
4011 llvm_unreachable("Invalid ABI for Mips64.");
4012 }
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const4013 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4014 unsigned &NumAliases) const {
4015 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4016 { { "at" }, "$1" },
4017 { { "v0" }, "$2" },
4018 { { "v1" }, "$3" },
4019 { { "a0" }, "$4" },
4020 { { "a1" }, "$5" },
4021 { { "a2" }, "$6" },
4022 { { "a3" }, "$7" },
4023 { { "a4" }, "$8" },
4024 { { "a5" }, "$9" },
4025 { { "a6" }, "$10" },
4026 { { "a7" }, "$11" },
4027 { { "t0" }, "$12" },
4028 { { "t1" }, "$13" },
4029 { { "t2" }, "$14" },
4030 { { "t3" }, "$15" },
4031 { { "s0" }, "$16" },
4032 { { "s1" }, "$17" },
4033 { { "s2" }, "$18" },
4034 { { "s3" }, "$19" },
4035 { { "s4" }, "$20" },
4036 { { "s5" }, "$21" },
4037 { { "s6" }, "$22" },
4038 { { "s7" }, "$23" },
4039 { { "t8" }, "$24" },
4040 { { "t9" }, "$25" },
4041 { { "k0" }, "$26" },
4042 { { "k1" }, "$27" },
4043 { { "gp" }, "$28" },
4044 { { "sp","$sp" }, "$29" },
4045 { { "fp","$fp" }, "$30" },
4046 { { "ra" }, "$31" }
4047 };
4048 Aliases = GCCRegAliases;
4049 NumAliases = llvm::array_lengthof(GCCRegAliases);
4050 }
4051 };
4052
4053 class Mips64EBTargetInfo : public Mips64TargetInfoBase {
SetDescriptionString(const std::string & Name)4054 virtual void SetDescriptionString(const std::string &Name) {
4055 // Change DescriptionString only if ABI is n32.
4056 if (Name == "n32")
4057 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
4058 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
4059 "v64:64:64-n32";
4060 }
4061 public:
Mips64EBTargetInfo(const std::string & triple)4062 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
4063 // Default ABI is n64.
4064 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
4065 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
4066 "v64:64:64-n32";
4067 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const4068 virtual void getTargetDefines(const LangOptions &Opts,
4069 MacroBuilder &Builder) const {
4070 DefineStd(Builder, "MIPSEB", Opts);
4071 Builder.defineMacro("_MIPSEB");
4072 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
4073 }
4074 };
4075
4076 class Mips64ELTargetInfo : public Mips64TargetInfoBase {
SetDescriptionString(const std::string & Name)4077 virtual void SetDescriptionString(const std::string &Name) {
4078 // Change DescriptionString only if ABI is n32.
4079 if (Name == "n32")
4080 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
4081 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
4082 "-v64:64:64-n32";
4083 }
4084 public:
Mips64ELTargetInfo(const std::string & triple)4085 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
4086 // Default ABI is n64.
4087 BigEndian = false;
4088 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
4089 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
4090 "v64:64:64-n32";
4091 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const4092 virtual void getTargetDefines(const LangOptions &Opts,
4093 MacroBuilder &Builder) const {
4094 DefineStd(Builder, "MIPSEL", Opts);
4095 Builder.defineMacro("_MIPSEL");
4096 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
4097 }
4098 };
4099 } // end anonymous namespace.
4100
4101 namespace {
4102 class PNaClTargetInfo : public TargetInfo {
4103 public:
PNaClTargetInfo(const std::string & triple)4104 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
4105 BigEndian = false;
4106 this->UserLabelPrefix = "";
4107 this->LongAlign = 32;
4108 this->LongWidth = 32;
4109 this->PointerAlign = 32;
4110 this->PointerWidth = 32;
4111 this->IntMaxType = TargetInfo::SignedLongLong;
4112 this->UIntMaxType = TargetInfo::UnsignedLongLong;
4113 this->Int64Type = TargetInfo::SignedLongLong;
4114 this->DoubleAlign = 64;
4115 this->LongDoubleWidth = 64;
4116 this->LongDoubleAlign = 64;
4117 this->SizeType = TargetInfo::UnsignedInt;
4118 this->PtrDiffType = TargetInfo::SignedInt;
4119 this->IntPtrType = TargetInfo::SignedInt;
4120 this->RegParmMax = 2;
4121 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
4122 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
4123 }
4124
getDefaultFeatures(llvm::StringMap<bool> & Features) const4125 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
4126 }
getArchDefines(const LangOptions & Opts,MacroBuilder & Builder) const4127 virtual void getArchDefines(const LangOptions &Opts,
4128 MacroBuilder &Builder) const {
4129 Builder.defineMacro("__le32__");
4130 Builder.defineMacro("__pnacl__");
4131 }
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const4132 virtual void getTargetDefines(const LangOptions &Opts,
4133 MacroBuilder &Builder) const {
4134 DefineStd(Builder, "unix", Opts);
4135 Builder.defineMacro("__ELF__");
4136 if (Opts.POSIXThreads)
4137 Builder.defineMacro("_REENTRANT");
4138 if (Opts.CPlusPlus)
4139 Builder.defineMacro("_GNU_SOURCE");
4140
4141 Builder.defineMacro("__LITTLE_ENDIAN__");
4142 Builder.defineMacro("__native_client__");
4143 getArchDefines(Opts, Builder);
4144 }
hasFeature(StringRef Feature) const4145 virtual bool hasFeature(StringRef Feature) const {
4146 return Feature == "pnacl";
4147 }
getTargetBuiltins(const Builtin::Info * & Records,unsigned & NumRecords) const4148 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4149 unsigned &NumRecords) const {
4150 }
getBuiltinVaListKind() const4151 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4152 return TargetInfo::PNaClABIBuiltinVaList;
4153 }
4154 virtual void getGCCRegNames(const char * const *&Names,
4155 unsigned &NumNames) const;
4156 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4157 unsigned &NumAliases) const;
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info) const4158 virtual bool validateAsmConstraint(const char *&Name,
4159 TargetInfo::ConstraintInfo &Info) const {
4160 return false;
4161 }
4162
getClobbers() const4163 virtual const char *getClobbers() const {
4164 return "";
4165 }
4166 };
4167
getGCCRegNames(const char * const * & Names,unsigned & NumNames) const4168 void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
4169 unsigned &NumNames) const {
4170 Names = NULL;
4171 NumNames = 0;
4172 }
4173
getGCCRegAliases(const GCCRegAlias * & Aliases,unsigned & NumAliases) const4174 void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4175 unsigned &NumAliases) const {
4176 Aliases = NULL;
4177 NumAliases = 0;
4178 }
4179 } // end anonymous namespace.
4180
4181
4182 //===----------------------------------------------------------------------===//
4183 // Driver code
4184 //===----------------------------------------------------------------------===//
4185
AllocateTarget(const std::string & T)4186 static TargetInfo *AllocateTarget(const std::string &T) {
4187 llvm::Triple Triple(T);
4188 llvm::Triple::OSType os = Triple.getOS();
4189
4190 switch (Triple.getArch()) {
4191 default:
4192 return NULL;
4193
4194 case llvm::Triple::hexagon:
4195 return new HexagonTargetInfo(T);
4196
4197 case llvm::Triple::arm:
4198 case llvm::Triple::thumb:
4199 if (Triple.isOSDarwin())
4200 return new DarwinARMTargetInfo(T);
4201
4202 switch (os) {
4203 case llvm::Triple::Linux:
4204 return new LinuxTargetInfo<ARMTargetInfo>(T);
4205 case llvm::Triple::FreeBSD:
4206 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
4207 case llvm::Triple::NetBSD:
4208 return new NetBSDTargetInfo<ARMTargetInfo>(T);
4209 case llvm::Triple::OpenBSD:
4210 return new OpenBSDTargetInfo<ARMTargetInfo>(T);
4211 case llvm::Triple::Bitrig:
4212 return new BitrigTargetInfo<ARMTargetInfo>(T);
4213 case llvm::Triple::RTEMS:
4214 return new RTEMSTargetInfo<ARMTargetInfo>(T);
4215 default:
4216 return new ARMTargetInfo(T);
4217 }
4218
4219 case llvm::Triple::msp430:
4220 return new MSP430TargetInfo(T);
4221
4222 case llvm::Triple::mips:
4223 switch (os) {
4224 case llvm::Triple::Linux:
4225 return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
4226 case llvm::Triple::RTEMS:
4227 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
4228 case llvm::Triple::FreeBSD:
4229 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
4230 case llvm::Triple::NetBSD:
4231 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
4232 default:
4233 return new Mips32EBTargetInfo(T);
4234 }
4235
4236 case llvm::Triple::mipsel:
4237 switch (os) {
4238 case llvm::Triple::Linux:
4239 return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
4240 case llvm::Triple::RTEMS:
4241 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
4242 case llvm::Triple::FreeBSD:
4243 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
4244 case llvm::Triple::NetBSD:
4245 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
4246 default:
4247 return new Mips32ELTargetInfo(T);
4248 }
4249
4250 case llvm::Triple::mips64:
4251 switch (os) {
4252 case llvm::Triple::Linux:
4253 return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
4254 case llvm::Triple::RTEMS:
4255 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
4256 case llvm::Triple::FreeBSD:
4257 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
4258 case llvm::Triple::NetBSD:
4259 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
4260 case llvm::Triple::OpenBSD:
4261 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(T);
4262 default:
4263 return new Mips64EBTargetInfo(T);
4264 }
4265
4266 case llvm::Triple::mips64el:
4267 switch (os) {
4268 case llvm::Triple::Linux:
4269 return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
4270 case llvm::Triple::RTEMS:
4271 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
4272 case llvm::Triple::FreeBSD:
4273 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
4274 case llvm::Triple::NetBSD:
4275 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
4276 case llvm::Triple::OpenBSD:
4277 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(T);
4278 default:
4279 return new Mips64ELTargetInfo(T);
4280 }
4281
4282 case llvm::Triple::le32:
4283 switch (os) {
4284 case llvm::Triple::NativeClient:
4285 return new PNaClTargetInfo(T);
4286 default:
4287 return NULL;
4288 }
4289
4290 case llvm::Triple::ppc:
4291 if (Triple.isOSDarwin())
4292 return new DarwinPPC32TargetInfo(T);
4293 switch (os) {
4294 case llvm::Triple::Linux:
4295 return new LinuxTargetInfo<PPC32TargetInfo>(T);
4296 case llvm::Triple::FreeBSD:
4297 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
4298 case llvm::Triple::NetBSD:
4299 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
4300 case llvm::Triple::OpenBSD:
4301 return new OpenBSDTargetInfo<PPC32TargetInfo>(T);
4302 case llvm::Triple::RTEMS:
4303 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
4304 default:
4305 return new PPC32TargetInfo(T);
4306 }
4307
4308 case llvm::Triple::ppc64:
4309 if (Triple.isOSDarwin())
4310 return new DarwinPPC64TargetInfo(T);
4311 switch (os) {
4312 case llvm::Triple::Linux:
4313 return new LinuxTargetInfo<PPC64TargetInfo>(T);
4314 case llvm::Triple::Lv2:
4315 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
4316 case llvm::Triple::FreeBSD:
4317 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
4318 case llvm::Triple::NetBSD:
4319 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
4320 default:
4321 return new PPC64TargetInfo(T);
4322 }
4323
4324 case llvm::Triple::nvptx:
4325 return new NVPTX32TargetInfo(T);
4326 case llvm::Triple::nvptx64:
4327 return new NVPTX64TargetInfo(T);
4328
4329 case llvm::Triple::mblaze:
4330 return new MBlazeTargetInfo(T);
4331
4332 case llvm::Triple::sparc:
4333 switch (os) {
4334 case llvm::Triple::Linux:
4335 return new LinuxTargetInfo<SparcV8TargetInfo>(T);
4336 case llvm::Triple::AuroraUX:
4337 return new AuroraUXSparcV8TargetInfo(T);
4338 case llvm::Triple::Solaris:
4339 return new SolarisSparcV8TargetInfo(T);
4340 case llvm::Triple::NetBSD:
4341 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
4342 case llvm::Triple::OpenBSD:
4343 return new OpenBSDTargetInfo<SparcV8TargetInfo>(T);
4344 case llvm::Triple::RTEMS:
4345 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
4346 default:
4347 return new SparcV8TargetInfo(T);
4348 }
4349
4350 // FIXME: Need a real SPU target.
4351 case llvm::Triple::cellspu:
4352 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
4353
4354 case llvm::Triple::tce:
4355 return new TCETargetInfo(T);
4356
4357 case llvm::Triple::x86:
4358 if (Triple.isOSDarwin())
4359 return new DarwinI386TargetInfo(T);
4360
4361 switch (os) {
4362 case llvm::Triple::AuroraUX:
4363 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
4364 case llvm::Triple::Linux:
4365 return new LinuxTargetInfo<X86_32TargetInfo>(T);
4366 case llvm::Triple::DragonFly:
4367 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
4368 case llvm::Triple::NetBSD:
4369 return new NetBSDI386TargetInfo(T);
4370 case llvm::Triple::OpenBSD:
4371 return new OpenBSDI386TargetInfo(T);
4372 case llvm::Triple::Bitrig:
4373 return new BitrigI386TargetInfo(T);
4374 case llvm::Triple::FreeBSD:
4375 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
4376 case llvm::Triple::Minix:
4377 return new MinixTargetInfo<X86_32TargetInfo>(T);
4378 case llvm::Triple::Solaris:
4379 return new SolarisTargetInfo<X86_32TargetInfo>(T);
4380 case llvm::Triple::Cygwin:
4381 return new CygwinX86_32TargetInfo(T);
4382 case llvm::Triple::MinGW32:
4383 return new MinGWX86_32TargetInfo(T);
4384 case llvm::Triple::Win32:
4385 return new VisualStudioWindowsX86_32TargetInfo(T);
4386 case llvm::Triple::Haiku:
4387 return new HaikuX86_32TargetInfo(T);
4388 case llvm::Triple::RTEMS:
4389 return new RTEMSX86_32TargetInfo(T);
4390 default:
4391 return new X86_32TargetInfo(T);
4392 }
4393
4394 case llvm::Triple::x86_64:
4395 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
4396 return new DarwinX86_64TargetInfo(T);
4397
4398 switch (os) {
4399 case llvm::Triple::AuroraUX:
4400 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
4401 case llvm::Triple::Linux:
4402 return new LinuxTargetInfo<X86_64TargetInfo>(T);
4403 case llvm::Triple::DragonFly:
4404 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
4405 case llvm::Triple::NetBSD:
4406 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
4407 case llvm::Triple::OpenBSD:
4408 return new OpenBSDX86_64TargetInfo(T);
4409 case llvm::Triple::Bitrig:
4410 return new BitrigX86_64TargetInfo(T);
4411 case llvm::Triple::FreeBSD:
4412 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
4413 case llvm::Triple::Solaris:
4414 return new SolarisTargetInfo<X86_64TargetInfo>(T);
4415 case llvm::Triple::MinGW32:
4416 return new MinGWX86_64TargetInfo(T);
4417 case llvm::Triple::Win32: // This is what Triple.h supports now.
4418 return new VisualStudioWindowsX86_64TargetInfo(T);
4419 default:
4420 return new X86_64TargetInfo(T);
4421 }
4422 }
4423 }
4424
4425 /// CreateTargetInfo - Return the target info object for the specified target
4426 /// triple.
CreateTargetInfo(DiagnosticsEngine & Diags,TargetOptions & Opts)4427 TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
4428 TargetOptions &Opts) {
4429 llvm::Triple Triple(Opts.Triple);
4430
4431 // Construct the target
4432 OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
4433 if (!Target) {
4434 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
4435 return 0;
4436 }
4437
4438 // Set the target CPU if specified.
4439 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
4440 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
4441 return 0;
4442 }
4443
4444 // Set the target ABI if specified.
4445 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
4446 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
4447 return 0;
4448 }
4449
4450 // Set the target C++ ABI.
4451 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
4452 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
4453 return 0;
4454 }
4455
4456 // Compute the default target features, we need the target to handle this
4457 // because features may have dependencies on one another.
4458 llvm::StringMap<bool> Features;
4459 Target->getDefaultFeatures(Features);
4460
4461 // Apply the user specified deltas.
4462 // First the enables.
4463 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
4464 ie = Opts.Features.end(); it != ie; ++it) {
4465 const char *Name = it->c_str();
4466
4467 if (Name[0] != '+')
4468 continue;
4469
4470 // Apply the feature via the target.
4471 if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
4472 Diags.Report(diag::err_target_invalid_feature) << Name;
4473 return 0;
4474 }
4475 }
4476
4477 // Then the disables.
4478 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
4479 ie = Opts.Features.end(); it != ie; ++it) {
4480 const char *Name = it->c_str();
4481
4482 if (Name[0] == '+')
4483 continue;
4484
4485 // Apply the feature via the target.
4486 if (Name[0] != '-' ||
4487 !Target->setFeatureEnabled(Features, Name + 1, false)) {
4488 Diags.Report(diag::err_target_invalid_feature) << Name;
4489 return 0;
4490 }
4491 }
4492
4493 // Add the features to the compile options.
4494 //
4495 // FIXME: If we are completely confident that we have the right set, we only
4496 // need to pass the minuses.
4497 Opts.Features.clear();
4498 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
4499 ie = Features.end(); it != ie; ++it)
4500 Opts.Features.push_back((it->second ? "+" : "-") + it->first().str());
4501 Target->HandleTargetFeatures(Opts.Features);
4502
4503 return Target.take();
4504 }
4505