1 //===--- Targets.cpp - Implement -arch option and targets -----------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements construction of a TargetInfo object from a
13 //===----------------------------------------------------------------------===//
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"
32 using namespace clang;
34 //===----------------------------------------------------------------------===//
35 // Common code shared among targets.
36 //===----------------------------------------------------------------------===//
38 /// DefineStd - Define a macro name and standard variants. For example if
39 /// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
41 static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
42 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
45 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
48 Builder.defineMacro(MacroName);
51 Builder.defineMacro("__" + MacroName);
54 Builder.defineMacro("__" + MacroName + "__");
57 //===----------------------------------------------------------------------===//
58 // Defines specific to certain operating systems.
59 //===----------------------------------------------------------------------===//
62 template<typename TgtInfo>
63 class OSTargetInfo : public TgtInfo {
65 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
66 MacroBuilder &Builder) const=0;
68 OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
69 virtual void getTargetDefines(const LangOptions &Opts,
70 MacroBuilder &Builder) const {
71 TgtInfo::getTargetDefines(Opts, Builder);
72 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
76 } // end anonymous namespace
79 static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
80 const llvm::Triple &Triple,
81 StringRef &PlatformName,
82 VersionTuple &PlatformMinVersion) {
83 Builder.defineMacro("__APPLE_CC__", "5621");
84 Builder.defineMacro("__APPLE__");
85 Builder.defineMacro("__MACH__");
86 Builder.defineMacro("OBJC_NEW_PROPERTIES");
88 if (!Opts.ObjCAutoRefCount) {
89 // __weak is always defined, for use in blocks and with objc pointers.
90 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
92 // Darwin defines __strong even in C mode (just to nothing).
93 if (Opts.getGC() != LangOptions::NonGC)
94 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
96 Builder.defineMacro("__strong", "");
98 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
99 // allow this in C, since one might have block pointers in structs that
100 // are used in pure C code and in Objective-C ARC.
101 Builder.defineMacro("__unsafe_unretained", "");
103 // The Objective-C bridged cast keywords are defined to nothing in non-ARC
104 // mode; then they become normal, C-style casts.
105 Builder.defineMacro("__bridge", "");
106 Builder.defineMacro("__bridge_transfer", "");
107 Builder.defineMacro("__bridge_retained", "");
108 Builder.defineMacro("__bridge_retain", "");
112 Builder.defineMacro("__STATIC__");
114 Builder.defineMacro("__DYNAMIC__");
116 if (Opts.POSIXThreads)
117 Builder.defineMacro("_REENTRANT");
119 // Get the platform type and version number from the triple.
120 unsigned Maj, Min, Rev;
122 // If no version was given, default to to 10.4.0, for simplifying tests.
123 if (Triple.getOSName() == "darwin" || Triple.getOSName() == "osx") {
124 PlatformName = "macosx";
128 // Otherwise, honor all three triple forms ("-darwinNNN[-iphoneos]",
129 // "-osxNNN", and "-iosNNN").
131 if (Triple.getOS() == llvm::Triple::Darwin) {
132 // For historical reasons that make little sense, the version passed here
133 // is the "darwin" version, which drops the 10 and offsets by 4.
134 Triple.getOSVersion(Maj, Min, Rev);
136 if (Triple.getEnvironmentName() == "iphoneos") {
137 PlatformName = "ios";
139 PlatformName = "macosx";
145 Triple.getOSVersion(Maj, Min, Rev);
146 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
150 // If -ccc-host-triple arch-pc-win32-macho option specified, we're
151 // generating code for Win32 ABI. No need to emit
152 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
153 if (PlatformName == "win32") {
154 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
158 // Set the appropriate OS version define.
159 if (PlatformName == "ios") {
160 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
163 Str[1] = '0' + (Min / 10);
164 Str[2] = '0' + (Min % 10);
165 Str[3] = '0' + (Rev / 10);
166 Str[4] = '0' + (Rev % 10);
168 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
170 // Note that the Driver allows versions which aren't representable in the
171 // define (because we only get a single digit for the minor and micro
172 // revision numbers). So, we limit them to the maximum representable
174 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
175 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
177 Str[0] = '0' + (Maj / 10);
178 Str[1] = '0' + (Maj % 10);
179 Str[2] = '0' + std::min(Min, 9U);
180 Str[3] = '0' + std::min(Rev, 9U);
182 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
185 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
189 template<typename Target>
190 class DarwinTargetInfo : public OSTargetInfo<Target> {
192 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
193 MacroBuilder &Builder) const {
194 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
195 this->PlatformMinVersion);
199 DarwinTargetInfo(const std::string& triple) :
200 OSTargetInfo<Target>(triple) {
201 llvm::Triple T = llvm::Triple(triple);
202 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
203 this->MCountName = "\01mcount";
206 virtual std::string isValidSectionSpecifier(StringRef SR) const {
207 // Let MCSectionMachO validate this.
208 StringRef Segment, Section;
209 unsigned TAA, StubSize;
211 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
212 TAA, HasTAA, StubSize);
215 virtual const char *getStaticInitSectionSpecifier() const {
216 // FIXME: We should return 0 when building kexts.
217 return "__TEXT,__StaticInit,regular,pure_instructions";
223 // DragonFlyBSD Target
224 template<typename Target>
225 class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
227 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
228 MacroBuilder &Builder) const {
229 // DragonFly defines; list based off of gcc output
230 Builder.defineMacro("__DragonFly__");
231 Builder.defineMacro("__DragonFly_cc_version", "100001");
232 Builder.defineMacro("__ELF__");
233 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
234 Builder.defineMacro("__tune_i386__");
235 DefineStd(Builder, "unix", Opts);
238 DragonFlyBSDTargetInfo(const std::string &triple)
239 : OSTargetInfo<Target>(triple) {}
243 template<typename Target>
244 class FreeBSDTargetInfo : public OSTargetInfo<Target> {
246 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
247 MacroBuilder &Builder) const {
248 // FreeBSD defines; list based off of gcc output
250 unsigned Release = Triple.getOSMajorVersion();
254 Builder.defineMacro("__FreeBSD__", Twine(Release));
255 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
256 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
257 DefineStd(Builder, "unix", Opts);
258 Builder.defineMacro("__ELF__");
261 FreeBSDTargetInfo(const std::string &triple)
262 : OSTargetInfo<Target>(triple) {
263 this->UserLabelPrefix = "";
265 llvm::Triple Triple(triple);
266 switch (Triple.getArch()) {
268 case llvm::Triple::x86:
269 case llvm::Triple::x86_64:
270 this->MCountName = ".mcount";
272 case llvm::Triple::mips:
273 case llvm::Triple::mipsel:
274 case llvm::Triple::ppc:
275 case llvm::Triple::ppc64:
276 this->MCountName = "_mcount";
278 case llvm::Triple::arm:
279 this->MCountName = "__mcount";
287 template<typename Target>
288 class MinixTargetInfo : public OSTargetInfo<Target> {
290 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
291 MacroBuilder &Builder) const {
294 Builder.defineMacro("__minix", "3");
295 Builder.defineMacro("_EM_WSIZE", "4");
296 Builder.defineMacro("_EM_PSIZE", "4");
297 Builder.defineMacro("_EM_SSIZE", "2");
298 Builder.defineMacro("_EM_LSIZE", "4");
299 Builder.defineMacro("_EM_FSIZE", "4");
300 Builder.defineMacro("_EM_DSIZE", "8");
301 DefineStd(Builder, "unix", Opts);
304 MinixTargetInfo(const std::string &triple)
305 : OSTargetInfo<Target>(triple) {
306 this->UserLabelPrefix = "";
311 template<typename Target>
312 class LinuxTargetInfo : public OSTargetInfo<Target> {
314 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
315 MacroBuilder &Builder) const {
316 // Linux defines; list based off of gcc output
317 DefineStd(Builder, "unix", Opts);
318 DefineStd(Builder, "linux", Opts);
319 Builder.defineMacro("__gnu_linux__");
320 Builder.defineMacro("__ELF__");
321 if (Opts.POSIXThreads)
322 Builder.defineMacro("_REENTRANT");
324 Builder.defineMacro("_GNU_SOURCE");
327 LinuxTargetInfo(const std::string& triple)
328 : OSTargetInfo<Target>(triple) {
329 this->UserLabelPrefix = "";
330 this->WIntType = TargetInfo::UnsignedInt;
335 template<typename Target>
336 class NetBSDTargetInfo : public OSTargetInfo<Target> {
338 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
339 MacroBuilder &Builder) const {
340 // NetBSD defines; list based off of gcc output
341 Builder.defineMacro("__NetBSD__");
342 Builder.defineMacro("__unix__");
343 Builder.defineMacro("__ELF__");
344 if (Opts.POSIXThreads)
345 Builder.defineMacro("_POSIX_THREADS");
348 NetBSDTargetInfo(const std::string &triple)
349 : OSTargetInfo<Target>(triple) {
350 this->UserLabelPrefix = "";
355 template<typename Target>
356 class OpenBSDTargetInfo : public OSTargetInfo<Target> {
358 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
359 MacroBuilder &Builder) const {
360 // OpenBSD defines; list based off of gcc output
362 Builder.defineMacro("__OpenBSD__");
363 DefineStd(Builder, "unix", Opts);
364 Builder.defineMacro("__ELF__");
365 if (Opts.POSIXThreads)
366 Builder.defineMacro("_POSIX_THREADS");
369 OpenBSDTargetInfo(const std::string &triple)
370 : OSTargetInfo<Target>(triple) {}
374 template<typename Target>
375 class PSPTargetInfo : public OSTargetInfo<Target> {
377 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
378 MacroBuilder &Builder) const {
379 // PSP defines; list based on the output of the pspdev gcc toolchain.
380 Builder.defineMacro("PSP");
381 Builder.defineMacro("_PSP");
382 Builder.defineMacro("__psp__");
383 Builder.defineMacro("__ELF__");
386 PSPTargetInfo(const std::string& triple)
387 : OSTargetInfo<Target>(triple) {
388 this->UserLabelPrefix = "";
393 template<typename Target>
394 class PS3PPUTargetInfo : public OSTargetInfo<Target> {
396 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
397 MacroBuilder &Builder) const {
399 Builder.defineMacro("__PPC__");
400 Builder.defineMacro("__PPU__");
401 Builder.defineMacro("__CELLOS_LV2__");
402 Builder.defineMacro("__ELF__");
403 Builder.defineMacro("__LP32__");
404 Builder.defineMacro("_ARCH_PPC64");
405 Builder.defineMacro("__powerpc64__");
408 PS3PPUTargetInfo(const std::string& triple)
409 : OSTargetInfo<Target>(triple) {
410 this->UserLabelPrefix = "";
411 this->LongWidth = this->LongAlign = this->PointerWidth = this->PointerAlign = 32;
412 this->IntMaxType = TargetInfo::SignedLongLong;
413 this->UIntMaxType = TargetInfo::UnsignedLongLong;
414 this->Int64Type = TargetInfo::SignedLongLong;
415 this->SizeType = TargetInfo::UnsignedInt;
416 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
417 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
421 // FIXME: Need a real SPU target.
423 template<typename Target>
424 class PS3SPUTargetInfo : public OSTargetInfo<Target> {
426 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
427 MacroBuilder &Builder) const {
429 Builder.defineMacro("__SPU__");
430 Builder.defineMacro("__ELF__");
433 PS3SPUTargetInfo(const std::string& triple)
434 : OSTargetInfo<Target>(triple) {
435 this->UserLabelPrefix = "";
440 template<typename Target>
441 class AuroraUXTargetInfo : public OSTargetInfo<Target> {
443 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
444 MacroBuilder &Builder) const {
445 DefineStd(Builder, "sun", Opts);
446 DefineStd(Builder, "unix", Opts);
447 Builder.defineMacro("__ELF__");
448 Builder.defineMacro("__svr4__");
449 Builder.defineMacro("__SVR4");
452 AuroraUXTargetInfo(const std::string& triple)
453 : OSTargetInfo<Target>(triple) {
454 this->UserLabelPrefix = "";
455 this->WCharType = this->SignedLong;
456 // FIXME: WIntType should be SignedLong
461 template<typename Target>
462 class SolarisTargetInfo : public OSTargetInfo<Target> {
464 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
465 MacroBuilder &Builder) const {
466 DefineStd(Builder, "sun", Opts);
467 DefineStd(Builder, "unix", Opts);
468 Builder.defineMacro("__ELF__");
469 Builder.defineMacro("__svr4__");
470 Builder.defineMacro("__SVR4");
473 SolarisTargetInfo(const std::string& triple)
474 : OSTargetInfo<Target>(triple) {
475 this->UserLabelPrefix = "";
476 this->WCharType = this->SignedLong;
477 // FIXME: WIntType should be SignedLong
482 template<typename Target>
483 class WindowsTargetInfo : public OSTargetInfo<Target> {
485 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
486 MacroBuilder &Builder) const {
487 Builder.defineMacro("_WIN32");
489 void getVisualStudioDefines(const LangOptions &Opts,
490 MacroBuilder &Builder) const {
491 if (Opts.CPlusPlus) {
493 Builder.defineMacro("_CPPRTTI");
496 Builder.defineMacro("_CPPUNWIND");
499 if (!Opts.CharIsSigned)
500 Builder.defineMacro("_CHAR_UNSIGNED");
502 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
503 // but it works for now.
504 if (Opts.POSIXThreads)
505 Builder.defineMacro("_MT");
507 if (Opts.MSCVersion != 0)
508 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
510 if (Opts.MicrosoftExt) {
511 Builder.defineMacro("_MSC_EXTENSIONS");
513 if (Opts.CPlusPlus0x) {
514 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
515 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
516 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
520 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
524 WindowsTargetInfo(const std::string &triple)
525 : OSTargetInfo<Target>(triple) {}
528 } // end anonymous namespace.
530 //===----------------------------------------------------------------------===//
531 // Specific target implementations.
532 //===----------------------------------------------------------------------===//
535 // PPC abstract base class
536 class PPCTargetInfo : public TargetInfo {
537 static const Builtin::Info BuiltinInfo[];
538 static const char * const GCCRegNames[];
539 static const TargetInfo::GCCRegAlias GCCRegAliases[];
541 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {}
543 virtual void getTargetBuiltins(const Builtin::Info *&Records,
544 unsigned &NumRecords) const {
545 Records = BuiltinInfo;
546 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
549 virtual void getTargetDefines(const LangOptions &Opts,
550 MacroBuilder &Builder) const;
552 virtual void getGCCRegNames(const char * const *&Names,
553 unsigned &NumNames) const;
554 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
555 unsigned &NumAliases) const;
556 virtual bool validateAsmConstraint(const char *&Name,
557 TargetInfo::ConstraintInfo &Info) const {
559 default: return false;
562 case 'b': // Base register
563 case 'f': // Floating point register
564 Info.setAllowsRegister();
566 // FIXME: The following are added to allow parsing.
567 // I just took a guess at what the actions should be.
568 // Also, is more specific checking needed? I.e. specific registers?
569 case 'd': // Floating point register (containing 64-bit value)
570 case 'v': // Altivec vector register
571 Info.setAllowsRegister();
575 case 'd':// VSX vector register to hold vector double data
576 case 'f':// VSX vector register to hold vector float data
577 case 's':// VSX vector register to hold scalar float data
578 case 'a':// Any VSX register
583 Info.setAllowsRegister();
584 Name++; // Skip over 'w'.
586 case 'h': // `MQ', `CTR', or `LINK' register
587 case 'q': // `MQ' register
588 case 'c': // `CTR' register
589 case 'l': // `LINK' register
590 case 'x': // `CR' register (condition register) number 0
591 case 'y': // `CR' register (condition register)
592 case 'z': // `XER[CA]' carry bit (part of the XER register)
593 Info.setAllowsRegister();
595 case 'I': // Signed 16-bit constant
596 case 'J': // Unsigned 16-bit constant shifted left 16 bits
597 // (use `L' instead for SImode constants)
598 case 'K': // Unsigned 16-bit constant
599 case 'L': // Signed 16-bit constant shifted left 16 bits
600 case 'M': // Constant larger than 31
601 case 'N': // Exact power of 2
602 case 'P': // Constant whose negation is a signed 16-bit constant
603 case 'G': // Floating point constant that can be loaded into a
604 // register with one instruction per word
605 case 'H': // Integer/Floating point constant that can be loaded
606 // into a register using three instructions
608 case 'm': // Memory operand. Note that on PowerPC targets, m can
609 // include addresses that update the base register. It
610 // is therefore only safe to use `m' in an asm statement
611 // if that asm statement accesses the operand exactly once.
612 // The asm statement must also use `%U<opno>' as a
613 // placeholder for the "update" flag in the corresponding
614 // load or store instruction. For example:
615 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
617 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
618 // is not. Use es rather than m if you don't want the base
619 // register to be updated.
623 // es: A "stable" memory operand; that is, one which does not
624 // include any automodification of the base register. Unlike
625 // `m', this constraint can be used in asm statements that
626 // might access the operand several times, or that might not
628 Info.setAllowsMemory();
629 Name++; // Skip over 'e'.
631 case 'Q': // Memory operand that is an offset from a register (it is
632 // usually better to use `m' or `es' in asm statements)
633 case 'Z': // Memory operand that is an indexed or indirect from a
634 // register (it is usually better to use `m' or `es' in
636 Info.setAllowsMemory();
637 Info.setAllowsRegister();
639 case 'R': // AIX TOC entry
640 case 'a': // Address operand that is an indexed or indirect from a
641 // register (`p' is preferable for asm statements)
642 case 'S': // Constant suitable as a 64-bit mask operand
643 case 'T': // Constant suitable as a 32-bit mask operand
644 case 'U': // System V Release 4 small data area reference
645 case 't': // AND masks that can be performed by two rldic{l, r}
647 case 'W': // Vector constant that does not require memory
648 case 'j': // Vector constant that is all zeros.
654 virtual const char *getClobbers() const {
659 const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
660 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
661 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
663 #include "clang/Basic/BuiltinsPPC.def"
667 /// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
668 /// #defines that are not tied to a specific subtarget.
669 void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
670 MacroBuilder &Builder) const {
671 // Target identification.
672 Builder.defineMacro("__ppc__");
673 Builder.defineMacro("_ARCH_PPC");
674 Builder.defineMacro("__powerpc__");
675 Builder.defineMacro("__POWERPC__");
676 if (PointerWidth == 64) {
677 Builder.defineMacro("_ARCH_PPC64");
678 Builder.defineMacro("_LP64");
679 Builder.defineMacro("__LP64__");
680 Builder.defineMacro("__powerpc64__");
681 Builder.defineMacro("__ppc64__");
683 Builder.defineMacro("__ppc__");
686 // Target properties.
687 if (getTriple().getOS() != llvm::Triple::NetBSD)
688 Builder.defineMacro("_BIG_ENDIAN");
689 Builder.defineMacro("__BIG_ENDIAN__");
691 // Subtarget options.
692 Builder.defineMacro("__NATURAL_ALIGNMENT__");
693 Builder.defineMacro("__REGISTER_PREFIX__", "");
695 // FIXME: Should be controlled by command line option.
696 Builder.defineMacro("__LONG_DOUBLE_128__");
699 Builder.defineMacro("__VEC__", "10206");
700 Builder.defineMacro("__ALTIVEC__");
705 const char * const PPCTargetInfo::GCCRegNames[] = {
706 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
707 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
708 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
709 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
710 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
711 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
712 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
713 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
714 "mq", "lr", "ctr", "ap",
715 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
717 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
718 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
719 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
720 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
722 "spe_acc", "spefscr",
726 void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
727 unsigned &NumNames) const {
729 NumNames = llvm::array_lengthof(GCCRegNames);
732 const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
733 // While some of these aliases do map to different registers
734 // they still share the same register name.
777 { { "fr10" }, "f10" },
778 { { "fr11" }, "f11" },
779 { { "fr12" }, "f12" },
780 { { "fr13" }, "f13" },
781 { { "fr14" }, "f14" },
782 { { "fr15" }, "f15" },
783 { { "fr16" }, "f16" },
784 { { "fr17" }, "f17" },
785 { { "fr18" }, "f18" },
786 { { "fr19" }, "f19" },
787 { { "fr20" }, "f20" },
788 { { "fr21" }, "f21" },
789 { { "fr22" }, "f22" },
790 { { "fr23" }, "f23" },
791 { { "fr24" }, "f24" },
792 { { "fr25" }, "f25" },
793 { { "fr26" }, "f26" },
794 { { "fr27" }, "f27" },
795 { { "fr28" }, "f28" },
796 { { "fr29" }, "f29" },
797 { { "fr30" }, "f30" },
798 { { "fr31" }, "f31" },
802 void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
803 unsigned &NumAliases) const {
804 Aliases = GCCRegAliases;
805 NumAliases = llvm::array_lengthof(GCCRegAliases);
807 } // end anonymous namespace.
810 class PPC32TargetInfo : public PPCTargetInfo {
812 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
813 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
814 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
816 switch (getTriple().getOS()) {
817 case llvm::Triple::FreeBSD:
818 case llvm::Triple::NetBSD:
819 SizeType = UnsignedInt;
826 virtual const char *getVAListDeclaration() const {
827 // This is the ELF definition, and is overridden by the Darwin sub-target
828 return "typedef struct __va_list_tag {"
829 " unsigned char gpr;"
830 " unsigned char fpr;"
831 " unsigned short reserved;"
832 " void* overflow_arg_area;"
833 " void* reg_save_area;"
834 "} __builtin_va_list[1];";
837 } // end anonymous namespace.
840 class PPC64TargetInfo : public PPCTargetInfo {
842 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
843 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
844 IntMaxType = SignedLong;
845 UIntMaxType = UnsignedLong;
846 Int64Type = SignedLong;
847 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
848 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
850 virtual const char *getVAListDeclaration() const {
851 return "typedef char* __builtin_va_list;";
854 } // end anonymous namespace.
858 class DarwinPPC32TargetInfo :
859 public DarwinTargetInfo<PPC32TargetInfo> {
861 DarwinPPC32TargetInfo(const std::string& triple)
862 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
863 HasAlignMac68kSupport = true;
864 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
866 virtual const char *getVAListDeclaration() const {
867 return "typedef char* __builtin_va_list;";
871 class DarwinPPC64TargetInfo :
872 public DarwinTargetInfo<PPC64TargetInfo> {
874 DarwinPPC64TargetInfo(const std::string& triple)
875 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
876 HasAlignMac68kSupport = true;
879 } // end anonymous namespace.
882 static const unsigned PTXAddrSpaceMap[] = {
887 class PTXTargetInfo : public TargetInfo {
888 static const char * const GCCRegNames[];
889 static const Builtin::Info BuiltinInfo[];
890 std::vector<llvm::StringRef> AvailableFeatures;
892 PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
893 TLSSupported = false;
894 LongWidth = LongAlign = 64;
895 AddrSpaceMap = &PTXAddrSpaceMap;
896 // Define available target features
897 // These must be defined in sorted order!
898 AvailableFeatures.push_back("compute10");
899 AvailableFeatures.push_back("compute11");
900 AvailableFeatures.push_back("compute12");
901 AvailableFeatures.push_back("compute13");
902 AvailableFeatures.push_back("compute20");
903 AvailableFeatures.push_back("double");
904 AvailableFeatures.push_back("no-fma");
905 AvailableFeatures.push_back("ptx20");
906 AvailableFeatures.push_back("ptx21");
907 AvailableFeatures.push_back("ptx22");
908 AvailableFeatures.push_back("ptx23");
909 AvailableFeatures.push_back("sm10");
910 AvailableFeatures.push_back("sm11");
911 AvailableFeatures.push_back("sm12");
912 AvailableFeatures.push_back("sm13");
913 AvailableFeatures.push_back("sm20");
914 AvailableFeatures.push_back("sm21");
915 AvailableFeatures.push_back("sm22");
916 AvailableFeatures.push_back("sm23");
918 virtual void getTargetDefines(const LangOptions &Opts,
919 MacroBuilder &Builder) const {
920 Builder.defineMacro("__PTX__");
922 virtual void getTargetBuiltins(const Builtin::Info *&Records,
923 unsigned &NumRecords) const {
924 Records = BuiltinInfo;
925 NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
928 virtual void getGCCRegNames(const char * const *&Names,
929 unsigned &NumNames) const;
930 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
931 unsigned &NumAliases) const {
936 virtual bool validateAsmConstraint(const char *&Name,
937 TargetInfo::ConstraintInfo &info) const {
941 virtual const char *getClobbers() const {
942 // FIXME: Is this really right?
945 virtual const char *getVAListDeclaration() const {
947 return "typedef char* __builtin_va_list;";
950 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
951 const std::string &Name,
955 const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
956 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
957 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
959 #include "clang/Basic/BuiltinsPTX.def"
962 const char * const PTXTargetInfo::GCCRegNames[] = {
966 void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
967 unsigned &NumNames) const {
969 NumNames = llvm::array_lengthof(GCCRegNames);
972 bool PTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
973 const std::string &Name,
974 bool Enabled) const {
975 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
977 Features[Name] = Enabled;
984 class PTX32TargetInfo : public PTXTargetInfo {
986 PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
987 PointerWidth = PointerAlign = 32;
988 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
990 = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
994 class PTX64TargetInfo : public PTXTargetInfo {
996 PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
997 PointerWidth = PointerAlign = 64;
998 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
1000 = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
1006 // MBlaze abstract base class
1007 class MBlazeTargetInfo : public TargetInfo {
1008 static const char * const GCCRegNames[];
1009 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1012 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
1013 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
1016 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1017 unsigned &NumRecords) const {
1018 // FIXME: Implement.
1023 virtual void getTargetDefines(const LangOptions &Opts,
1024 MacroBuilder &Builder) const;
1026 virtual const char *getVAListDeclaration() const {
1027 return "typedef char* __builtin_va_list;";
1029 virtual const char *getTargetPrefix() const {
1032 virtual void getGCCRegNames(const char * const *&Names,
1033 unsigned &NumNames) const;
1034 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1035 unsigned &NumAliases) const;
1036 virtual bool validateAsmConstraint(const char *&Name,
1037 TargetInfo::ConstraintInfo &Info) const {
1039 default: return false;
1042 case 'b': // Base register
1043 case 'f': // Floating point register
1044 Info.setAllowsRegister();
1048 virtual const char *getClobbers() const {
1053 /// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1054 /// #defines that are not tied to a specific subtarget.
1055 void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1056 MacroBuilder &Builder) const {
1057 // Target identification.
1058 Builder.defineMacro("__microblaze__");
1059 Builder.defineMacro("_ARCH_MICROBLAZE");
1060 Builder.defineMacro("__MICROBLAZE__");
1062 // Target properties.
1063 Builder.defineMacro("_BIG_ENDIAN");
1064 Builder.defineMacro("__BIG_ENDIAN__");
1066 // Subtarget options.
1067 Builder.defineMacro("__REGISTER_PREFIX__", "");
1071 const char * const MBlazeTargetInfo::GCCRegNames[] = {
1072 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1073 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1074 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1075 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1076 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1077 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1078 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1079 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1080 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1081 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1084 void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1085 unsigned &NumNames) const {
1086 Names = GCCRegNames;
1087 NumNames = llvm::array_lengthof(GCCRegNames);
1090 const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1125 void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1126 unsigned &NumAliases) const {
1127 Aliases = GCCRegAliases;
1128 NumAliases = llvm::array_lengthof(GCCRegAliases);
1130 } // end anonymous namespace.
1133 // Namespace for x86 abstract base class
1134 const Builtin::Info BuiltinInfo[] = {
1135 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1136 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1138 #include "clang/Basic/BuiltinsX86.def"
1141 static const char* const GCCRegNames[] = {
1142 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1143 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
1144 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
1145 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1146 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1147 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1148 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
1151 const TargetInfo::AddlRegName AddlRegNames[] = {
1152 { { "al", "ah", "eax", "rax" }, 0 },
1153 { { "bl", "bh", "ebx", "rbx" }, 3 },
1154 { { "cl", "ch", "ecx", "rcx" }, 2 },
1155 { { "dl", "dh", "edx", "rdx" }, 1 },
1156 { { "esi", "rsi" }, 4 },
1157 { { "edi", "rdi" }, 5 },
1158 { { "esp", "rsp" }, 7 },
1159 { { "ebp", "rbp" }, 6 },
1162 // X86 target abstract base class; x86-32 and x86-64 are very close, so
1163 // most of the implementation can be shared.
1164 class X86TargetInfo : public TargetInfo {
1166 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
1169 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1175 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1177 /// Each enumeration represents a particular CPU supported by Clang. These
1178 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1183 /// i386-generation processors.
1189 /// i486-generation processors.
1198 /// i586-generation processors, P5 microarchitecture based.
1206 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1216 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1217 /// Clang however has some logic to suport this.
1218 // FIXME: Warn, deprecate, and potentially remove this.
1223 /// Netburst microarchitecture based processors.
1232 /// Core microarchitecture based processors.
1236 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1237 /// codename which GCC no longer accepts as an option to -march, but Clang
1238 /// has some logic for recognizing it.
1239 // FIXME: Warn, deprecate, and potentially remove this.
1250 /// Nehalem microarchitecture based processors.
1258 /// K6 architecture processors.
1266 /// K7 architecture processors.
1269 CK_AthlonThunderbird,
1276 /// K8 architecture processors.
1286 /// This specification is deprecated and will be removed in the future.
1287 /// Users should prefer \see CK_K8.
1288 // FIXME: Warn on this when the CPU is set to it.
1293 /// Geode processors.
1300 X86TargetInfo(const std::string& triple)
1301 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
1302 HasAES(false), HasAVX(false), CPU(CK_Generic) {
1303 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
1305 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1306 unsigned &NumRecords) const {
1307 Records = BuiltinInfo;
1308 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
1310 virtual void getGCCRegNames(const char * const *&Names,
1311 unsigned &NumNames) const {
1312 Names = GCCRegNames;
1313 NumNames = llvm::array_lengthof(GCCRegNames);
1315 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1316 unsigned &NumAliases) const {
1320 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
1321 unsigned &NumNames) const {
1322 Names = AddlRegNames;
1323 NumNames = llvm::array_lengthof(AddlRegNames);
1325 virtual bool validateAsmConstraint(const char *&Name,
1326 TargetInfo::ConstraintInfo &info) const;
1327 virtual std::string convertConstraint(const char *&Constraint) const;
1328 virtual const char *getClobbers() const {
1329 return "~{dirflag},~{fpsr},~{flags}";
1331 virtual void getTargetDefines(const LangOptions &Opts,
1332 MacroBuilder &Builder) const;
1333 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1334 const std::string &Name,
1335 bool Enabled) const;
1336 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
1337 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
1338 virtual const char* getABI() const {
1339 return MMX3DNowLevel == NoMMX3DNow ? "no-mmx" : "";
1341 virtual bool setCPU(const std::string &Name) {
1342 CPU = llvm::StringSwitch<CPUKind>(Name)
1343 .Case("i386", CK_i386)
1344 .Case("i486", CK_i486)
1345 .Case("winchip-c6", CK_WinChipC6)
1346 .Case("winchip2", CK_WinChip2)
1348 .Case("i586", CK_i586)
1349 .Case("pentium", CK_Pentium)
1350 .Case("pentium-mmx", CK_PentiumMMX)
1351 .Case("i686", CK_i686)
1352 .Case("pentiumpro", CK_PentiumPro)
1353 .Case("pentium2", CK_Pentium2)
1354 .Case("pentium3", CK_Pentium3)
1355 .Case("pentium3m", CK_Pentium3M)
1356 .Case("pentium-m", CK_PentiumM)
1357 .Case("c3-2", CK_C3_2)
1358 .Case("yonah", CK_Yonah)
1359 .Case("pentium4", CK_Pentium4)
1360 .Case("pentium4m", CK_Pentium4M)
1361 .Case("prescott", CK_Prescott)
1362 .Case("nocona", CK_Nocona)
1363 .Case("core2", CK_Core2)
1364 .Case("penryn", CK_Penryn)
1365 .Case("atom", CK_Atom)
1366 .Case("corei7", CK_Corei7)
1367 .Case("corei7-avx", CK_Corei7AVX)
1368 .Case("core-avx-i", CK_CoreAVXi)
1370 .Case("k6-2", CK_K6_2)
1371 .Case("k6-3", CK_K6_3)
1372 .Case("athlon", CK_Athlon)
1373 .Case("athlon-tbird", CK_AthlonThunderbird)
1374 .Case("athlon-4", CK_Athlon4)
1375 .Case("athlon-xp", CK_AthlonXP)
1376 .Case("athlon-mp", CK_AthlonMP)
1377 .Case("athlon64", CK_Athlon64)
1378 .Case("athlon64-sse3", CK_Athlon64SSE3)
1379 .Case("athlon-fx", CK_AthlonFX)
1381 .Case("k8-sse3", CK_K8SSE3)
1382 .Case("opteron", CK_Opteron)
1383 .Case("opteron-sse3", CK_OpteronSSE3)
1384 .Case("x86-64", CK_x86_64)
1385 .Case("geode", CK_Geode)
1386 .Default(CK_Generic);
1388 // Perform any per-CPU checks necessary to determine if this CPU is
1390 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1391 // invalid without explaining *why*.
1394 // No processor selected!
1420 case CK_AthlonThunderbird:
1425 // Only accept certain architectures when compiling in 32-bit mode.
1426 if (PointerWidth != 32)
1438 case CK_Athlon64SSE3:
1443 case CK_OpteronSSE3:
1447 llvm_unreachable("Unhandled CPU kind");
1451 void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1452 // FIXME: This should not be here.
1453 Features["3dnow"] = false;
1454 Features["3dnowa"] = false;
1455 Features["mmx"] = false;
1456 Features["sse"] = false;
1457 Features["sse2"] = false;
1458 Features["sse3"] = false;
1459 Features["ssse3"] = false;
1460 Features["sse41"] = false;
1461 Features["sse42"] = false;
1462 Features["aes"] = false;
1463 Features["avx"] = false;
1465 // LLVM does not currently recognize this.
1466 // Features["sse4a"] = false;
1468 // FIXME: This *really* should not be here.
1470 // X86_64 always has SSE2.
1471 if (PointerWidth == 64)
1472 Features["sse2"] = Features["sse"] = Features["mmx"] = true;
1485 setFeatureEnabled(Features, "mmx", true);
1489 setFeatureEnabled(Features, "mmx", true);
1490 setFeatureEnabled(Features, "sse", true);
1496 setFeatureEnabled(Features, "mmx", true);
1497 setFeatureEnabled(Features, "sse2", true);
1502 setFeatureEnabled(Features, "mmx", true);
1503 setFeatureEnabled(Features, "sse3", true);
1506 setFeatureEnabled(Features, "mmx", true);
1507 setFeatureEnabled(Features, "ssse3", true);
1510 setFeatureEnabled(Features, "mmx", true);
1511 setFeatureEnabled(Features, "sse4", true);
1512 Features["sse42"] = false;
1515 setFeatureEnabled(Features, "mmx", true);
1516 setFeatureEnabled(Features, "ssse3", true);
1519 setFeatureEnabled(Features, "mmx", true);
1520 setFeatureEnabled(Features, "sse4", true);
1521 setFeatureEnabled(Features, "aes", true);
1525 setFeatureEnabled(Features, "mmx", true);
1526 setFeatureEnabled(Features, "sse4", true);
1527 setFeatureEnabled(Features, "aes", true);
1528 //setFeatureEnabled(Features, "avx", true);
1532 setFeatureEnabled(Features, "mmx", true);
1538 setFeatureEnabled(Features, "3dnow", true);
1541 case CK_AthlonThunderbird:
1543 setFeatureEnabled(Features, "3dnowa", true);
1548 setFeatureEnabled(Features, "sse", true);
1549 setFeatureEnabled(Features, "3dnowa", true);
1555 setFeatureEnabled(Features, "sse2", true);
1556 setFeatureEnabled(Features, "3dnowa", true);
1559 case CK_OpteronSSE3:
1560 case CK_Athlon64SSE3:
1561 setFeatureEnabled(Features, "sse3", true);
1562 setFeatureEnabled(Features, "3dnowa", true);
1565 setFeatureEnabled(Features, "mmx", true);
1566 setFeatureEnabled(Features, "sse", true);
1571 bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1572 const std::string &Name,
1573 bool Enabled) const {
1574 // FIXME: This *really* should not be here. We need some way of translating
1575 // options into llvm subtarget features.
1576 if (!Features.count(Name) &&
1577 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1"))
1582 Features["mmx"] = true;
1583 else if (Name == "sse")
1584 Features["sse"] = true;
1585 else if (Name == "sse2")
1586 Features["sse"] = Features["sse2"] = true;
1587 else if (Name == "sse3")
1588 Features["sse"] = Features["sse2"] = Features["sse3"] = true;
1589 else if (Name == "ssse3")
1590 Features["sse"] = Features["sse2"] = Features["sse3"] =
1591 Features["ssse3"] = true;
1592 else if (Name == "sse4" || Name == "sse4.2")
1593 Features["sse"] = Features["sse2"] = Features["sse3"] =
1594 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
1595 else if (Name == "sse4.1")
1596 Features["sse"] = Features["sse2"] = Features["sse3"] =
1597 Features["ssse3"] = Features["sse41"] = true;
1598 else if (Name == "3dnow")
1599 Features["mmx"] = Features["3dnow"] = true;
1600 else if (Name == "3dnowa")
1601 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
1602 else if (Name == "aes")
1603 Features["aes"] = true;
1604 else if (Name == "avx")
1605 Features["avx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
1606 Features["ssse3"] = Features["sse41"] = Features["sse42"] = true;
1609 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
1610 else if (Name == "sse")
1611 Features["sse"] = Features["sse2"] = Features["sse3"] =
1612 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1613 else if (Name == "sse2")
1614 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
1615 Features["sse41"] = Features["sse42"] = false;
1616 else if (Name == "sse3")
1617 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
1618 Features["sse42"] = false;
1619 else if (Name == "ssse3")
1620 Features["ssse3"] = Features["sse41"] = Features["sse42"] = false;
1621 else if (Name == "sse4" || Name == "sse4.1")
1622 Features["sse41"] = Features["sse42"] = false;
1623 else if (Name == "sse4.2")
1624 Features["sse42"] = false;
1625 else if (Name == "3dnow")
1626 Features["3dnow"] = Features["3dnowa"] = false;
1627 else if (Name == "3dnowa")
1628 Features["3dnowa"] = false;
1629 else if (Name == "aes")
1630 Features["aes"] = false;
1631 else if (Name == "avx")
1632 Features["avx"] = false;
1638 /// HandleTargetOptions - Perform initialization based on the user
1639 /// configured set of features.
1640 void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
1641 // Remember the maximum enabled sselevel.
1642 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1643 // Ignore disabled features.
1644 if (Features[i][0] == '-')
1647 if (Features[i].substr(1) == "aes") {
1652 // FIXME: Not sure yet how to treat AVX in regard to SSE levels.
1653 // For now let it be enabled together with other SSE levels.
1654 if (Features[i].substr(1) == "avx") {
1659 assert(Features[i][0] == '+' && "Invalid target feature!");
1660 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Features[i].substr(1))
1661 .Case("sse42", SSE42)
1662 .Case("sse41", SSE41)
1663 .Case("ssse3", SSSE3)
1668 SSELevel = std::max(SSELevel, Level);
1670 MMX3DNowEnum ThreeDNowLevel =
1671 llvm::StringSwitch<MMX3DNowEnum>(Features[i].substr(1))
1672 .Case("3dnowa", AMD3DNowAthlon)
1673 .Case("3dnow", AMD3DNow)
1675 .Default(NoMMX3DNow);
1677 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
1680 // Don't tell the backend if we're turning off mmx; it will end up disabling
1681 // SSE, which we don't want.
1682 std::vector<std::string>::iterator it;
1683 it = std::find(Features.begin(), Features.end(), "-mmx");
1684 if (it != Features.end())
1688 /// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
1689 /// definitions for this particular subtarget.
1690 void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
1691 MacroBuilder &Builder) const {
1692 // Target identification.
1693 if (PointerWidth == 64) {
1694 Builder.defineMacro("_LP64");
1695 Builder.defineMacro("__LP64__");
1696 Builder.defineMacro("__amd64__");
1697 Builder.defineMacro("__amd64");
1698 Builder.defineMacro("__x86_64");
1699 Builder.defineMacro("__x86_64__");
1701 DefineStd(Builder, "i386", Opts);
1704 // Subtarget options.
1705 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
1706 // truly should be based on -mtune options.
1711 // The rest are coming from the i386 define above.
1712 Builder.defineMacro("__tune_i386__");
1718 Builder.defineMacro("__i486");
1719 Builder.defineMacro("__i486__");
1720 Builder.defineMacro("__tune_i486__");
1723 Builder.defineMacro("__pentium_mmx__");
1724 Builder.defineMacro("__tune_pentium_mmx__");
1728 Builder.defineMacro("__i586");
1729 Builder.defineMacro("__i586__");
1730 Builder.defineMacro("__tune_i586__");
1731 Builder.defineMacro("__pentium");
1732 Builder.defineMacro("__pentium__");
1733 Builder.defineMacro("__tune_pentium__");
1738 Builder.defineMacro("__tune_pentium3__");
1742 Builder.defineMacro("__tune_pentium2__");
1745 Builder.defineMacro("__tune_i686__");
1746 Builder.defineMacro("__tune_pentiumpro__");
1749 Builder.defineMacro("__i686");
1750 Builder.defineMacro("__i686__");
1751 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
1752 Builder.defineMacro("__pentiumpro");
1753 Builder.defineMacro("__pentiumpro__");
1757 Builder.defineMacro("__pentium4");
1758 Builder.defineMacro("__pentium4__");
1759 Builder.defineMacro("__tune_pentium4__");
1764 Builder.defineMacro("__nocona");
1765 Builder.defineMacro("__nocona__");
1766 Builder.defineMacro("__tune_nocona__");
1770 Builder.defineMacro("__core2");
1771 Builder.defineMacro("__core2__");
1772 Builder.defineMacro("__tune_core2__");
1775 Builder.defineMacro("__atom");
1776 Builder.defineMacro("__atom__");
1777 Builder.defineMacro("__tune_atom__");
1782 Builder.defineMacro("__corei7");
1783 Builder.defineMacro("__corei7__");
1784 Builder.defineMacro("__tune_corei7__");
1787 Builder.defineMacro("__k6_2__");
1788 Builder.defineMacro("__tune_k6_2__");
1791 if (CPU != CK_K6_2) { // In case of fallthrough
1792 // FIXME: GCC may be enabling these in cases where some other k6
1793 // architecture is specified but -m3dnow is explicitly provided. The
1794 // exact semantics need to be determined and emulated here.
1795 Builder.defineMacro("__k6_3__");
1796 Builder.defineMacro("__tune_k6_3__");
1800 Builder.defineMacro("__k6");
1801 Builder.defineMacro("__k6__");
1802 Builder.defineMacro("__tune_k6__");
1805 case CK_AthlonThunderbird:
1809 Builder.defineMacro("__athlon");
1810 Builder.defineMacro("__athlon__");
1811 Builder.defineMacro("__tune_athlon__");
1812 if (SSELevel != NoSSE) {
1813 Builder.defineMacro("__athlon_sse__");
1814 Builder.defineMacro("__tune_athlon_sse__");
1821 case CK_OpteronSSE3:
1823 case CK_Athlon64SSE3:
1825 Builder.defineMacro("__k8");
1826 Builder.defineMacro("__k8__");
1827 Builder.defineMacro("__tune_k8__");
1830 Builder.defineMacro("__geode");
1831 Builder.defineMacro("__geode__");
1832 Builder.defineMacro("__tune_geode__");
1836 // Target properties.
1837 Builder.defineMacro("__LITTLE_ENDIAN__");
1838 Builder.defineMacro("__REGISTER_PREFIX__", "");
1840 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
1841 // functions in glibc header files that use FP Stack inline asm which the
1842 // backend can't deal with (PR879).
1843 Builder.defineMacro("__NO_MATH_INLINES");
1846 Builder.defineMacro("__AES__");
1849 Builder.defineMacro("__AVX__");
1851 // Each case falls through to the previous one here.
1854 Builder.defineMacro("__SSE4_2__");
1856 Builder.defineMacro("__SSE4_1__");
1858 Builder.defineMacro("__SSSE3__");
1860 Builder.defineMacro("__SSE3__");
1862 Builder.defineMacro("__SSE2__");
1863 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
1865 Builder.defineMacro("__SSE__");
1866 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
1871 if (Opts.MicrosoftExt && PointerWidth == 32) {
1878 Builder.defineMacro("_M_IX86_FP", Twine(2));
1881 Builder.defineMacro("_M_IX86_FP", Twine(1));
1884 Builder.defineMacro("_M_IX86_FP", Twine(0));
1888 // Each case falls through to the previous one here.
1889 switch (MMX3DNowLevel) {
1890 case AMD3DNowAthlon:
1891 Builder.defineMacro("__3dNOW_A__");
1893 Builder.defineMacro("__3dNOW__");
1895 Builder.defineMacro("__MMX__");
1903 X86TargetInfo::validateAsmConstraint(const char *&Name,
1904 TargetInfo::ConstraintInfo &Info) const {
1906 default: return false;
1907 case 'Y': // first letter of a pair:
1908 switch (*(Name+1)) {
1909 default: return false;
1910 case '0': // First SSE register.
1911 case 't': // Any SSE register, when SSE2 is enabled.
1912 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1913 case 'm': // any MMX register, when inter-unit moves enabled.
1914 break; // falls through to setAllowsRegister.
1922 case 'A': // edx:eax.
1923 case 'f': // any x87 floating point stack register.
1924 case 't': // top of floating point stack.
1925 case 'u': // second from top of floating point stack.
1926 case 'q': // Any register accessible as [r]l: a, b, c, and d.
1927 case 'y': // Any MMX register.
1928 case 'x': // Any SSE register.
1929 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
1930 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1931 case 'l': // "Index" registers: any general register that can be used as an
1932 // index in a base+index memory access.
1933 Info.setAllowsRegister();
1935 case 'C': // SSE floating point constant.
1936 case 'G': // x87 floating point constant.
1937 case 'e': // 32-bit signed integer constant for use with zero-extending
1938 // x86_64 instructions.
1939 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
1940 // x86_64 instructions.
1948 X86TargetInfo::convertConstraint(const char *&Constraint) const {
1949 switch (*Constraint) {
1950 case 'a': return std::string("{ax}");
1951 case 'b': return std::string("{bx}");
1952 case 'c': return std::string("{cx}");
1953 case 'd': return std::string("{dx}");
1954 case 'S': return std::string("{si}");
1955 case 'D': return std::string("{di}");
1956 case 'p': // address
1957 return std::string("im");
1958 case 't': // top of floating point stack.
1959 return std::string("{st}");
1960 case 'u': // second from top of floating point stack.
1961 return std::string("{st(1)}"); // second from top of floating point stack.
1963 return std::string(1, *Constraint);
1966 } // end anonymous namespace
1969 // X86-32 generic target
1970 class X86_32TargetInfo : public X86TargetInfo {
1972 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
1973 DoubleAlign = LongLongAlign = 32;
1974 LongDoubleWidth = 96;
1975 LongDoubleAlign = 32;
1976 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1977 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
1978 "a0:0:64-f80:32:32-n8:16:32-S128";
1979 SizeType = UnsignedInt;
1980 PtrDiffType = SignedInt;
1981 IntPtrType = SignedInt;
1984 // Use fpret for all types.
1985 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
1986 (1 << TargetInfo::Double) |
1987 (1 << TargetInfo::LongDouble));
1989 // x86-32 has atomics up to 8 bytes
1990 // FIXME: Check that we actually have cmpxchg8b before setting
1991 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
1992 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
1994 virtual const char *getVAListDeclaration() const {
1995 return "typedef char* __builtin_va_list;";
1998 int getEHDataRegisterNumber(unsigned RegNo) const {
1999 if (RegNo == 0) return 0;
2000 if (RegNo == 1) return 2;
2004 } // end anonymous namespace
2007 class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2009 OpenBSDI386TargetInfo(const std::string& triple) :
2010 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2011 SizeType = UnsignedLong;
2012 IntPtrType = SignedLong;
2013 PtrDiffType = SignedLong;
2016 } // end anonymous namespace
2019 class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
2021 DarwinI386TargetInfo(const std::string& triple) :
2022 DarwinTargetInfo<X86_32TargetInfo>(triple) {
2023 LongDoubleWidth = 128;
2024 LongDoubleAlign = 128;
2025 SizeType = UnsignedLong;
2026 IntPtrType = SignedLong;
2027 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2028 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
2029 "a0:0:64-f80:128:128-n8:16:32-S128";
2030 HasAlignMac68kSupport = true;
2034 } // end anonymous namespace
2037 // x86-32 Windows target
2038 class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
2040 WindowsX86_32TargetInfo(const std::string& triple)
2041 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
2042 TLSSupported = false;
2043 WCharType = UnsignedShort;
2044 DoubleAlign = LongLongAlign = 64;
2045 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2046 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
2047 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
2049 virtual void getTargetDefines(const LangOptions &Opts,
2050 MacroBuilder &Builder) const {
2051 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2054 } // end anonymous namespace
2058 // x86-32 Windows Visual Studio target
2059 class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2061 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2062 : WindowsX86_32TargetInfo(triple) {
2063 LongDoubleWidth = LongDoubleAlign = 64;
2064 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2066 virtual void getTargetDefines(const LangOptions &Opts,
2067 MacroBuilder &Builder) const {
2068 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2069 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2070 // The value of the following reflects processor type.
2071 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2072 // We lost the original triple, so we use the default.
2073 Builder.defineMacro("_M_IX86", "600");
2076 } // end anonymous namespace
2079 // x86-32 MinGW target
2080 class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2082 MinGWX86_32TargetInfo(const std::string& triple)
2083 : WindowsX86_32TargetInfo(triple) {
2085 virtual void getTargetDefines(const LangOptions &Opts,
2086 MacroBuilder &Builder) const {
2087 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2088 DefineStd(Builder, "WIN32", Opts);
2089 DefineStd(Builder, "WINNT", Opts);
2090 Builder.defineMacro("_X86_");
2091 Builder.defineMacro("__MSVCRT__");
2092 Builder.defineMacro("__MINGW32__");
2094 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2095 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
2096 if (Opts.MicrosoftExt)
2097 // Provide "as-is" __declspec.
2098 Builder.defineMacro("__declspec", "__declspec");
2100 // Provide alias of __attribute__ like mingw32-gcc.
2101 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
2104 } // end anonymous namespace
2107 // x86-32 Cygwin target
2108 class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2110 CygwinX86_32TargetInfo(const std::string& triple)
2111 : X86_32TargetInfo(triple) {
2112 TLSSupported = false;
2113 WCharType = UnsignedShort;
2114 DoubleAlign = LongLongAlign = 64;
2115 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2116 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
2117 "a0:0:64-f80:32:32-n8:16:32-S32";
2119 virtual void getTargetDefines(const LangOptions &Opts,
2120 MacroBuilder &Builder) const {
2121 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2122 Builder.defineMacro("__CYGWIN__");
2123 Builder.defineMacro("__CYGWIN32__");
2124 DefineStd(Builder, "unix", Opts);
2126 Builder.defineMacro("_GNU_SOURCE");
2129 } // end anonymous namespace
2132 // x86-32 Haiku target
2133 class HaikuX86_32TargetInfo : public X86_32TargetInfo {
2135 HaikuX86_32TargetInfo(const std::string& triple)
2136 : X86_32TargetInfo(triple) {
2137 SizeType = UnsignedLong;
2138 IntPtrType = SignedLong;
2139 PtrDiffType = SignedLong;
2140 this->UserLabelPrefix = "";
2142 virtual void getTargetDefines(const LangOptions &Opts,
2143 MacroBuilder &Builder) const {
2144 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2145 Builder.defineMacro("__INTEL__");
2146 Builder.defineMacro("__HAIKU__");
2149 } // end anonymous namespace
2152 template<typename Target>
2153 class RTEMSTargetInfo : public OSTargetInfo<Target> {
2155 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2156 MacroBuilder &Builder) const {
2157 // RTEMS defines; list based off of gcc output
2159 Builder.defineMacro("__rtems__");
2160 Builder.defineMacro("__ELF__");
2163 RTEMSTargetInfo(const std::string &triple)
2164 : OSTargetInfo<Target>(triple) {
2165 this->UserLabelPrefix = "";
2167 llvm::Triple Triple(triple);
2168 switch (Triple.getArch()) {
2170 case llvm::Triple::x86:
2171 // this->MCountName = ".mcount";
2173 case llvm::Triple::mips:
2174 case llvm::Triple::mipsel:
2175 case llvm::Triple::ppc:
2176 case llvm::Triple::ppc64:
2177 // this->MCountName = "_mcount";
2179 case llvm::Triple::arm:
2180 // this->MCountName = "__mcount";
2188 // x86-32 RTEMS target
2189 class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
2191 RTEMSX86_32TargetInfo(const std::string& triple)
2192 : X86_32TargetInfo(triple) {
2193 SizeType = UnsignedLong;
2194 IntPtrType = SignedLong;
2195 PtrDiffType = SignedLong;
2196 this->UserLabelPrefix = "";
2198 virtual void getTargetDefines(const LangOptions &Opts,
2199 MacroBuilder &Builder) const {
2200 X86_32TargetInfo::getTargetDefines(Opts, Builder);
2201 Builder.defineMacro("__INTEL__");
2202 Builder.defineMacro("__rtems__");
2205 } // end anonymous namespace
2208 // x86-64 generic target
2209 class X86_64TargetInfo : public X86TargetInfo {
2211 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
2212 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
2213 LongDoubleWidth = 128;
2214 LongDoubleAlign = 128;
2215 LargeArrayMinWidth = 128;
2216 LargeArrayAlign = 128;
2217 IntMaxType = SignedLong;
2218 UIntMaxType = UnsignedLong;
2219 Int64Type = SignedLong;
2222 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2223 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
2224 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
2226 // Use fpret only for long double.
2227 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
2229 // x86-64 has atomics up to 16 bytes.
2230 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
2231 // on CPUs with cmpxchg16b
2232 MaxAtomicPromoteWidth = 128;
2233 MaxAtomicInlineWidth = 64;
2235 virtual const char *getVAListDeclaration() const {
2236 return "typedef struct __va_list_tag {"
2237 " unsigned gp_offset;"
2238 " unsigned fp_offset;"
2239 " void* overflow_arg_area;"
2240 " void* reg_save_area;"
2242 "typedef __va_list_tag __builtin_va_list[1];";
2245 int getEHDataRegisterNumber(unsigned RegNo) const {
2246 if (RegNo == 0) return 0;
2247 if (RegNo == 1) return 1;
2251 } // end anonymous namespace
2254 // x86-64 Windows target
2255 class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
2257 WindowsX86_64TargetInfo(const std::string& triple)
2258 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
2259 TLSSupported = false;
2260 WCharType = UnsignedShort;
2261 LongWidth = LongAlign = 32;
2262 DoubleAlign = LongLongAlign = 64;
2263 IntMaxType = SignedLongLong;
2264 UIntMaxType = UnsignedLongLong;
2265 Int64Type = SignedLongLong;
2266 SizeType = UnsignedLongLong;
2267 PtrDiffType = SignedLongLong;
2268 IntPtrType = SignedLongLong;
2269 this->UserLabelPrefix = "";
2271 virtual void getTargetDefines(const LangOptions &Opts,
2272 MacroBuilder &Builder) const {
2273 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
2274 Builder.defineMacro("_WIN64");
2276 virtual const char *getVAListDeclaration() const {
2277 return "typedef char* __builtin_va_list;";
2280 } // end anonymous namespace
2283 // x86-64 Windows Visual Studio target
2284 class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
2286 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
2287 : WindowsX86_64TargetInfo(triple) {
2288 LongDoubleWidth = LongDoubleAlign = 64;
2289 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2291 virtual void getTargetDefines(const LangOptions &Opts,
2292 MacroBuilder &Builder) const {
2293 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2294 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
2295 Builder.defineMacro("_M_X64");
2296 Builder.defineMacro("_M_AMD64");
2299 } // end anonymous namespace
2302 // x86-64 MinGW target
2303 class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
2305 MinGWX86_64TargetInfo(const std::string& triple)
2306 : WindowsX86_64TargetInfo(triple) {
2308 virtual void getTargetDefines(const LangOptions &Opts,
2309 MacroBuilder &Builder) const {
2310 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
2311 DefineStd(Builder, "WIN64", Opts);
2312 Builder.defineMacro("__MSVCRT__");
2313 Builder.defineMacro("__MINGW32__");
2314 Builder.defineMacro("__MINGW64__");
2316 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2317 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
2318 if (Opts.MicrosoftExt)
2319 // Provide "as-is" __declspec.
2320 Builder.defineMacro("__declspec", "__declspec");
2322 // Provide alias of __attribute__ like mingw32-gcc.
2323 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
2326 } // end anonymous namespace
2329 class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
2331 DarwinX86_64TargetInfo(const std::string& triple)
2332 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
2333 Int64Type = SignedLongLong;
2336 } // end anonymous namespace
2339 class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
2341 OpenBSDX86_64TargetInfo(const std::string& triple)
2342 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
2343 IntMaxType = SignedLongLong;
2344 UIntMaxType = UnsignedLongLong;
2345 Int64Type = SignedLongLong;
2348 } // end anonymous namespace
2351 class ARMTargetInfo : public TargetInfo {
2352 // Possible FPU choices.
2360 static bool FPUModeIsVFP(FPUMode Mode) {
2361 return Mode >= VFP2FPU && Mode <= NeonFPU;
2364 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2365 static const char * const GCCRegNames[];
2367 std::string ABI, CPU;
2371 unsigned IsThumb : 1;
2373 // Initialized via features.
2374 unsigned SoftFloat : 1;
2375 unsigned SoftFloatABI : 1;
2377 static const Builtin::Info BuiltinInfo[];
2380 ARMTargetInfo(const std::string &TripleStr)
2381 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
2383 SizeType = UnsignedInt;
2384 PtrDiffType = SignedInt;
2386 // {} in inline assembly are neon specifiers, not assembly variant
2388 NoAsmVariants = true;
2390 // FIXME: Should we just treat this as a feature?
2391 IsThumb = getTriple().getArchName().startswith("thumb");
2393 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2394 // so set preferred for small types to 32.
2395 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2396 "i64:64:64-f32:32:32-f64:64:64-"
2397 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
2399 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2400 "i64:64:64-f32:32:32-f64:64:64-"
2401 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
2404 // ARM targets default to using the ARM C++ ABI.
2405 CXXABI = CXXABI_ARM;
2407 // ARM has atomics up to 8 bytes
2408 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
2409 MaxAtomicPromoteWidth = 64;
2411 virtual const char *getABI() const { return ABI.c_str(); }
2412 virtual bool setABI(const std::string &Name) {
2415 // The defaults (above) are for AAPCS, check if we need to change them.
2417 // FIXME: We need support for -meabi... we could just mangle it into the
2419 if (Name == "apcs-gnu") {
2420 DoubleAlign = LongLongAlign = LongDoubleAlign = 32;
2421 SizeType = UnsignedLong;
2423 // Do not respect the alignment of bit-field types when laying out
2424 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
2425 UseBitFieldTypeAlignment = false;
2427 /// Do force alignment of members that follow zero length bitfields. If
2428 /// the alignment of the zero-length bitfield is greater than the member
2429 /// that follows it, `bar', `bar' will be aligned as the type of the
2430 /// zero length bitfield.
2431 UseZeroLengthBitfieldAlignment = true;
2433 /// gcc forces the alignment to 4 bytes, regardless of the type of the
2434 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
2436 ZeroLengthBitfieldBoundary = 32;
2439 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
2440 // so set preferred for small types to 32.
2441 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
2442 "i64:32:64-f32:32:32-f64:32:64-"
2443 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
2445 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2446 "i64:32:64-f32:32:32-f64:32:64-"
2447 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
2450 // FIXME: Override "preferred align" for double and long long.
2451 } else if (Name == "aapcs") {
2452 // FIXME: Enumerated types are variable width in straight AAPCS.
2453 } else if (Name == "aapcs-linux") {
2461 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
2462 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
2463 Features["vfp2"] = true;
2464 else if (CPU == "cortex-a8" || CPU == "cortex-a9")
2465 Features["neon"] = true;
2468 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2469 const std::string &Name,
2470 bool Enabled) const {
2471 if (Name == "soft-float" || Name == "soft-float-abi" ||
2472 Name == "vfp2" || Name == "vfp3" || Name == "neon") {
2473 Features[Name] = Enabled;
2480 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2482 SoftFloat = SoftFloatABI = false;
2483 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
2484 if (Features[i] == "+soft-float")
2486 else if (Features[i] == "+soft-float-abi")
2487 SoftFloatABI = true;
2488 else if (Features[i] == "+vfp2")
2490 else if (Features[i] == "+vfp3")
2492 else if (Features[i] == "+neon")
2496 // Remove front-end specific options which the backend handles differently.
2497 std::vector<std::string>::iterator it;
2498 it = std::find(Features.begin(), Features.end(), "+soft-float");
2499 if (it != Features.end())
2501 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
2502 if (it != Features.end())
2506 static const char *getCPUDefineSuffix(StringRef Name) {
2507 return llvm::StringSwitch<const char*>(Name)
2508 .Cases("arm8", "arm810", "4")
2509 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
2510 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
2511 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
2512 .Case("ep9312", "4T")
2513 .Cases("arm10tdmi", "arm1020t", "5T")
2514 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
2515 .Case("arm926ej-s", "5TEJ")
2516 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
2517 .Cases("xscale", "iwmmxt", "5TE")
2518 .Case("arm1136j-s", "6J")
2519 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
2520 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
2521 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
2522 .Cases("cortex-a8", "cortex-a9", "7A")
2523 .Case("cortex-m3", "7M")
2524 .Case("cortex-m0", "6M")
2527 virtual bool setCPU(const std::string &Name) {
2528 if (!getCPUDefineSuffix(Name))
2534 virtual void getTargetDefines(const LangOptions &Opts,
2535 MacroBuilder &Builder) const {
2536 // Target identification.
2537 Builder.defineMacro("__arm");
2538 Builder.defineMacro("__arm__");
2540 // Target properties.
2541 Builder.defineMacro("__ARMEL__");
2542 Builder.defineMacro("__LITTLE_ENDIAN__");
2543 Builder.defineMacro("__REGISTER_PREFIX__", "");
2545 StringRef CPUArch = getCPUDefineSuffix(CPU);
2546 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
2548 // Subtarget options.
2550 // FIXME: It's more complicated than this and we don't really support
2552 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
2553 Builder.defineMacro("__THUMB_INTERWORK__");
2555 if (ABI == "aapcs" || ABI == "aapcs-linux")
2556 Builder.defineMacro("__ARM_EABI__");
2559 Builder.defineMacro("__SOFTFP__");
2561 if (CPU == "xscale")
2562 Builder.defineMacro("__XSCALE__");
2564 bool IsARMv7 = CPUArch.startswith("7");
2566 Builder.defineMacro("__THUMBEL__");
2567 Builder.defineMacro("__thumb__");
2568 if (CPUArch == "6T2" || IsARMv7)
2569 Builder.defineMacro("__thumb2__");
2572 // Note, this is always on in gcc, even though it doesn't make sense.
2573 Builder.defineMacro("__APCS_32__");
2575 if (FPUModeIsVFP((FPUMode) FPU))
2576 Builder.defineMacro("__VFP_FP__");
2578 // This only gets set when Neon instructions are actually available, unlike
2579 // the VFP define, hence the soft float and arch check. This is subtly
2580 // different from gcc, we follow the intent which was that it should be set
2581 // when Neon instructions are actually available.
2582 if (FPU == NeonFPU && !SoftFloat && IsARMv7)
2583 Builder.defineMacro("__ARM_NEON__");
2585 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2586 unsigned &NumRecords) const {
2587 Records = BuiltinInfo;
2588 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
2590 virtual const char *getVAListDeclaration() const {
2591 return "typedef void* __builtin_va_list;";
2593 virtual void getGCCRegNames(const char * const *&Names,
2594 unsigned &NumNames) const;
2595 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2596 unsigned &NumAliases) const;
2597 virtual bool validateAsmConstraint(const char *&Name,
2598 TargetInfo::ConstraintInfo &Info) const {
2599 // FIXME: Check if this is complete
2604 case 'w': // VFP Floating point register single precision
2605 case 'P': // VFP Floating point register double precision
2606 Info.setAllowsRegister();
2608 case 'Q': // A memory address that is a single base register.
2609 Info.setAllowsMemory();
2611 case 'U': // a memory reference...
2613 case 'q': // ...ARMV4 ldrsb
2614 case 'v': // ...VFP load/store (reg+constant offset)
2615 case 'y': // ...iWMMXt load/store
2616 case 't': // address valid for load/store opaque types wider
2618 case 'n': // valid address for Neon doubleword vector load/store
2619 case 'm': // valid address for Neon element and structure load/store
2620 case 's': // valid address for non-offset loads/stores of quad-word
2621 // values in four ARM registers
2622 Info.setAllowsMemory();
2629 virtual std::string convertConstraint(const char *&Constraint) const {
2631 switch (*Constraint) {
2632 case 'U': // Two-character constraint; add "^" hint for later parsing.
2633 R = std::string("^") + std::string(Constraint, 2);
2636 case 'p': // 'p' should be translated to 'r' by default.
2637 R = std::string("r");
2640 return std::string(1, *Constraint);
2644 virtual const char *getClobbers() const {
2645 // FIXME: Is this really right?
2650 const char * const ARMTargetInfo::GCCRegNames[] = {
2651 // Integer registers
2652 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2653 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
2656 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2657 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2658 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2659 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2662 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
2663 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
2664 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
2665 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
2668 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2669 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
2672 void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
2673 unsigned &NumNames) const {
2674 Names = GCCRegNames;
2675 NumNames = llvm::array_lengthof(GCCRegNames);
2678 const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
2688 { { "v6", "rfp" }, "r9" },
2689 { { "sl" }, "r10" },
2690 { { "fp" }, "r11" },
2691 { { "ip" }, "r12" },
2692 { { "r13" }, "sp" },
2693 { { "r14" }, "lr" },
2694 { { "r15" }, "pc" },
2695 // The S, D and Q registers overlap, but aren't really aliases; we
2696 // don't want to substitute one of these for a different-sized one.
2699 void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2700 unsigned &NumAliases) const {
2701 Aliases = GCCRegAliases;
2702 NumAliases = llvm::array_lengthof(GCCRegAliases);
2705 const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
2706 #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
2707 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
2709 #include "clang/Basic/BuiltinsARM.def"
2711 } // end anonymous namespace.
2715 class DarwinARMTargetInfo :
2716 public DarwinTargetInfo<ARMTargetInfo> {
2718 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2719 MacroBuilder &Builder) const {
2720 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
2724 DarwinARMTargetInfo(const std::string& triple)
2725 : DarwinTargetInfo<ARMTargetInfo>(triple) {
2726 HasAlignMac68kSupport = true;
2727 // iOS always has 64-bit atomic instructions.
2728 // FIXME: This should be based off of the target features in ARMTargetInfo.
2729 MaxAtomicInlineWidth = 64;
2732 } // end anonymous namespace.
2735 class SparcV8TargetInfo : public TargetInfo {
2736 static const TargetInfo::GCCRegAlias GCCRegAliases[];
2737 static const char * const GCCRegNames[];
2740 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
2741 // FIXME: Support Sparc quad-precision long double?
2742 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2743 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
2745 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
2746 const std::string &Name,
2747 bool Enabled) const {
2748 if (Name == "soft-float")
2749 Features[Name] = Enabled;
2755 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
2757 for (unsigned i = 0, e = Features.size(); i != e; ++i)
2758 if (Features[i] == "+soft-float")
2761 virtual void getTargetDefines(const LangOptions &Opts,
2762 MacroBuilder &Builder) const {
2763 DefineStd(Builder, "sparc", Opts);
2764 Builder.defineMacro("__sparcv8");
2765 Builder.defineMacro("__REGISTER_PREFIX__", "");
2768 Builder.defineMacro("SOFT_FLOAT", "1");
2770 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2771 unsigned &NumRecords) const {
2772 // FIXME: Implement!
2774 virtual const char *getVAListDeclaration() const {
2775 return "typedef void* __builtin_va_list;";
2777 virtual void getGCCRegNames(const char * const *&Names,
2778 unsigned &NumNames) const;
2779 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2780 unsigned &NumAliases) const;
2781 virtual bool validateAsmConstraint(const char *&Name,
2782 TargetInfo::ConstraintInfo &info) const {
2783 // FIXME: Implement!
2786 virtual const char *getClobbers() const {
2787 // FIXME: Implement!
2792 const char * const SparcV8TargetInfo::GCCRegNames[] = {
2793 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2794 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2795 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2796 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
2799 void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
2800 unsigned &NumNames) const {
2801 Names = GCCRegNames;
2802 NumNames = llvm::array_lengthof(GCCRegNames);
2805 const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
2816 { { "o2" }, "r10" },
2817 { { "o3" }, "r11" },
2818 { { "o4" }, "r12" },
2819 { { "o5" }, "r13" },
2820 { { "o6", "sp" }, "r14" },
2821 { { "o7" }, "r15" },
2822 { { "l0" }, "r16" },
2823 { { "l1" }, "r17" },
2824 { { "l2" }, "r18" },
2825 { { "l3" }, "r19" },
2826 { { "l4" }, "r20" },
2827 { { "l5" }, "r21" },
2828 { { "l6" }, "r22" },
2829 { { "l7" }, "r23" },
2830 { { "i0" }, "r24" },
2831 { { "i1" }, "r25" },
2832 { { "i2" }, "r26" },
2833 { { "i3" }, "r27" },
2834 { { "i4" }, "r28" },
2835 { { "i5" }, "r29" },
2836 { { "i6", "fp" }, "r30" },
2837 { { "i7" }, "r31" },
2840 void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
2841 unsigned &NumAliases) const {
2842 Aliases = GCCRegAliases;
2843 NumAliases = llvm::array_lengthof(GCCRegAliases);
2845 } // end anonymous namespace.
2848 class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
2850 AuroraUXSparcV8TargetInfo(const std::string& triple) :
2851 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
2852 SizeType = UnsignedInt;
2853 PtrDiffType = SignedInt;
2856 class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
2858 SolarisSparcV8TargetInfo(const std::string& triple) :
2859 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
2860 SizeType = UnsignedInt;
2861 PtrDiffType = SignedInt;
2864 } // end anonymous namespace.
2867 class MSP430TargetInfo : public TargetInfo {
2868 static const char * const GCCRegNames[];
2870 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
2871 TLSSupported = false;
2872 IntWidth = 16; IntAlign = 16;
2873 LongWidth = 32; LongLongWidth = 64;
2874 LongAlign = LongLongAlign = 16;
2875 PointerWidth = 16; PointerAlign = 16;
2876 SizeType = UnsignedInt;
2877 IntMaxType = SignedLong;
2878 UIntMaxType = UnsignedLong;
2879 IntPtrType = SignedShort;
2880 PtrDiffType = SignedInt;
2881 SigAtomicType = SignedLong;
2882 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
2884 virtual void getTargetDefines(const LangOptions &Opts,
2885 MacroBuilder &Builder) const {
2886 Builder.defineMacro("MSP430");
2887 Builder.defineMacro("__MSP430__");
2888 // FIXME: defines for different 'flavours' of MCU
2890 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2891 unsigned &NumRecords) const {
2892 // FIXME: Implement.
2896 virtual void getGCCRegNames(const char * const *&Names,
2897 unsigned &NumNames) const;
2898 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2899 unsigned &NumAliases) const {
2904 virtual bool validateAsmConstraint(const char *&Name,
2905 TargetInfo::ConstraintInfo &info) const {
2906 // No target constraints for now.
2909 virtual const char *getClobbers() const {
2910 // FIXME: Is this really right?
2913 virtual const char *getVAListDeclaration() const {
2915 return "typedef char* __builtin_va_list;";
2919 const char * const MSP430TargetInfo::GCCRegNames[] = {
2920 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2921 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2924 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
2925 unsigned &NumNames) const {
2926 Names = GCCRegNames;
2927 NumNames = llvm::array_lengthof(GCCRegNames);
2933 class SystemZTargetInfo : public TargetInfo {
2934 static const char * const GCCRegNames[];
2936 SystemZTargetInfo(const std::string& triple) : TargetInfo(triple) {
2937 TLSSupported = false;
2938 IntWidth = IntAlign = 32;
2939 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
2940 PointerWidth = PointerAlign = 64;
2941 DescriptionString = "E-p:64:64:64-i8:8:16-i16:16:16-i32:32:32-"
2942 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-a0:16:16-n32:64";
2944 virtual void getTargetDefines(const LangOptions &Opts,
2945 MacroBuilder &Builder) const {
2946 Builder.defineMacro("__s390__");
2947 Builder.defineMacro("__s390x__");
2949 virtual void getTargetBuiltins(const Builtin::Info *&Records,
2950 unsigned &NumRecords) const {
2951 // FIXME: Implement.
2956 virtual void getGCCRegNames(const char * const *&Names,
2957 unsigned &NumNames) const;
2958 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2959 unsigned &NumAliases) const {
2964 virtual bool validateAsmConstraint(const char *&Name,
2965 TargetInfo::ConstraintInfo &info) const {
2969 virtual const char *getClobbers() const {
2970 // FIXME: Is this really right?
2973 virtual const char *getVAListDeclaration() const {
2975 return "typedef char* __builtin_va_list;";
2979 const char * const SystemZTargetInfo::GCCRegNames[] = {
2980 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2981 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
2984 void SystemZTargetInfo::getGCCRegNames(const char * const *&Names,
2985 unsigned &NumNames) const {
2986 Names = GCCRegNames;
2987 NumNames = llvm::array_lengthof(GCCRegNames);
2992 class BlackfinTargetInfo : public TargetInfo {
2993 static const char * const GCCRegNames[];
2995 BlackfinTargetInfo(const std::string& triple) : TargetInfo(triple) {
2996 TLSSupported = false;
2999 LongDoubleAlign = 32;
3000 DescriptionString = "e-p:32:32-i64:32-f64:32-n32";
3003 virtual void getTargetDefines(const LangOptions &Opts,
3004 MacroBuilder &Builder) const {
3005 DefineStd(Builder, "bfin", Opts);
3006 DefineStd(Builder, "BFIN", Opts);
3007 Builder.defineMacro("__ADSPBLACKFIN__");
3008 // FIXME: This one is really dependent on -mcpu
3009 Builder.defineMacro("__ADSPLPBLACKFIN__");
3010 // FIXME: Add cpu-dependent defines and __SILICON_REVISION__
3013 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3014 unsigned &NumRecords) const {
3015 // FIXME: Implement.
3020 virtual void getGCCRegNames(const char * const *&Names,
3021 unsigned &NumNames) const;
3023 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3024 unsigned &NumAliases) const {
3030 virtual bool validateAsmConstraint(const char *&Name,
3031 TargetInfo::ConstraintInfo &Info) const {
3032 if (strchr("adzDWeABbvfcCtukxywZY", Name[0])) {
3033 Info.setAllowsRegister();
3039 virtual const char *getClobbers() const {
3043 virtual const char *getVAListDeclaration() const {
3044 return "typedef char* __builtin_va_list;";
3048 const char * const BlackfinTargetInfo::GCCRegNames[] = {
3049 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3050 "p0", "p1", "p2", "p3", "p4", "p5", "sp", "fp",
3051 "i0", "i1", "i2", "i3", "b0", "b1", "b2", "b3",
3052 "l0", "l1", "l2", "l3", "m0", "m1", "m2", "m3",
3054 "rets", "reti", "retx", "retn", "rete", "astat", "seqstat", "usp",
3055 "argp", "lt0", "lt1", "lc0", "lc1", "lb0", "lb1"
3058 void BlackfinTargetInfo::getGCCRegNames(const char * const *&Names,
3059 unsigned &NumNames) const {
3060 Names = GCCRegNames;
3061 NumNames = llvm::array_lengthof(GCCRegNames);
3067 // LLVM and Clang cannot be used directly to output native binaries for
3068 // target, but is used to compile C code to llvm bitcode with correct
3069 // type and alignment information.
3071 // TCE uses the llvm bitcode as input and uses it for generating customized
3072 // target processor and program binary. TCE co-design environment is
3073 // publicly available in http://tce.cs.tut.fi
3075 static const unsigned TCEOpenCLAddrSpaceMap[] = {
3078 5 // opencl_constant
3081 class TCETargetInfo : public TargetInfo{
3083 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
3084 TLSSupported = false;
3086 LongWidth = LongLongWidth = 32;
3089 LongAlign = LongLongAlign = 32;
3091 SizeType = UnsignedInt;
3092 IntMaxType = SignedLong;
3093 UIntMaxType = UnsignedLong;
3094 IntPtrType = SignedInt;
3095 PtrDiffType = SignedInt;
3100 LongDoubleWidth = 32;
3101 LongDoubleAlign = 32;
3102 FloatFormat = &llvm::APFloat::IEEEsingle;
3103 DoubleFormat = &llvm::APFloat::IEEEsingle;
3104 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
3105 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
3106 "i16:16:32-i32:32:32-i64:32:32-"
3107 "f32:32:32-f64:32:32-v64:32:32-"
3108 "v128:32:32-a0:0:32-n32";
3109 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
3112 virtual void getTargetDefines(const LangOptions &Opts,
3113 MacroBuilder &Builder) const {
3114 DefineStd(Builder, "tce", Opts);
3115 Builder.defineMacro("__TCE__");
3116 Builder.defineMacro("__TCE_V1__");
3118 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3119 unsigned &NumRecords) const {}
3120 virtual const char *getClobbers() const {
3123 virtual const char *getVAListDeclaration() const {
3124 return "typedef void* __builtin_va_list;";
3126 virtual void getGCCRegNames(const char * const *&Names,
3127 unsigned &NumNames) const {}
3128 virtual bool validateAsmConstraint(const char *&Name,
3129 TargetInfo::ConstraintInfo &info) const {
3132 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3133 unsigned &NumAliases) const {}
3138 class MipsTargetInfoBase : public TargetInfo {
3143 MipsTargetInfoBase(const std::string& triple, const std::string& ABIStr)
3144 : TargetInfo(triple), ABI(ABIStr) {
3145 SizeType = UnsignedInt;
3146 PtrDiffType = SignedInt;
3148 virtual const char *getABI() const { return ABI.c_str(); }
3149 virtual bool setABI(const std::string &Name) = 0;
3150 virtual bool setCPU(const std::string &Name) {
3154 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
3155 Features[ABI] = true;
3156 Features[CPU] = true;
3158 virtual void getArchDefines(const LangOptions &Opts,
3159 MacroBuilder &Builder) const = 0;
3160 virtual void getTargetDefines(const LangOptions &Opts,
3161 MacroBuilder &Builder) const = 0;
3162 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3163 unsigned &NumRecords) const {
3164 // FIXME: Implement!
3166 virtual const char *getVAListDeclaration() const {
3167 return "typedef void* __builtin_va_list;";
3169 virtual void getGCCRegNames(const char * const *&Names,
3170 unsigned &NumNames) const {
3171 static const char * const GCCRegNames[] = {
3172 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
3173 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
3174 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
3175 "$24", "$25", "$26", "$27", "$28", "$sp", "$fp", "$31",
3176 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
3177 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
3178 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
3179 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
3180 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
3181 "$fcc5","$fcc6","$fcc7"
3183 Names = GCCRegNames;
3184 NumNames = llvm::array_lengthof(GCCRegNames);
3186 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3187 unsigned &NumAliases) const = 0;
3188 virtual bool validateAsmConstraint(const char *&Name,
3189 TargetInfo::ConstraintInfo &Info) const {
3192 case 'r': // CPU registers.
3193 case 'd': // Equivalent to "r" unless generating MIPS16 code.
3194 case 'y': // Equivalent to "r", backwards compatibility only.
3195 case 'f': // floating-point registers.
3196 Info.setAllowsRegister();
3202 virtual const char *getClobbers() const {
3203 // FIXME: Implement!
3208 class Mips32TargetInfoBase : public MipsTargetInfoBase {
3210 Mips32TargetInfoBase(const std::string& triple) :
3211 MipsTargetInfoBase(triple, "o32") {}
3212 virtual bool setABI(const std::string &Name) {
3213 if ((Name == "o32") || (Name == "eabi")) {
3219 virtual void getArchDefines(const LangOptions &Opts,
3220 MacroBuilder &Builder) const {
3222 Builder.defineMacro("__mips_o32");
3223 Builder.defineMacro("_ABIO32", "1");
3224 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
3226 else if (ABI == "eabi")
3227 Builder.defineMacro("__mips_eabi");
3229 llvm_unreachable("Invalid ABI for Mips32.");
3231 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3232 unsigned &NumAliases) const {
3233 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3243 { { "t2" }, "$10" },
3244 { { "t3" }, "$11" },
3245 { { "t4" }, "$12" },
3246 { { "t5" }, "$13" },
3247 { { "t6" }, "$14" },
3248 { { "t7" }, "$15" },
3249 { { "s0" }, "$16" },
3250 { { "s1" }, "$17" },
3251 { { "s2" }, "$18" },
3252 { { "s3" }, "$19" },
3253 { { "s4" }, "$20" },
3254 { { "s5" }, "$21" },
3255 { { "s6" }, "$22" },
3256 { { "s7" }, "$23" },
3257 { { "t8" }, "$24" },
3258 { { "t9" }, "$25" },
3259 { { "k0" }, "$26" },
3260 { { "k1" }, "$27" },
3261 { { "gp" }, "$28" },
3262 { { "sp" }, "$29" },
3263 { { "fp" }, "$30" },
3266 Aliases = GCCRegAliases;
3267 NumAliases = llvm::array_lengthof(GCCRegAliases);
3271 class Mips32EBTargetInfo : public Mips32TargetInfoBase {
3273 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3274 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3275 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3277 virtual void getTargetDefines(const LangOptions &Opts,
3278 MacroBuilder &Builder) const {
3279 DefineStd(Builder, "mips", Opts);
3280 Builder.defineMacro("_mips");
3281 DefineStd(Builder, "MIPSEB", Opts);
3282 Builder.defineMacro("_MIPSEB");
3283 Builder.defineMacro("__REGISTER_PREFIX__", "");
3284 getArchDefines(Opts, Builder);
3288 class Mips32ELTargetInfo : public Mips32TargetInfoBase {
3290 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
3291 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3292 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3294 virtual void getTargetDefines(const LangOptions &Opts,
3295 MacroBuilder &Builder) const {
3296 DefineStd(Builder, "mips", Opts);
3297 Builder.defineMacro("_mips");
3298 DefineStd(Builder, "MIPSEL", Opts);
3299 Builder.defineMacro("_MIPSEL");
3300 Builder.defineMacro("__REGISTER_PREFIX__", "");
3301 getArchDefines(Opts, Builder);
3305 class Mips64TargetInfoBase : public MipsTargetInfoBase {
3306 virtual void SetDescriptionString(const std::string &Name) = 0;
3308 Mips64TargetInfoBase(const std::string& triple) :
3309 MipsTargetInfoBase(triple, "n64") {}
3310 virtual bool setABI(const std::string &Name) {
3311 SetDescriptionString(Name);
3312 if ((Name == "n32") || (Name == "n64")) {
3318 virtual void getArchDefines(const LangOptions &Opts,
3319 MacroBuilder &Builder) const {
3321 Builder.defineMacro("__mips_n32");
3322 Builder.defineMacro("_ABIN32", "2");
3323 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
3325 else if (ABI == "n64") {
3326 Builder.defineMacro("__mips_n64");
3327 Builder.defineMacro("_ABI64", "3");
3328 Builder.defineMacro("_MIPS_SIM", "_ABI64");
3331 llvm_unreachable("Invalid ABI for Mips64.");
3333 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3334 unsigned &NumAliases) const {
3335 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
3345 { { "a6" }, "$10" },
3346 { { "a7" }, "$11" },
3347 { { "t0" }, "$12" },
3348 { { "t1" }, "$13" },
3349 { { "t2" }, "$14" },
3350 { { "t3" }, "$15" },
3351 { { "s0" }, "$16" },
3352 { { "s1" }, "$17" },
3353 { { "s2" }, "$18" },
3354 { { "s3" }, "$19" },
3355 { { "s4" }, "$20" },
3356 { { "s5" }, "$21" },
3357 { { "s6" }, "$22" },
3358 { { "s7" }, "$23" },
3359 { { "t8" }, "$24" },
3360 { { "t9" }, "$25" },
3361 { { "k0" }, "$26" },
3362 { { "k1" }, "$27" },
3363 { { "gp" }, "$28" },
3364 { { "sp" }, "$29" },
3365 { { "fp" }, "$30" },
3368 Aliases = GCCRegAliases;
3369 NumAliases = llvm::array_lengthof(GCCRegAliases);
3373 class Mips64EBTargetInfo : public Mips64TargetInfoBase {
3374 virtual void SetDescriptionString(const std::string &Name) {
3375 // Change DescriptionString only if ABI is n32.
3377 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3378 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3381 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
3382 // Default ABI is n64.
3383 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3384 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3386 virtual void getTargetDefines(const LangOptions &Opts,
3387 MacroBuilder &Builder) const {
3388 DefineStd(Builder, "mips", Opts);
3389 Builder.defineMacro("_mips");
3390 DefineStd(Builder, "MIPSEB", Opts);
3391 Builder.defineMacro("_MIPSEB");
3392 Builder.defineMacro("__REGISTER_PREFIX__", "");
3393 getArchDefines(Opts, Builder);
3397 class Mips64ELTargetInfo : public Mips64TargetInfoBase {
3398 virtual void SetDescriptionString(const std::string &Name) {
3399 // Change DescriptionString only if ABI is n32.
3401 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3402 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3405 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
3406 // Default ABI is n64.
3407 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
3408 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
3410 virtual void getTargetDefines(const LangOptions &Opts,
3411 MacroBuilder &Builder) const {
3412 DefineStd(Builder, "mips", Opts);
3413 Builder.defineMacro("_mips");
3414 DefineStd(Builder, "MIPSEL", Opts);
3415 Builder.defineMacro("_MIPSEL");
3416 Builder.defineMacro("__REGISTER_PREFIX__", "");
3417 getArchDefines(Opts, Builder);
3420 } // end anonymous namespace.
3423 class PNaClTargetInfo : public TargetInfo {
3425 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
3426 this->UserLabelPrefix = "";
3427 this->LongAlign = 32;
3428 this->LongWidth = 32;
3429 this->PointerAlign = 32;
3430 this->PointerWidth = 32;
3431 this->IntMaxType = TargetInfo::SignedLongLong;
3432 this->UIntMaxType = TargetInfo::UnsignedLongLong;
3433 this->Int64Type = TargetInfo::SignedLongLong;
3434 this->DoubleAlign = 64;
3435 this->LongDoubleWidth = 64;
3436 this->LongDoubleAlign = 64;
3437 this->SizeType = TargetInfo::UnsignedInt;
3438 this->PtrDiffType = TargetInfo::SignedInt;
3439 this->IntPtrType = TargetInfo::SignedInt;
3440 this->RegParmMax = 2;
3441 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
3442 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
3445 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
3447 virtual void getArchDefines(const LangOptions &Opts,
3448 MacroBuilder &Builder) const {
3449 Builder.defineMacro("__le32__");
3450 Builder.defineMacro("__pnacl__");
3452 virtual void getTargetDefines(const LangOptions &Opts,
3453 MacroBuilder &Builder) const {
3454 DefineStd(Builder, "unix", Opts);
3455 Builder.defineMacro("__ELF__");
3456 if (Opts.POSIXThreads)
3457 Builder.defineMacro("_REENTRANT");
3459 Builder.defineMacro("_GNU_SOURCE");
3461 Builder.defineMacro("__native_client__");
3462 getArchDefines(Opts, Builder);
3464 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3465 unsigned &NumRecords) const {
3467 virtual const char *getVAListDeclaration() const {
3468 return "typedef int __builtin_va_list[4];";
3470 virtual void getGCCRegNames(const char * const *&Names,
3471 unsigned &NumNames) const;
3472 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3473 unsigned &NumAliases) const;
3474 virtual bool validateAsmConstraint(const char *&Name,
3475 TargetInfo::ConstraintInfo &Info) const {
3479 virtual const char *getClobbers() const {
3484 void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
3485 unsigned &NumNames) const {
3490 void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3491 unsigned &NumAliases) const {
3495 } // end anonymous namespace.
3498 //===----------------------------------------------------------------------===//
3500 //===----------------------------------------------------------------------===//
3502 static TargetInfo *AllocateTarget(const std::string &T) {
3503 llvm::Triple Triple(T);
3504 llvm::Triple::OSType os = Triple.getOS();
3506 switch (Triple.getArch()) {
3510 case llvm::Triple::arm:
3511 case llvm::Triple::thumb:
3512 if (Triple.isOSDarwin())
3513 return new DarwinARMTargetInfo(T);
3516 case llvm::Triple::Linux:
3517 return new LinuxTargetInfo<ARMTargetInfo>(T);
3518 case llvm::Triple::FreeBSD:
3519 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
3520 case llvm::Triple::NetBSD:
3521 return new NetBSDTargetInfo<ARMTargetInfo>(T);
3522 case llvm::Triple::RTEMS:
3523 return new RTEMSTargetInfo<ARMTargetInfo>(T);
3525 return new ARMTargetInfo(T);
3528 case llvm::Triple::bfin:
3529 if ( os == llvm::Triple::RTEMS )
3530 return new RTEMSTargetInfo<BlackfinTargetInfo>(T);
3531 return new BlackfinTargetInfo(T);
3533 case llvm::Triple::msp430:
3534 return new MSP430TargetInfo(T);
3536 case llvm::Triple::mips:
3538 case llvm::Triple::Linux:
3539 return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
3540 case llvm::Triple::RTEMS:
3541 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
3542 case llvm::Triple::FreeBSD:
3543 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
3544 case llvm::Triple::NetBSD:
3545 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
3547 return new Mips32EBTargetInfo(T);
3550 case llvm::Triple::mipsel:
3552 case llvm::Triple::Linux:
3553 return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
3554 case llvm::Triple::RTEMS:
3555 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
3556 case llvm::Triple::FreeBSD:
3557 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
3558 case llvm::Triple::NetBSD:
3559 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
3561 return new Mips32ELTargetInfo(T);
3564 case llvm::Triple::mips64:
3566 case llvm::Triple::Linux:
3567 return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
3568 case llvm::Triple::RTEMS:
3569 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
3570 case llvm::Triple::FreeBSD:
3571 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
3572 case llvm::Triple::NetBSD:
3573 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
3575 return new Mips64EBTargetInfo(T);
3578 case llvm::Triple::mips64el:
3580 case llvm::Triple::Linux:
3581 return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
3582 case llvm::Triple::RTEMS:
3583 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
3584 case llvm::Triple::FreeBSD:
3585 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
3586 case llvm::Triple::NetBSD:
3587 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
3589 return new Mips64ELTargetInfo(T);
3592 case llvm::Triple::le32:
3594 case llvm::Triple::NativeClient:
3595 return new PNaClTargetInfo(T);
3600 case llvm::Triple::ppc:
3601 if (Triple.isOSDarwin())
3602 return new DarwinPPC32TargetInfo(T);
3604 case llvm::Triple::Linux:
3605 return new LinuxTargetInfo<PPC32TargetInfo>(T);
3606 case llvm::Triple::FreeBSD:
3607 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
3608 case llvm::Triple::NetBSD:
3609 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
3610 case llvm::Triple::RTEMS:
3611 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
3613 return new PPC32TargetInfo(T);
3616 case llvm::Triple::ppc64:
3617 if (Triple.isOSDarwin())
3618 return new DarwinPPC64TargetInfo(T);
3620 case llvm::Triple::Linux:
3621 return new LinuxTargetInfo<PPC64TargetInfo>(T);
3622 case llvm::Triple::Lv2:
3623 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
3624 case llvm::Triple::FreeBSD:
3625 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
3626 case llvm::Triple::NetBSD:
3627 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
3629 return new PPC64TargetInfo(T);
3632 case llvm::Triple::ptx32:
3633 return new PTX32TargetInfo(T);
3634 case llvm::Triple::ptx64:
3635 return new PTX64TargetInfo(T);
3637 case llvm::Triple::mblaze:
3638 return new MBlazeTargetInfo(T);
3640 case llvm::Triple::sparc:
3642 case llvm::Triple::Linux:
3643 return new LinuxTargetInfo<SparcV8TargetInfo>(T);
3644 case llvm::Triple::AuroraUX:
3645 return new AuroraUXSparcV8TargetInfo(T);
3646 case llvm::Triple::Solaris:
3647 return new SolarisSparcV8TargetInfo(T);
3648 case llvm::Triple::NetBSD:
3649 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
3650 case llvm::Triple::RTEMS:
3651 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
3653 return new SparcV8TargetInfo(T);
3656 // FIXME: Need a real SPU target.
3657 case llvm::Triple::cellspu:
3658 return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
3660 case llvm::Triple::systemz:
3661 return new SystemZTargetInfo(T);
3663 case llvm::Triple::tce:
3664 return new TCETargetInfo(T);
3666 case llvm::Triple::x86:
3667 if (Triple.isOSDarwin())
3668 return new DarwinI386TargetInfo(T);
3671 case llvm::Triple::AuroraUX:
3672 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
3673 case llvm::Triple::Linux:
3674 return new LinuxTargetInfo<X86_32TargetInfo>(T);
3675 case llvm::Triple::DragonFly:
3676 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
3677 case llvm::Triple::NetBSD:
3678 return new NetBSDTargetInfo<X86_32TargetInfo>(T);
3679 case llvm::Triple::OpenBSD:
3680 return new OpenBSDI386TargetInfo(T);
3681 case llvm::Triple::FreeBSD:
3682 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
3683 case llvm::Triple::Minix:
3684 return new MinixTargetInfo<X86_32TargetInfo>(T);
3685 case llvm::Triple::Solaris:
3686 return new SolarisTargetInfo<X86_32TargetInfo>(T);
3687 case llvm::Triple::Cygwin:
3688 return new CygwinX86_32TargetInfo(T);
3689 case llvm::Triple::MinGW32:
3690 return new MinGWX86_32TargetInfo(T);
3691 case llvm::Triple::Win32:
3692 return new VisualStudioWindowsX86_32TargetInfo(T);
3693 case llvm::Triple::Haiku:
3694 return new HaikuX86_32TargetInfo(T);
3695 case llvm::Triple::RTEMS:
3696 return new RTEMSX86_32TargetInfo(T);
3698 return new X86_32TargetInfo(T);
3701 case llvm::Triple::x86_64:
3702 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
3703 return new DarwinX86_64TargetInfo(T);
3706 case llvm::Triple::AuroraUX:
3707 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
3708 case llvm::Triple::Linux:
3709 return new LinuxTargetInfo<X86_64TargetInfo>(T);
3710 case llvm::Triple::DragonFly:
3711 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
3712 case llvm::Triple::NetBSD:
3713 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
3714 case llvm::Triple::OpenBSD:
3715 return new OpenBSDX86_64TargetInfo(T);
3716 case llvm::Triple::FreeBSD:
3717 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
3718 case llvm::Triple::Solaris:
3719 return new SolarisTargetInfo<X86_64TargetInfo>(T);
3720 case llvm::Triple::MinGW32:
3721 return new MinGWX86_64TargetInfo(T);
3722 case llvm::Triple::Win32: // This is what Triple.h supports now.
3723 return new VisualStudioWindowsX86_64TargetInfo(T);
3725 return new X86_64TargetInfo(T);
3730 /// CreateTargetInfo - Return the target info object for the specified target
3732 TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
3733 TargetOptions &Opts) {
3734 llvm::Triple Triple(Opts.Triple);
3736 // Construct the target
3737 llvm::OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
3739 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
3743 // Set the target CPU if specified.
3744 if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
3745 Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
3749 // Set the target ABI if specified.
3750 if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
3751 Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
3755 // Set the target C++ ABI.
3756 if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
3757 Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
3761 // Compute the default target features, we need the target to handle this
3762 // because features may have dependencies on one another.
3763 llvm::StringMap<bool> Features;
3764 Target->getDefaultFeatures(Features);
3766 // Apply the user specified deltas.
3767 for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
3768 ie = Opts.Features.end(); it != ie; ++it) {
3769 const char *Name = it->c_str();
3771 // Apply the feature via the target.
3772 if ((Name[0] != '-' && Name[0] != '+') ||
3773 !Target->setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
3774 Diags.Report(diag::err_target_invalid_feature) << Name;
3779 // Add the features to the compile options.
3781 // FIXME: If we are completely confident that we have the right set, we only
3782 // need to pass the minuses.
3783 Opts.Features.clear();
3784 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
3785 ie = Features.end(); it != ie; ++it)
3786 Opts.Features.push_back(std::string(it->second ? "+" : "-") +
3788 Target->HandleTargetFeatures(Opts.Features);
3790 return Target.take();