diff options
author | Michael J. Spencer <bigcheesegs@gmail.com> | 2010-10-21 03:13:04 +0000 |
---|---|---|
committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2010-10-21 03:13:04 +0000 |
commit | 712392e4deb5b14e04047bdaab799b82c5bed37c (patch) | |
tree | 12ad6c95c7f4840dd72bd4f3301dc97f4d6ceccf /lib/Basic/Targets.cpp | |
parent | b41d899a6023385c00a61eb9dd3e44db9dc7994e (diff) |
Cleanup and fix predefined macros for windows.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116988 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Basic/Targets.cpp')
-rw-r--r-- | lib/Basic/Targets.cpp | 125 |
1 files changed, 72 insertions, 53 deletions
diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 31a55b6c94..ffd46c99fa 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -405,6 +405,54 @@ public: // FIXME: WIntType should be SignedLong } }; + +// Windows target +template<typename Target> +class WindowsTargetInfo : public OSTargetInfo<Target> { +protected: + virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, + MacroBuilder &Builder) const { + if (Opts.CPlusPlus) { + if (Opts.RTTI) + Builder.defineMacro("_CPPRTTI"); + + if (Opts.Exceptions) + Builder.defineMacro("_CPPUNWIND"); + } + + if (!Opts.CharIsSigned) + Builder.defineMacro("_CHAR_UNSIGNED"); + + // FIXME: POSIXThreads isn't exactly the option this should be defined for, + // but it works for now. + if (Opts.POSIXThreads) + Builder.defineMacro("_MT"); + + if (Opts.Microsoft) { + Builder.defineMacro("_MSC_EXTENSIONS"); + + // Pretend to be the compiler that ships with Visual Studio 2003. + Builder.defineMacro("_MSC_VER", llvm::Twine(1300)); + + if (Opts.CPlusPlus0x) { + Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED"); + Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED"); + Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED"); + } + } + + Builder.defineMacro("_INTEGRAL_MAX_BITS", "64"); + Builder.defineMacro("_WIN32"); + } + + virtual const char *getVAListDeclaration() const { + return "typedef char* __builtin_va_list;"; + } +public: + WindowsTargetInfo(const std::string &triple) + : OSTargetInfo<Target>(triple) {} +}; + } // end anonymous namespace. //===----------------------------------------------------------------------===// @@ -1185,6 +1233,21 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts, break; } + if (Opts.Microsoft && PointerWidth == 32) { + Builder.defineMacro("_M_IX86", "600"); + + switch (SSELevel) { + case SSE2: + Builder.defineMacro("_M_IX86_FP", llvm::Twine(2)); + break; + case SSE1: + Builder.defineMacro("_M_IX86_FP", llvm::Twine(1)); + break; + default: + Builder.defineMacro("_M_IX86_FP", llvm::Twine(0)); + } + } + // Each case falls through to the previous one here. switch (AMD3DNowLevel) { case AMD3DNowAthlon: @@ -1325,10 +1388,10 @@ public: namespace { // x86-32 Windows target -class WindowsX86_32TargetInfo : public X86_32TargetInfo { +class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> { public: WindowsX86_32TargetInfo(const std::string& triple) - : X86_32TargetInfo(triple) { + : WindowsTargetInfo<X86_32TargetInfo>(triple) { TLSSupported = false; WCharType = UnsignedShort; DoubleAlign = LongLongAlign = 64; @@ -1336,38 +1399,8 @@ public: "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-" "v128:128:128-a0:0:64-f80:32:32-n8:16:32"; } - virtual void getTargetDefines(const LangOptions &Opts, - MacroBuilder &Builder) const { - X86_32TargetInfo::getTargetDefines(Opts, Builder); - // This list is based off of the the list of things MingW defines - Builder.defineMacro("_WIN32"); - DefineStd(Builder, "WIN32", Opts); - DefineStd(Builder, "WINNT", Opts); - Builder.defineMacro("_X86_"); - } -}; -} // end anonymous namespace - -namespace { - -// x86-32 Windows Visual Studio target -class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo { -public: - VisualStudioWindowsX86_32TargetInfo(const std::string& triple) - : WindowsX86_32TargetInfo(triple) { LongDoubleWidth = 64; LongDoubleFormat = &llvm::APFloat::IEEEdouble; - } - virtual void getTargetDefines(const LangOptions &Opts, - MacroBuilder &Builder) const { - WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder); - // The value of the following reflects processor type. - // 300=386, 400=486, 500=Pentium, 600=Blend (default) - // We lost the original triple, so we use the default. - Builder.defineMacro("_M_IX86", "600"); - Builder.defineMacro("_INTEGRAL_MAX_BITS", "64"); - Builder.defineMacro("_STDCALL_SUPPORTED"); - } }; } // end anonymous namespace @@ -1474,10 +1507,10 @@ public: namespace { // x86-64 Windows target -class WindowsX86_64TargetInfo : public X86_64TargetInfo { +class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> { public: WindowsX86_64TargetInfo(const std::string& triple) - : X86_64TargetInfo(triple) { + : WindowsTargetInfo<X86_64TargetInfo>(triple) { TLSSupported = false; WCharType = UnsignedShort; LongWidth = LongAlign = 32; @@ -1491,25 +1524,11 @@ public: } virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { - X86_64TargetInfo::getTargetDefines(Opts, Builder); - Builder.defineMacro("_WIN64"); - DefineStd(Builder, "WIN64", Opts); - } -}; -} // end anonymous namespace + WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder); -namespace { -// x86-64 Windows Visual Studio target -class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo { -public: - VisualStudioWindowsX86_64TargetInfo(const std::string& triple) - : WindowsX86_64TargetInfo(triple) { - } - virtual void getTargetDefines(const LangOptions &Opts, - MacroBuilder &Builder) const { - WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder); + Builder.defineMacro("_WIN64"); Builder.defineMacro("_M_X64"); - Builder.defineMacro("_INTEGRAL_MAX_BITS", "64"); + Builder.defineMacro("_M_AMD64"); } virtual const char *getVAListDeclaration() const { return "typedef char* __builtin_va_list;"; @@ -2523,7 +2542,7 @@ static TargetInfo *AllocateTarget(const std::string &T) { case llvm::Triple::MinGW32: return new MinGWX86_32TargetInfo(T); case llvm::Triple::Win32: - return new VisualStudioWindowsX86_32TargetInfo(T); + return new WindowsX86_32TargetInfo(T); case llvm::Triple::Haiku: return new HaikuX86_32TargetInfo(T); default: @@ -2551,7 +2570,7 @@ static TargetInfo *AllocateTarget(const std::string &T) { case llvm::Triple::MinGW64: return new MinGWX86_64TargetInfo(T); case llvm::Triple::Win32: // This is what Triple.h supports now. - return new VisualStudioWindowsX86_64TargetInfo(T); + return new WindowsX86_64TargetInfo(T); default: return new X86_64TargetInfo(T); } |