aboutsummaryrefslogtreecommitdiff
path: root/libgcc/libgcov.h
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2020-06-02 16:57:35 +0200
committerMartin Liska <mliska@suse.cz>2020-06-03 08:12:50 +0200
commiteb3480fc0fe68c0062a5548e922d530c78121cb5 (patch)
tree1e3619f4c6d57ebb711c11cb15b3311501a8d76b /libgcc/libgcov.h
parenta9312a7926079ddb78b5f93681a9f6823422f5e1 (diff)
downloadgcc-eb3480fc0fe68c0062a5548e922d530c78121cb5.zip
gcc-eb3480fc0fe68c0062a5548e922d530c78121cb5.tar.gz
gcc-eb3480fc0fe68c0062a5548e922d530c78121cb5.tar.bz2
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.
Diffstat (limited to 'libgcc/libgcov.h')
-rw-r--r--libgcc/libgcov.h22
1 files changed, 20 insertions, 2 deletions
diff --git a/libgcc/libgcov.h b/libgcc/libgcov.h
index 7c037a9..1456100 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;