--- origsrc/llvm-3.4.2.src/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp 2013-10-08 08:08:17.000000000 -0500 +++ src/llvm-3.4.2.src/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp 2014-07-28 00:31:38.227446500 -0500 @@ -345,7 +345,8 @@ static MCCodeGenInfo *createX86MCCodeGen // For static codegen, if we're not already set, use Small codegen. if (CM == CodeModel::Default) - CM = CodeModel::Small; + CM = (T.getOS() == Triple::Cygwin) && is64Bit ? CodeModel::Medium + : CodeModel::Small; else if (CM == CodeModel::JITDefault) // 64-bit JIT places everything in the same buffer except external funcs. CM = is64Bit ? CodeModel::Large : CodeModel::Small; --- origsrc/llvm-3.4.2.src/tools/clang/lib/Basic/Targets.cpp 2014-04-11 14:36:49.000000000 -0500 +++ src/llvm-3.4.2.src/tools/clang/lib/Basic/Targets.cpp 2014-07-21 18:11:53.255679200 -0500 @@ -3153,6 +3153,7 @@ public: Builder.defineMacro("_X86_"); Builder.defineMacro("__CYGWIN__"); Builder.defineMacro("__CYGWIN32__"); + Builder.defineMacro("__declspec(a)", "__attribute__((a))"); DefineStd(Builder, "unix", Opts); if (Opts.CPlusPlus) Builder.defineMacro("_GNU_SOURCE"); @@ -3370,6 +3371,32 @@ public: } // end anonymous namespace namespace { +// x86-64 Cygwin target +class CygwinX86_64TargetInfo : public X86_64TargetInfo { +public: + CygwinX86_64TargetInfo(const llvm::Triple &Triple) + : X86_64TargetInfo(Triple) { + TLSSupported = false; + WCharType = UnsignedShort; + } + virtual void getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const { + X86_64TargetInfo::getTargetDefines(Opts, Builder); + Builder.defineMacro("__CYGWIN__"); + Builder.defineMacro("__declspec(a)", "__attribute__((a))"); + DefineStd(Builder, "unix", Opts); + if (Opts.CPlusPlus) + Builder.defineMacro("_GNU_SOURCE"); + } + virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const { + return (CC == CC_C || + CC == CC_IntelOclBicc || + CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning; + } +}; +} // end anonymous namespace + +namespace { class DarwinX86_64TargetInfo : public DarwinTargetInfo { public: DarwinX86_64TargetInfo(const llvm::Triple &Triple) @@ -5820,6 +5847,8 @@ static TargetInfo *AllocateTarget(const return new KFreeBSDTargetInfo(Triple); case llvm::Triple::Solaris: return new SolarisTargetInfo(Triple); + case llvm::Triple::Cygwin: + return new CygwinX86_64TargetInfo(Triple); case llvm::Triple::MinGW32: return new MinGWX86_64TargetInfo(Triple); case llvm::Triple::Win32: // This is what Triple.h supports now.