mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-23 19:03:59 +08:00
gcov: Fix build on AIX
We must guard used atomic builtins with GCOV_SUPPORTS_ATOMIC. The patch is tested on AIX and I'm going to push it. libgcc/ChangeLog: PR gcov-profile/95480 * libgcov-profiler.c (GCOV_SUPPORTS_ATOMIC): Move to... * libgcov.h (GCOV_SUPPORTS_ATOMIC): ...here. (gcov_counter_add): Use GCOV_SUPPORTS_ATOMIC guard. (gcov_counter_set_if_null): Likewise.
This commit is contained in:
parent
a9312a7926
commit
eb3480fc0f
@ -26,17 +26,6 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
#include "libgcov.h"
|
||||
#if !defined(inhibit_libc)
|
||||
|
||||
/* Detect whether target can support atomic update of profilers. */
|
||||
#if __SIZEOF_LONG_LONG__ == 4 && __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
|
||||
#define GCOV_SUPPORTS_ATOMIC 1
|
||||
#else
|
||||
#if __SIZEOF_LONG_LONG__ == 8 && __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8
|
||||
#define GCOV_SUPPORTS_ATOMIC 1
|
||||
#else
|
||||
#define GCOV_SUPPORTS_ATOMIC 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef L_gcov_interval_profiler
|
||||
/* If VALUE is in interval <START, START + STEPS - 1>, then increases the
|
||||
corresponding counter in COUNTERS. If the VALUE is above or below
|
||||
|
@ -85,6 +85,19 @@ typedef unsigned gcov_type_unsigned __attribute__ ((mode (QI)));
|
||||
#define GCOV_LOCKED 0
|
||||
#endif
|
||||
|
||||
#ifndef GCOV_SUPPORTS_ATOMIC
|
||||
/* Detect whether target can support atomic update of profilers. */
|
||||
#if __SIZEOF_LONG_LONG__ == 4 && __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
|
||||
#define GCOV_SUPPORTS_ATOMIC 1
|
||||
#else
|
||||
#if __SIZEOF_LONG_LONG__ == 8 && __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8
|
||||
#define GCOV_SUPPORTS_ATOMIC 1
|
||||
#else
|
||||
#define GCOV_SUPPORTS_ATOMIC 0
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* In libgcov we need these functions to be extern, so prefix them with
|
||||
__gcov. In libgcov they must also be hidden so that the instance in
|
||||
the executable is not also used in a DSO. */
|
||||
@ -377,11 +390,14 @@ gcov_get_counter_target (void)
|
||||
if USE_ATOMIC is true. */
|
||||
|
||||
static inline void
|
||||
gcov_counter_add (gcov_type *counter, gcov_type value, int use_atomic)
|
||||
gcov_counter_add (gcov_type *counter, gcov_type value,
|
||||
int use_atomic ATTRIBUTE_UNUSED)
|
||||
{
|
||||
#if GCOV_SUPPORTS_ATOMIC
|
||||
if (use_atomic)
|
||||
__atomic_fetch_add (counter, value, __ATOMIC_RELAXED);
|
||||
else
|
||||
#endif
|
||||
*counter += value;
|
||||
}
|
||||
|
||||
@ -390,11 +406,13 @@ gcov_counter_add (gcov_type *counter, gcov_type value, int use_atomic)
|
||||
|
||||
static inline int
|
||||
gcov_counter_set_if_null (gcov_type *counter, struct gcov_kvp *node,
|
||||
int use_atomic)
|
||||
int use_atomic ATTRIBUTE_UNUSED)
|
||||
{
|
||||
#if GCOV_SUPPORTS_ATOMIC
|
||||
if (use_atomic)
|
||||
return !__sync_val_compare_and_swap (counter, NULL, (intptr_t)node);
|
||||
else
|
||||
#endif
|
||||
{
|
||||
*counter = (intptr_t)node;
|
||||
return 1;
|
||||
|
Loading…
Reference in New Issue
Block a user