gcov: Fix build on AIX
authorMartin Liska <mliska@suse.cz>
Tue, 2 Jun 2020 14:57:35 +0000 (16:57 +0200)
committerMartin Liska <mliska@suse.cz>
Wed, 3 Jun 2020 06:12:50 +0000 (08:12 +0200)
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
libgcc/libgcov.h

index 7b171382a077114cd96e9c76af484f5fed1cbfaa..45ab93c977695b25cae07a2746cd3c06658decf8 100644 (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
index 7c037a978785efddd59edb29415de164100deb5e..1456100815da0beb1e55f25be3aa9a0132c5a519 100644 (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;