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.
|