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 :=
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 :=
~"-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");
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
// 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
// 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