The attached revised patch eliminates the failure of the libitm.c++/eh-1.C
execution test on
darwin10 and later, PR55693. With the introduction of c++ weak-symbol
coalescing in Mac OS X 10.6,
dyld no longer looks up weak symbols that reside in object files rather than
shared libraries. This
prevents weak symbols for the dummy functions in libgcc/config/darwin-crt-tm.c
from being replaced
by those in the libstdc++ shared library. The solution is not to define these
dummy symbols when
targeting Mac OS X 10.6 or later. Also, the previous hack of not declaring the
dummy symbols in
libitm/alloc_cpp.cc and libitm/eh_cpp.cc on darwin is reverted as this produces
undefined symbols
for the combination of darwin10 with Xcode 4.2 (where the dummy symbols are not
provided in
config/darwin-crt-tm.c but HAVE_ELF_STYLE_WEAKREF is undefined). Bootstrap and
regression tested on
x86_64-apple-darwin10 with Xcode 3.2.6 and Xcode 4.2 as well as for both
x86_64-apple-darwin11 and
x86_64-apple-darwin12 with Xcode 4.5.2/4.6. Okay for gcc trunk after testing on
darwin9?
Jack
/libgcc
2013-02-07 Iain Sandoe <[email protected]>
Jack Howarth <[email protected]>
PR libitm/55693
* config/darwin-crt-tm.c: Provide dummy functions only prior to 10.6.
/gcc
2013-02-07 Iain Sandoe <[email protected]>
Jack Howarth <[email protected]>
PR libitm/55693
* gcc/config/darwin.h: Replace ENDFILE_SPEC with TM_DESTRUCTOR and
define ENDFILE_SPEC as TM_DESTRUCTOR.
* config/i386/darwin.h (ENDFILE_SPEC): Use TM_DESTRUCTOR.
/libitm
2013-02-07 Iain Sandoe <[email protected]>
Jack Howarth <[email protected]>
PR libitm/55693
* alloc_cpp.cc: Enable dummy funtions on darwin.
* eh_cpp.cc: Likewise.
Index: libgcc/config/darwin-crt-tm.c
===================================================================
--- libgcc/config/darwin-crt-tm.c (revision 195764)
+++ libgcc/config/darwin-crt-tm.c (working copy)
@@ -103,9 +103,12 @@ void __doTMdeRegistrations (void)
_ITM_deregisterTMCloneTable (tmct);
}
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && \
+ __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060
+
/* Provide dummy functions to satisfy linkage for versions of the Darwin
tool-chain that that can't handle undefined weak refs at the link stage.
- ??? Define these dummy functions only when !HAVE_ELF_STYLE_WEAKREF. */
+ Don't define for 10.6 or later with faster weak-symbol coalescing. */
extern void *__cxa_allocate_exception (size_t) WEAK;
extern void __cxa_throw (void *, void *, void *) WEAK;
@@ -144,5 +147,5 @@ void _ZdlPvRKSt9nothrow_t (void * a UNUS
void *_ZnaXRKSt9nothrow_t (size_t s UNUSED, c_nothrow_p b UNUSED)
{ return NULL; }
void _ZdaPvRKSt9nothrow_t (void * a UNUSED, c_nothrow_p b UNUSED) { return; }
-
+#endif
#endif
Index: gcc/config/i386/darwin.h
===================================================================
--- gcc/config/i386/darwin.h (revision 195764)
+++ gcc/config/i386/darwin.h (working copy)
@@ -131,8 +131,7 @@ extern int darwin_emit_branch_islands;
"%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
%{mpc32:crtprec32.o%s} \
%{mpc64:crtprec64.o%s} \
- %{mpc80:crtprec80.o%s} \
- %{fgnu-tm: -lcrttme.o}"
+ %{mpc80:crtprec80.o%s}" TM_DESTRUCTOR
#undef SUBTARGET_EXTRA_SPECS
#define SUBTARGET_EXTRA_SPECS \
Index: gcc/config/darwin.h
===================================================================
--- gcc/config/darwin.h (revision 195764)
+++ gcc/config/darwin.h (working copy)
@@ -363,7 +363,8 @@ extern GTY(()) int darwin_ms_struct;
%{shared-libgcc:%:version-compare(< 10.5 mmacosx-version-min= crt3.o%s)}"
/* We want a destructor last in the list. */
-#define ENDFILE_SPEC "%{fgnu-tm: -lcrttme.o}"
+#define TM_DESTRUCTOR "%{fgnu-tm: -lcrttme.o}"
+#define ENDFILE_SPEC TM_DESTRUCTOR
#define DARWIN_EXTRA_SPECS \
{ "darwin_crt1", DARWIN_CRT1_SPEC }, \
Index: libitm/alloc_cpp.cc
===================================================================
--- libitm/alloc_cpp.cc (revision 195861)
+++ libitm/alloc_cpp.cc (working copy)
@@ -60,7 +60,7 @@
extern void *_ZnaXRKSt9nothrow_t (size_t, c_nothrow_p) __attribute__((weak));
extern void _ZdaPvRKSt9nothrow_t (void *, c_nothrow_p) __attribute__((weak));
-#if !defined (HAVE_ELF_STYLE_WEAKREF) && !defined (__MACH__)
+#if !defined (HAVE_ELF_STYLE_WEAKREF)
void *_ZnwX (size_t) { return NULL; }
void _ZdlPv (void *) { return; }
void *_ZnaX (size_t) { return NULL; }
Index: libitm/eh_cpp.cc
===================================================================
--- libitm/eh_cpp.cc (revision 195861)
+++ libitm/eh_cpp.cc (working copy)
@@ -39,7 +39,7 @@
extern void __cxa_end_catch (void) WEAK;
extern void __cxa_tm_cleanup (void *, void *, unsigned int) WEAK;
-#if !defined (HAVE_ELF_STYLE_WEAKREF) && !defined (__MACH__)
+#if !defined (HAVE_ELF_STYLE_WEAKREF)
void *__cxa_allocate_exception (size_t) { return NULL; }
void __cxa_throw (void *, void *, void *) { return; }
void *__cxa_begin_catch (void *) { return NULL; }