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:
Martin Liska 2020-06-02 16:57:35 +02:00
parent a9312a7926
commit eb3480fc0f
No known key found for this signature in database
GPG Key ID: 4DC182DC0FA73785
2 changed files with 20 additions and 13 deletions

View File

@ -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

View File

@ -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;