On hppa*-*-hpux*, we don't have sync functions.  However,
__sync_lock_test_and_set is called in backtrace_alloc and
backtrace_free.  This causes an abort before ICE proccessing
is fully complete.

hppa64 is an ELF target and backtraces are nominally supported.

The attached change avoids calling __sync_lock_test_and_set
if we don't have sync functions.  As a result, the memory is
leaked.

This fixes the btest failure.

OK for trunk?

Dave
-- 
J. David Anglin                                  dave.ang...@nrc-cnrc.gc.ca
National Research Council of Canada              (613) 990-0752 (FAX: 952-6602)

2012-12-09  John David Anglin  <dave.ang...@nrc-cnrc.gc.ca>

        * mmap.c: Define HAVE_SYNC_FUNCTIONS if not defined.
        (backtrace_alloc): Don't call __sync_lock_test_and_set if we don't
        have sync functions.
        (backtrace_free): Likewise.

Index: mmap.c
===================================================================
--- mmap.c      (revision 194055)
+++ mmap.c      (working copy)
@@ -49,6 +49,10 @@
 #define MAP_ANONYMOUS MAP_ANON
 #endif
 
+#ifndef HAVE_SYNC_FUNCTIONS
+#define HAVE_SYNC_FUNCTIONS 0
+#endif
+
 /* A list of free memory blocks.  */
 
 struct backtrace_freelist_struct
@@ -96,7 +100,7 @@
      using mmap.  __sync_lock_test_and_set returns the old state of
      the lock, so we have acquired it if it returns 0.  */
 
-  if (!__sync_lock_test_and_set (&state->lock_alloc, 1))
+  if (HAVE_SYNC_FUNCTIONS && !__sync_lock_test_and_set (&state->lock_alloc, 1))
     {
       for (pp = &state->freelist; *pp != NULL; pp = &(*pp)->next)
        {
@@ -158,7 +162,7 @@
      If we can't acquire the lock, just leak the memory.
      __sync_lock_test_and_set returns the old state of the lock, so we
      have acquired it if it returns 0.  */
-  if (!__sync_lock_test_and_set (&state->lock_alloc, 1))
+  if (HAVE_SYNC_FUNCTIONS && !__sync_lock_test_and_set (&state->lock_alloc, 1))
     {
       backtrace_free_locked (state, addr, size);
 

Reply via email to