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 */
 
 }
 



Reply via email to