diff options
author | Martin Liska <mliska@suse.cz> | 2020-06-02 16:57:35 +0200 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2020-06-03 08:12:50 +0200 |
commit | eb3480fc0fe68c0062a5548e922d530c78121cb5 (patch) | |
tree | 1e3619f4c6d57ebb711c11cb15b3311501a8d76b /libgcc/libgcov.h | |
parent | a9312a7926079ddb78b5f93681a9f6823422f5e1 (diff) | |
download | gcc-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.h | 22 |
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; |