diff options
Diffstat (limited to 'lib/Basic/Targets.cpp')
-rw-r--r-- | lib/Basic/Targets.cpp | 348 |
1 files changed, 247 insertions, 101 deletions
diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index dd167dca47b2..3518ea6f7986 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -84,14 +84,28 @@ static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts, Builder.defineMacro("__MACH__"); Builder.defineMacro("OBJC_NEW_PROPERTIES"); - // __weak is always defined, for use in blocks and with objc pointers. - Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))"); + if (!Opts.ObjCAutoRefCount) { + // __weak is always defined, for use in blocks and with objc pointers. + Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))"); - // Darwin defines __strong even in C mode (just to nothing). - if (!Opts.ObjC1 || Opts.getGCMode() == LangOptions::NonGC) - Builder.defineMacro("__strong", ""); - else - Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))"); + // Darwin defines __strong even in C mode (just to nothing). + if (Opts.getGCMode() != LangOptions::NonGC) + Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))"); + else + Builder.defineMacro("__strong", ""); + + // __unsafe_unretained is defined to nothing in non-ARC mode. We even + // allow this in C, since one might have block pointers in structs that + // are used in pure C code and in Objective-C ARC. + Builder.defineMacro("__unsafe_unretained", ""); + + // The Objective-C bridged cast keywords are defined to nothing in non-ARC + // mode; then they become normal, C-style casts. + Builder.defineMacro("__bridge", ""); + Builder.defineMacro("__bridge_transfer", ""); + Builder.defineMacro("__bridge_retained", ""); + Builder.defineMacro("__bridge_retain", ""); + } if (Opts.Static) Builder.defineMacro("__STATIC__"); @@ -168,14 +182,15 @@ class DarwinTargetInfo : public OSTargetInfo<Target> { protected: virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const { - getDarwinDefines(Builder, Opts, Triple, this->PlatformName, + getDarwinDefines(Builder, Opts, Triple, this->PlatformName, this->PlatformMinVersion); } public: DarwinTargetInfo(const std::string& triple) : OSTargetInfo<Target>(triple) { - this->TLSSupported = llvm::Triple(triple).getDarwinMajorNumber() > 10; + llvm::Triple T = llvm::Triple(triple); + this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7); this->MCountName = "\01mcount"; } @@ -512,7 +527,6 @@ class PPCTargetInfo : public TargetInfo { static const Builtin::Info BuiltinInfo[]; static const char * const GCCRegNames[]; static const TargetInfo::GCCRegAlias GCCRegAliases[]; - public: PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {} @@ -633,9 +647,9 @@ public: }; const Builtin::Info PPCTargetInfo::BuiltinInfo[] = { -#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false }, +#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ - ALL_LANGUAGES, false }, + ALL_LANGUAGES }, #include "clang/Basic/BuiltinsPPC.def" }; @@ -660,7 +674,8 @@ void PPCTargetInfo::getTargetDefines(const LangOptions &Opts, } // Target properties. - Builder.defineMacro("_BIG_ENDIAN"); + if (getTriple().getOS() != llvm::Triple::NetBSD) + Builder.defineMacro("_BIG_ENDIAN"); Builder.defineMacro("__BIG_ENDIAN__"); // Subtarget options. @@ -788,8 +803,14 @@ public: DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32"; - if (getTriple().getOS() == llvm::Triple::FreeBSD) - SizeType = UnsignedInt; + switch (getTriple().getOS()) { + case llvm::Triple::FreeBSD: + case llvm::Triple::NetBSD: + SizeType = UnsignedInt; + break; + default: + break; + } } virtual const char *getVAListDeclaration() const { @@ -890,9 +911,9 @@ namespace { }; const Builtin::Info PTXTargetInfo::BuiltinInfo[] = { -#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false }, +#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ - ALL_LANGUAGES, false }, + ALL_LANGUAGES }, #include "clang/Basic/BuiltinsPTX.def" }; @@ -1058,49 +1079,49 @@ void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, namespace { // Namespace for x86 abstract base class const Builtin::Info BuiltinInfo[] = { -#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false }, +#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ - ALL_LANGUAGES, false }, + ALL_LANGUAGES }, #include "clang/Basic/BuiltinsX86.def" }; static const char* const GCCRegNames[] = { "ax", "dx", "cx", "bx", "si", "di", "bp", "sp", "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)", - "argp", "flags", "fspr", "dirflag", "frame", + "argp", "flags", "fpcr", "fpsr", "dirflag", "frame", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", - "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15" + "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15", }; -const TargetInfo::GCCRegAlias GCCRegAliases[] = { - { { "al", "ah", "eax", "rax" }, "ax" }, - { { "bl", "bh", "ebx", "rbx" }, "bx" }, - { { "cl", "ch", "ecx", "rcx" }, "cx" }, - { { "dl", "dh", "edx", "rdx" }, "dx" }, - { { "esi", "rsi" }, "si" }, - { { "edi", "rdi" }, "di" }, - { { "esp", "rsp" }, "sp" }, - { { "ebp", "rbp" }, "bp" }, +const TargetInfo::AddlRegName AddlRegNames[] = { + { { "al", "ah", "eax", "rax" }, 0 }, + { { "bl", "bh", "ebx", "rbx" }, 3 }, + { { "cl", "ch", "ecx", "rcx" }, 2 }, + { { "dl", "dh", "edx", "rdx" }, 1 }, + { { "esi", "rsi" }, 4 }, + { { "edi", "rdi" }, 5 }, + { { "esp", "rsp" }, 7 }, + { { "ebp", "rbp" }, 6 }, }; // X86 target abstract base class; x86-32 and x86-64 are very close, so // most of the implementation can be shared. class X86TargetInfo : public TargetInfo { enum X86SSEEnum { - NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42 + NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42 } SSELevel; - enum AMD3DNowEnum { - NoAMD3DNow, AMD3DNow, AMD3DNowAthlon - } AMD3DNowLevel; + enum MMX3DNowEnum { + NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon + } MMX3DNowLevel; bool HasAES; bool HasAVX; public: X86TargetInfo(const std::string& triple) - : TargetInfo(triple), SSELevel(NoMMXSSE), AMD3DNowLevel(NoAMD3DNow), + : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow), HasAES(false), HasAVX(false) { LongDoubleFormat = &llvm::APFloat::x87DoubleExtended; } @@ -1116,8 +1137,13 @@ public: } virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, unsigned &NumAliases) const { - Aliases = GCCRegAliases; - NumAliases = llvm::array_lengthof(GCCRegAliases); + Aliases = 0; + NumAliases = 0; + } + virtual void getGCCAddlRegNames(const AddlRegName *&Names, + unsigned &NumNames) const { + Names = AddlRegNames; + NumNames = llvm::array_lengthof(AddlRegNames); } virtual bool validateAsmConstraint(const char *&Name, TargetInfo::ConstraintInfo &info) const; @@ -1133,6 +1159,9 @@ public: virtual void getDefaultFeatures(const std::string &CPU, llvm::StringMap<bool> &Features) const; virtual void HandleTargetFeatures(std::vector<std::string> &Features); + virtual const char* getABI() const { + return MMX3DNowLevel == NoMMX3DNow ? "no-mmx" : ""; + } }; void X86TargetInfo::getDefaultFeatures(const std::string &CPU, @@ -1164,31 +1193,38 @@ void X86TargetInfo::getDefaultFeatures(const std::string &CPU, ; else if (CPU == "pentium-mmx" || CPU == "pentium2") setFeatureEnabled(Features, "mmx", true); - else if (CPU == "pentium3") + else if (CPU == "pentium3") { + setFeatureEnabled(Features, "mmx", true); setFeatureEnabled(Features, "sse", true); - else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64") + } else if (CPU == "pentium-m" || CPU == "pentium4" || CPU == "x86-64") { + setFeatureEnabled(Features, "mmx", true); setFeatureEnabled(Features, "sse2", true); - else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona") + } else if (CPU == "yonah" || CPU == "prescott" || CPU == "nocona") { + setFeatureEnabled(Features, "mmx", true); setFeatureEnabled(Features, "sse3", true); - else if (CPU == "core2") + } else if (CPU == "core2") { + setFeatureEnabled(Features, "mmx", true); setFeatureEnabled(Features, "ssse3", true); - else if (CPU == "penryn") { + } else if (CPU == "penryn") { + setFeatureEnabled(Features, "mmx", true); setFeatureEnabled(Features, "sse4", true); Features["sse42"] = false; - } else if (CPU == "atom") + } else if (CPU == "atom") { + setFeatureEnabled(Features, "mmx", true); setFeatureEnabled(Features, "sse3", true); - else if (CPU == "corei7") { + } else if (CPU == "corei7") { + setFeatureEnabled(Features, "mmx", true); setFeatureEnabled(Features, "sse4", true); setFeatureEnabled(Features, "aes", true); } else if (CPU == "corei7-avx") { + setFeatureEnabled(Features, "mmx", true); setFeatureEnabled(Features, "sse4", true); setFeatureEnabled(Features, "aes", true); -// setFeatureEnabled(Features, "avx", true); + //setFeatureEnabled(Features, "avx", true); } else if (CPU == "k6" || CPU == "winchip-c6") setFeatureEnabled(Features, "mmx", true); else if (CPU == "k6-2" || CPU == "k6-3" || CPU == "athlon" || CPU == "athlon-tbird" || CPU == "winchip2" || CPU == "c3") { - setFeatureEnabled(Features, "mmx", true); setFeatureEnabled(Features, "3dnow", true); } else if (CPU == "athlon-4" || CPU == "athlon-xp" || CPU == "athlon-mp") { setFeatureEnabled(Features, "sse", true); @@ -1200,8 +1236,10 @@ void X86TargetInfo::getDefaultFeatures(const std::string &CPU, } else if (CPU == "k8-sse3") { setFeatureEnabled(Features, "sse3", true); setFeatureEnabled(Features, "3dnowa", true); - } else if (CPU == "c3-2") + } else if (CPU == "c3-2") { + setFeatureEnabled(Features, "mmx", true); setFeatureEnabled(Features, "sse", true); + } } bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features, @@ -1217,34 +1255,31 @@ bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features, if (Name == "mmx") Features["mmx"] = true; else if (Name == "sse") - Features["mmx"] = Features["sse"] = true; + Features["sse"] = true; else if (Name == "sse2") - Features["mmx"] = Features["sse"] = Features["sse2"] = true; + Features["sse"] = Features["sse2"] = true; else if (Name == "sse3") - Features["mmx"] = Features["sse"] = Features["sse2"] = - Features["sse3"] = true; + Features["sse"] = Features["sse2"] = Features["sse3"] = true; else if (Name == "ssse3") - Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = + Features["sse"] = Features["sse2"] = Features["sse3"] = Features["ssse3"] = true; else if (Name == "sse4" || Name == "sse4.2") - Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = + Features["sse"] = Features["sse2"] = Features["sse3"] = Features["ssse3"] = Features["sse41"] = Features["sse42"] = true; else if (Name == "sse4.1") - Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] = + Features["sse"] = Features["sse2"] = Features["sse3"] = Features["ssse3"] = Features["sse41"] = true; else if (Name == "3dnow") - Features["3dnowa"] = true; + Features["mmx"] = Features["3dnow"] = true; else if (Name == "3dnowa") - Features["3dnow"] = Features["3dnowa"] = true; + Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true; else if (Name == "aes") Features["aes"] = true; else if (Name == "avx") Features["avx"] = true; } else { if (Name == "mmx") - Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = - Features["sse"] = Features["sse2"] = Features["sse3"] = - Features["ssse3"] = Features["sse41"] = Features["sse42"] = false; + Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false; else if (Name == "sse") Features["sse"] = Features["sse2"] = Features["sse3"] = Features["ssse3"] = Features["sse41"] = Features["sse42"] = false; @@ -1302,18 +1337,25 @@ void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) { .Case("sse3", SSE3) .Case("sse2", SSE2) .Case("sse", SSE1) - .Case("mmx", MMX) - .Default(NoMMXSSE); + .Default(NoSSE); SSELevel = std::max(SSELevel, Level); - AMD3DNowEnum ThreeDNowLevel = - llvm::StringSwitch<AMD3DNowEnum>(Features[i].substr(1)) + MMX3DNowEnum ThreeDNowLevel = + llvm::StringSwitch<MMX3DNowEnum>(Features[i].substr(1)) .Case("3dnowa", AMD3DNowAthlon) .Case("3dnow", AMD3DNow) - .Default(NoAMD3DNow); + .Case("mmx", MMX) + .Default(NoMMX3DNow); - AMD3DNowLevel = std::max(AMD3DNowLevel, ThreeDNowLevel); + MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel); } + + // Don't tell the backend if we're turning off mmx; it will end up disabling + // SSE, which we don't want. + std::vector<std::string>::iterator it; + it = std::find(Features.begin(), Features.end(), "-mmx"); + if (it != Features.end()) + Features.erase(it); } /// X86TargetInfo::getTargetDefines - Return a set of the X86-specific #defines @@ -1368,9 +1410,7 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts, case SSE1: Builder.defineMacro("__SSE__"); Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied. - case MMX: - Builder.defineMacro("__MMX__"); - case NoMMXSSE: + case NoSSE: break; } @@ -1392,12 +1432,14 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts, } // Each case falls through to the previous one here. - switch (AMD3DNowLevel) { + switch (MMX3DNowLevel) { case AMD3DNowAthlon: Builder.defineMacro("__3dNOW_A__"); case AMD3DNow: Builder.defineMacro("__3dNOW__"); - case NoAMD3DNow: + case MMX: + Builder.defineMacro("__MMX__"); + case NoMMX3DNow: break; } } @@ -1647,6 +1689,65 @@ public: }; } // end anonymous namespace +// RTEMS Target +template<typename Target> +class RTEMSTargetInfo : public OSTargetInfo<Target> { +protected: + virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, + MacroBuilder &Builder) const { + // RTEMS defines; list based off of gcc output + + // FIXME: Move version number handling to llvm::Triple. + llvm::StringRef Release = Triple.getOSName().substr(strlen("rtems"), 1); + + Builder.defineMacro("__rtems__"); + Builder.defineMacro("__ELF__"); + } +public: + RTEMSTargetInfo(const std::string &triple) + : OSTargetInfo<Target>(triple) { + this->UserLabelPrefix = ""; + + llvm::Triple Triple(triple); + switch (Triple.getArch()) { + default: + case llvm::Triple::x86: + // this->MCountName = ".mcount"; + break; + case llvm::Triple::mips: + case llvm::Triple::mipsel: + case llvm::Triple::ppc: + case llvm::Triple::ppc64: + // this->MCountName = "_mcount"; + break; + case llvm::Triple::arm: + // this->MCountName = "__mcount"; + break; + } + + } +}; + +namespace { +// x86-32 RTEMS target +class RTEMSX86_32TargetInfo : public X86_32TargetInfo { +public: + RTEMSX86_32TargetInfo(const std::string& triple) + : X86_32TargetInfo(triple) { + SizeType = UnsignedLong; + IntPtrType = SignedLong; + PtrDiffType = SignedLong; + this->UserLabelPrefix = ""; + } + virtual void getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const { + X86_32TargetInfo::getTargetDefines(Opts, Builder); + Builder.defineMacro("__INTEL__"); + Builder.defineMacro("__rtems__"); + } +}; +} // end anonymous namespace + namespace { // x86-64 generic target class X86_64TargetInfo : public X86TargetInfo { @@ -1861,7 +1962,7 @@ public: // Thumb1 add sp, #imm requires the immediate value be multiple of 4, // so set preferred for small types to 32. DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-" - "i64:32:32-f32:32:32-f64:32:32-" + "i64:32:64-f32:32:32-f64:32:64-" "v64:32:64-v128:32:128-a0:0:32-n32"); } else { DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" @@ -1882,11 +1983,6 @@ public: void getDefaultFeatures(const std::string &CPU, llvm::StringMap<bool> &Features) const { - // FIXME: This should not be here. - Features["vfp2"] = false; - Features["vfp3"] = false; - Features["neon"] = false; - if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore") Features["vfp2"] = true; else if (CPU == "cortex-a8" || CPU == "cortex-a9") @@ -1896,12 +1992,8 @@ public: virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features, const std::string &Name, bool Enabled) const { - if (Name == "soft-float" || Name == "soft-float-abi") { - Features[Name] = Enabled; - } else if (Name == "vfp2" || Name == "vfp3" || Name == "neon") { - // These effectively are a single option, reset them when any is enabled. - if (Enabled) - Features["vfp2"] = Features["vfp3"] = Features["neon"] = false; + if (Name == "soft-float" || Name == "soft-float-abi" || + Name == "vfp2" || Name == "vfp3" || Name == "neon") { Features[Name] = Enabled; } else return false; @@ -2042,6 +2134,12 @@ public: case 'q': // ...ARMV4 ldrsb case 'v': // ...VFP load/store (reg+constant offset) case 'y': // ...iWMMXt load/store + case 't': // address valid for load/store opaque types wider + // than 128-bits + case 'n': // valid address for Neon doubleword vector load/store + case 'm': // valid address for Neon element and structure load/store + case 's': // valid address for non-offset loads/stores of quad-word + // values in four ARM registers Info.setAllowsMemory(); Name++; return true; @@ -2049,14 +2147,16 @@ public: } return false; } - std::string - virtual convertConstraint(const char *&Constraint) const { + virtual std::string convertConstraint(const char *&Constraint) const { std::string R; switch (*Constraint) { case 'U': // Two-character constraint; add "^" hint for later parsing. R = std::string("^") + std::string(Constraint, 2); Constraint++; break; + case 'p': // 'p' should be translated to 'r' by default. + R = std::string("r"); + break; default: return std::string(1, *Constraint); } @@ -2124,9 +2224,9 @@ void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, } const Builtin::Info ARMTargetInfo::BuiltinInfo[] = { -#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false }, +#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ - ALL_LANGUAGES, false }, + ALL_LANGUAGES }, #include "clang/Basic/BuiltinsARM.def" }; } // end anonymous namespace. @@ -2727,45 +2827,81 @@ static TargetInfo *AllocateTarget(const std::string &T) { return new LinuxTargetInfo<ARMTargetInfo>(T); case llvm::Triple::FreeBSD: return new FreeBSDTargetInfo<ARMTargetInfo>(T); + case llvm::Triple::NetBSD: + return new NetBSDTargetInfo<ARMTargetInfo>(T); + case llvm::Triple::RTEMS: + return new RTEMSTargetInfo<ARMTargetInfo>(T); default: return new ARMTargetInfo(T); } case llvm::Triple::bfin: + if ( os == llvm::Triple::RTEMS ) + return new RTEMSTargetInfo<BlackfinTargetInfo>(T); return new BlackfinTargetInfo(T); case llvm::Triple::msp430: return new MSP430TargetInfo(T); case llvm::Triple::mips: - if (os == llvm::Triple::Psp) + switch (os) { + case llvm::Triple::Psp: return new PSPTargetInfo<MipsTargetInfo>(T); - if (os == llvm::Triple::Linux) + case llvm::Triple::Linux: return new LinuxTargetInfo<MipsTargetInfo>(T); - return new MipsTargetInfo(T); + case llvm::Triple::RTEMS: + return new RTEMSTargetInfo<MipsTargetInfo>(T); + case llvm::Triple::FreeBSD: + return new FreeBSDTargetInfo<MipsTargetInfo>(T); + case llvm::Triple::NetBSD: + return new NetBSDTargetInfo<MipsTargetInfo>(T); + default: + return new MipsTargetInfo(T); + } case llvm::Triple::mipsel: - if (os == llvm::Triple::Psp) + switch (os) { + case llvm::Triple::Psp: return new PSPTargetInfo<MipselTargetInfo>(T); - if (os == llvm::Triple::Linux) + case llvm::Triple::Linux: return new LinuxTargetInfo<MipselTargetInfo>(T); - return new MipselTargetInfo(T); + case llvm::Triple::RTEMS: + return new RTEMSTargetInfo<MipselTargetInfo>(T); + case llvm::Triple::FreeBSD: + return new FreeBSDTargetInfo<MipselTargetInfo>(T); + case llvm::Triple::NetBSD: + return new NetBSDTargetInfo<MipselTargetInfo>(T); + default: + return new MipsTargetInfo(T); + } case llvm::Triple::ppc: if (Triple.isOSDarwin()) return new DarwinPPC32TargetInfo(T); - else if (os == llvm::Triple::FreeBSD) + switch (os) { + case llvm::Triple::FreeBSD: return new FreeBSDTargetInfo<PPC32TargetInfo>(T); - return new PPC32TargetInfo(T); + case llvm::Triple::NetBSD: + return new NetBSDTargetInfo<PPC32TargetInfo>(T); + case llvm::Triple::RTEMS: + return new RTEMSTargetInfo<PPC32TargetInfo>(T); + default: + return new PPC32TargetInfo(T); + } case llvm::Triple::ppc64: if (Triple.isOSDarwin()) return new DarwinPPC64TargetInfo(T); - else if (os == llvm::Triple::Lv2) + switch (os) { + case llvm::Triple::Lv2: return new PS3PPUTargetInfo<PPC64TargetInfo>(T); - else if (os == llvm::Triple::FreeBSD) + case llvm::Triple::FreeBSD: return new FreeBSDTargetInfo<PPC64TargetInfo>(T); - return new PPC64TargetInfo(T); + case llvm::Triple::NetBSD: + return new NetBSDTargetInfo<PPC64TargetInfo>(T); + default: + return new PPC64TargetInfo(T); + } case llvm::Triple::ptx32: return new PTX32TargetInfo(T); @@ -2776,11 +2912,18 @@ static TargetInfo *AllocateTarget(const std::string &T) { return new MBlazeTargetInfo(T); case llvm::Triple::sparc: - if (os == llvm::Triple::AuroraUX) + switch (os) { + case llvm::Triple::AuroraUX: return new AuroraUXSparcV8TargetInfo(T); - if (os == llvm::Triple::Solaris) + case llvm::Triple::Solaris: return new SolarisSparcV8TargetInfo(T); - return new SparcV8TargetInfo(T); + case llvm::Triple::NetBSD: + return new NetBSDTargetInfo<SparcV8TargetInfo>(T); + case llvm::Triple::RTEMS: + return new RTEMSTargetInfo<SparcV8TargetInfo>(T); + default: + return new SparcV8TargetInfo(T); + } // FIXME: Need a real SPU target. case llvm::Triple::cellspu: @@ -2821,6 +2964,8 @@ static TargetInfo *AllocateTarget(const std::string &T) { return new VisualStudioWindowsX86_32TargetInfo(T); case llvm::Triple::Haiku: return new HaikuX86_32TargetInfo(T); + case llvm::Triple::RTEMS: + return new RTEMSX86_32TargetInfo(T); default: return new X86_32TargetInfo(T); } @@ -2910,7 +3055,8 @@ TargetInfo *TargetInfo::CreateTargetInfo(Diagnostic &Diags, Opts.Features.clear(); for (llvm::StringMap<bool>::const_iterator it = Features.begin(), ie = Features.end(); it != ie; ++it) - Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first()); + Opts.Features.push_back(std::string(it->second ? "+" : "-") + + it->first().str()); Target->HandleTargetFeatures(Opts.Features); return Target.take(); |