summaryrefslogtreecommitdiffstats
path: root/clang-3.4.2-cygwin64.patch
blob: 84af4af5652066098e1fbcc36f030a7ca44b61dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
--- 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<X86_64TargetInfo> {
 public:
   DarwinX86_64TargetInfo(const llvm::Triple &Triple)
@@ -5820,6 +5847,8 @@ static TargetInfo *AllocateTarget(const
       return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
     case llvm::Triple::Solaris:
       return new SolarisTargetInfo<X86_64TargetInfo>(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.