about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--mk/platform.mk4
-rw-r--r--src/librustc/back/link.rs8
-rw-r--r--src/rt/arch/i386/morestack.S15
-rw-r--r--src/rt/arch/x86_64/morestack.S9
4 files changed, 23 insertions, 13 deletions
diff --git a/mk/platform.mk b/mk/platform.mk
index 7ba8f77ef98..27fe373b761 100644
--- a/mk/platform.mk
+++ b/mk/platform.mk
@@ -204,7 +204,7 @@ CFG_LIB_GLOB_x86_64-apple-darwin=lib$(1)-*.dylib
 CFG_LIB_DSYM_GLOB_x86_64-apple-darwin=lib$(1)-*.dylib.dSYM
 CFG_GCCISH_CFLAGS_x86_64-apple-darwin := -Wall -Werror -g -fPIC -m64 -arch x86_64
 CFG_GCCISH_CXXFLAGS_x86_64-apple-darwin := -fno-rtti
-CFG_GCCISH_LINK_FLAGS_x86_64-apple-darwin := -dynamiclib -pthread  -framework CoreServices -Wl,-no_compact_unwind -m64
+CFG_GCCISH_LINK_FLAGS_x86_64-apple-darwin := -dynamiclib -pthread  -framework CoreServices -m64
 CFG_GCCISH_DEF_FLAG_x86_64-apple-darwin := -Wl,-exported_symbols_list,
 CFG_GCCISH_PRE_LIB_FLAGS_x86_64-apple-darwin :=
 CFG_GCCISH_POST_LIB_FLAGS_x86_64-apple-darwin :=
@@ -230,7 +230,7 @@ CFG_LIB_GLOB_i686-apple-darwin=lib$(1)-*.dylib
 CFG_LIB_DSYM_GLOB_i686-apple-darwin=lib$(1)-*.dylib.dSYM
 CFG_GCCISH_CFLAGS_i686-apple-darwin := -Wall -Werror -g -fPIC -m32 -arch i386
 CFG_GCCISH_CXXFLAGS_i686-apple-darwin := -fno-rtti
-CFG_GCCISH_LINK_FLAGS_i686-apple-darwin := -dynamiclib -pthread  -framework CoreServices -Wl,-no_compact_unwind -m32
+CFG_GCCISH_LINK_FLAGS_i686-apple-darwin := -dynamiclib -pthread  -framework CoreServices -m32
 CFG_GCCISH_DEF_FLAG_i686-apple-darwin := -Wl,-exported_symbols_list,
 CFG_GCCISH_PRE_LIB_FLAGS_i686-apple-darwin :=
 CFG_GCCISH_POST_LIB_FLAGS_i686-apple-darwin :=
diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs
index 8bf3d5008db..2438d22881f 100644
--- a/src/librustc/back/link.rs
+++ b/src/librustc/back/link.rs
@@ -1112,14 +1112,6 @@ pub fn link_args(sess: Session,
                        ~"-Wl,-rpath,/usr/local/lib/gcc44"]);
     }
 
-    // OS X 10.6 introduced 'compact unwind info', which is produced by the
-    // linker from the dwarf unwind info. Unfortunately, it does not seem to
-    // understand how to unwind our __morestack frame, so we have to turn it
-    // off. This has impacted some other projects like GHC.
-    if sess.targ_cfg.os == session::OsMacos {
-        args.push(~"-Wl,-no_compact_unwind");
-    }
-
     // Stack growth requires statically linking a __morestack function
     args.push(~"-lmorestack");
 
diff --git a/src/rt/arch/i386/morestack.S b/src/rt/arch/i386/morestack.S
index 25f907f479c..2f03251e54a 100644
--- a/src/rt/arch/i386/morestack.S
+++ b/src/rt/arch/i386/morestack.S
@@ -62,9 +62,9 @@
 	is that OS X 10.6+ uses its own 'compact unwind info',
 	an undocumented format generated by the linker from
 	the DWARF CFI. This compact unwind info doesn't correctly
-	capture the nuance of the __morestack frame, and as a
-	result all of our linking on OS X uses the -no_compact_unwind
-	flag.
+	capture the nuance of the __morestack frame, so we need to
+	prevent the linker from attempting to convert its DWARF unwind
+	information.
 */
 
 .text
@@ -118,6 +118,15 @@ MORESTACK:
         // FIXME(#9854) these cfi directives don't work on windows.
 
 	pushl %ebp
+
+#if defined(__APPLE__)
+	// The pattern of the return address being saved twice to the same location
+	// tells the OS X linker that it should not attempt to convert the DWARF
+	// unwind information to the compact format.
+	.cfi_offset %eip, -4
+	.cfi_offset %eip, -4
+#endif
+
 	// The CFA is 20 bytes above the register that it is
 	// associated with for this frame (which will be %ebp)
 	.cfi_def_cfa_offset 20
diff --git a/src/rt/arch/x86_64/morestack.S b/src/rt/arch/x86_64/morestack.S
index d248d79d121..6ccabbf5994 100644
--- a/src/rt/arch/x86_64/morestack.S
+++ b/src/rt/arch/x86_64/morestack.S
@@ -43,6 +43,15 @@ MORESTACK:
 	// bytes greater than a normal frame, to allow the unwinder
 	// to skip the partial frame of the original function.
 	.cfi_def_cfa_offset 24
+
+#if defined(__APPLE__)
+	// The pattern of the return address being saved twice to the same location
+	// tells the OS X linker that it should not attempt to convert the DWARF
+	// unwind information to the compact format.
+	.cfi_offset %rip, -8
+	.cfi_offset %rip, -8
+#endif
+
 	// %rbp is -24 bytes from the CFA
 	.cfi_offset %rbp, -24
 	movq %rsp, %rbp