https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120086
--- Comment #20 from John David Anglin <danglin at gcc dot gnu.org> --- (In reply to John David Anglin from comment #19) > It's not clear why gcov-30 passes on Linux. I searched the entire tree and > couldn't find how TARGET_HAVE_LIBATOMIC gets set on Linux. Also, always > setting TARGET_HAVE_LIBATOMIC to true doesn't seem 100% correct because I > believe it's possible to disable building libatomic. It's not set on Linux. I see issue. We have in tree-profile.cc: /* Verify whether we can utilize atomic update operations. */ bool can_support_atomic = targetm.have_libatomic; unsigned HOST_WIDE_INT gcov_type_size = tree_to_uhwi (TYPE_SIZE_UNIT (get_gcov_type ())); bool have_atomic_4 = HAVE_sync_compare_and_swapsi || HAVE_atomic_compare_and_swapsi; bool have_atomic_8 = HAVE_sync_compare_and_swapdi || HAVE_atomic_compare_and_swapdi; bool needs_split = gcov_type_size == 8 && !have_atomic_8 && have_atomic_4; if (!can_support_atomic) { if (gcov_type_size == 4) can_support_atomic = have_atomic_4; else if (gcov_type_size == 8) can_support_atomic = have_atomic_8; } HAVE_sync_compare_and_swapdi isn't defined because this operation is implemented as a libcall. This is also true on Linux but we have in pa-linux.h: /* The SYNC operations are implemented as library functions, not INSN patterns. As a result, the HAVE defines for the patterns are not defined. We need to define them to generate the corresponding __GCC_HAVE_SYNC_COMPARE_AND_SWAP_* and __GCC_ATOMIC_*_LOCK_FREE defines. */ #define HAVE_sync_compare_and_swapqi 1 #define HAVE_sync_compare_and_swaphi 1 #define HAVE_sync_compare_and_swapsi 1 #define HAVE_sync_compare_and_swapdi 1