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"
|
#include "libgcov.h"
|
||||||
#if !defined(inhibit_libc)
|
#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
|
#ifdef L_gcov_interval_profiler
|
||||||
/* If VALUE is in interval <START, START + STEPS - 1>, then increases the
|
/* If VALUE is in interval <START, START + STEPS - 1>, then increases the
|
||||||
corresponding counter in COUNTERS. If the VALUE is above or below
|
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
|
#define GCOV_LOCKED 0
|
||||||
#endif
|
#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
|
/* 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
|
__gcov. In libgcov they must also be hidden so that the instance in
|
||||||
the executable is not also used in a DSO. */
|
the executable is not also used in a DSO. */
|
||||||
|
@ -377,11 +390,14 @@ gcov_get_counter_target (void)
|
||||||
if USE_ATOMIC is true. */
|
if USE_ATOMIC is true. */
|
||||||
|
|
||||||
static inline void
|
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)
|
if (use_atomic)
|
||||||
__atomic_fetch_add (counter, value, __ATOMIC_RELAXED);
|
__atomic_fetch_add (counter, value, __ATOMIC_RELAXED);
|
||||||
else
|
else
|
||||||
|
#endif
|
||||||
*counter += value;
|
*counter += value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -390,11 +406,13 @@ gcov_counter_add (gcov_type *counter, gcov_type value, int use_atomic)
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
gcov_counter_set_if_null (gcov_type *counter, struct gcov_kvp *node,
|
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)
|
if (use_atomic)
|
||||||
return !__sync_val_compare_and_swap (counter, NULL, (intptr_t)node);
|
return !__sync_val_compare_and_swap (counter, NULL, (intptr_t)node);
|
||||||
else
|
else
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
*counter = (intptr_t)node;
|
*counter = (intptr_t)node;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Reference in New Issue