From eb3480fc0fe68c0062a5548e922d530c78121cb5 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Tue, 2 Jun 2020 16:57:35 +0200 Subject: [PATCH] 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. --- libgcc/libgcov-profiler.c | 11 ----------- libgcc/libgcov.h | 22 ++++++++++++++++++++-- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/libgcc/libgcov-profiler.c b/libgcc/libgcov-profiler.c index 7b171382a07..45ab93c9776 100644 --- a/libgcc/libgcov-profiler.c +++ b/libgcc/libgcov-profiler.c @@ -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 , then increases the corresponding counter in COUNTERS. If the VALUE is above or below diff --git a/libgcc/libgcov.h b/libgcc/libgcov.h index 7c037a97878..1456100815d 100644 --- a/libgcc/libgcov.h +++ b/libgcc/libgcov.h @@ -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;