From patchwork Sun Dec 9 19:08:14 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [libbacktrace] Don't call __sync_lock_test_and_set if we don't have sync functions Date: Sun, 09 Dec 2012 09:08:14 -0000 From: John David Anglin X-Patchwork-Id: 204773 Message-Id: <20121209190812.GA20280@hiauly1.hia.nrc.ca> To: gcc-patches@gcc.gnu.org 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 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);