Hi,
one of the three remaining libitm issues for Darwin is to supply the
dummy funcs fro the weakrefs (as Rainer has done for Tru64) for the
versions of Darwin that need them.
Since we now have the situation where there are several targets which
might need dummy functions for the weak declarations, it seemed worth
trying to auto-foo this.
.. the attached works for me on Darwin9 (weakref doesn't work like
elf***) and Darwin10+XCode3.2.5 (weakref works like elf)
I hope it also works for Rainer .... and that I've got the right
designator for the Tru64 cross-case.
comments/OK for trunk?
Iain
*** FWIW, weakref actually work (at runtime) for earlier Darwin
- it's just that refs either need to be satisfied by dummies at link
time -
- or the library namespace has to be flattened (which is generally
undesirable).
-----
libitm:
* acinclude.m4 (LIBITM_CHECK_WORKING_WEAKREF): New.
* configure.ac: Use LIBITM_CHECK_WORKING_WEAKREF.
* alloc_cpp.cc: Generate dummy functions if we don't
HAVE_WORKING_WEAKREF.
* eh_cpp.cc: Likewise.
* configure: Regenerate.
* aclocal.m4: Likewise.
* config.h.in: Likewise.
Index: libitm/acinclude.m4
===================================================================
--- libitm/acinclude.m4 (revision 181470)
+++ libitm/acinclude.m4 (working copy)
@@ -109,6 +109,29 @@ i[[34567]]86 | x86_64)
;;
esac])
+dnl Check whether weak refs actually work.
+AC_DEFUN([LIBITM_CHECK_WORKING_WEAKREF], [
+ AC_CACHE_CHECK([whether weak refs actually work],
+ libitm_cv_have_working_weakref, [
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+extern void fNotToBeFoundInAnyStandardLib(void) __attribute__((weak));
+int main ()
+{
+ if (fNotToBeFoundInAnyStandardLib)
+ return 0;
+ else
+ return 1;
+}
+}]])], libitm_cv_have_working_weakref=yes, libitm_cv_have_working_weakref=no, [
+case "${host}" in
+ alpha*-dec-osf*) libitm_cv_have_working_weakref=no ;;
+ *-apple-darwin[[89]]*) libitm_cv_have_working_weakref=no ;;
+ *) libitm_cv_have_working_weakref=yes;;
+esac])])
+if test x"$libitm_cv_have_working_weakref" = xyes; then
+ AC_DEFINE(HAVE_WORKING_WEAKREF, 1, [Define to 1 if target has a working
weakref.])
+fi])
+
sinclude(../libtool.m4)
dnl The lines below arrange for aclocal not to bring an installed
dnl libtool.m4 into aclocal.m4, while still arranging for automake to
Index: libitm/configure.ac
===================================================================
--- libitm/configure.ac (revision 181470)
+++ libitm/configure.ac (working copy)
@@ -238,6 +238,7 @@ CFLAGS="$save_CFLAGS $XCFLAGS"
LIBITM_CHECK_SYNC_BUILTINS
LIBITM_CHECK_64BIT_SYNC_BUILTINS
LIBITM_CHECK_AS_AVX
+LIBITM_CHECK_WORKING_WEAKREF
# Cleanup and exit.
CFLAGS="$save_CFLAGS"
Index: libitm/alloc_cpp.cc
===================================================================
--- libitm/alloc_cpp.cc (revision 181470)
+++ libitm/alloc_cpp.cc (working copy)
@@ -60,7 +60,7 @@ extern void _ZdlPvRKSt9nothrow_t (void *, c_nothro
extern void *_ZnaXRKSt9nothrow_t (size_t, c_nothrow_p) __attribute__((weak));
extern void _ZdaPvRKSt9nothrow_t (void *, c_nothrow_p) __attribute__((weak));
-#ifdef __osf__ /* Really: !HAVE_WEAKDEF */
+#if !defined (HAVE_WORKING_WEAKREF)
void *_ZnwX (size_t) { return NULL; }
void _ZdlPv (void *) { return; }
void *_ZnaX (size_t) { return NULL; }
@@ -70,7 +70,7 @@ void *_ZnwXRKSt9nothrow_t (size_t, c_nothrow_p) {
void _ZdlPvRKSt9nothrow_t (void *, c_nothrow_p) { return; }
void *_ZnaXRKSt9nothrow_t (size_t, c_nothrow_p) { return NULL; }
void _ZdaPvRKSt9nothrow_t (void *, c_nothrow_p) { return; }
-#endif /* __osf__ */
+#endif /* HAVE_WORKING_WEAKREF */
/* Wrap the delete nothrow symbols for usage with a single argument.
Perhaps should have a configure type check for this, because the
Index: libitm/eh_cpp.cc
===================================================================
--- libitm/eh_cpp.cc (revision 181470)
+++ libitm/eh_cpp.cc (working copy)
@@ -39,13 +39,13 @@ extern void *__cxa_begin_catch (void *) WEAK;
extern void *__cxa_end_catch (void) WEAK;
extern void __cxa_tm_cleanup (void *, void *, unsigned int) WEAK;
-#ifdef __osf__ /* Really: !HAVE_WEAKDEF */
+#if !defined (HAVE_WORKING_WEAKREF)
void *__cxa_allocate_exception (size_t) { return NULL; }
void __cxa_throw (void *, void *, void *) { return; }
void *__cxa_begin_catch (void *) { return NULL; }
void *__cxa_end_catch (void) { return NULL; }
void __cxa_tm_cleanup (void *, void *, unsigned int) { return; }
-#endif
+#endif /* HAVE_WORKING_WEAKREF */
}