From a46865981e9d5dd1eee555243983e0ea74df5d73 Mon Sep 17 00:00:00 2001
From: Vadim Chugunov <vadimcn@gmail.com>
Date: Mon, 22 Sep 2014 16:33:18 -0700
Subject: [PATCH] Link libgcc statically on Win64. Allow linking it statically
 on Win32 with an override.

---
 src/librustc/back/link.rs  | 13 +++++++++----
 src/librustrt/libunwind.rs |  1 -
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs
index d31e19b4467f8..e6e9448fa563e 100644
--- a/src/librustc/back/link.rs
+++ b/src/librustc/back/link.rs
@@ -991,10 +991,15 @@ fn link_args(cmd: &mut Command,
     }
 
     if sess.targ_cfg.os == abi::OsWindows {
-        // Make sure that we link to the dynamic libgcc, otherwise cross-module
-        // DWARF stack unwinding will not work.
-        // This behavior may be overridden by --link-args "-static-libgcc"
-        cmd.arg("-shared-libgcc");
+        if sess.targ_cfg.arch == abi::X86 {
+            // Make sure that we link to the dynamic libgcc, otherwise cross-module
+            // DWARF stack unwinding will not work.
+            // This behavior may be overridden by -Clink-args="-static-libgcc"
+            cmd.arg("-shared-libgcc");
+        } else {
+            // On Win64 unwinding is handled by the OS, so we can link libgcc statically.
+            cmd.arg("-static-libgcc");
+        }
 
         // And here, we see obscure linker flags #45. On windows, it has been
         // found to be necessary to have this flag to compile liblibc.
diff --git a/src/librustrt/libunwind.rs b/src/librustrt/libunwind.rs
index 69df8a7fd66e3..aab75d7f7746d 100644
--- a/src/librustrt/libunwind.rs
+++ b/src/librustrt/libunwind.rs
@@ -87,7 +87,6 @@ pub type _Unwind_Exception_Cleanup_Fn =
 
 #[cfg(target_os = "linux")]
 #[cfg(target_os = "freebsd")]
-#[cfg(target_os = "windows")]
 #[link(name = "gcc_s")]
 extern {}