From: Sebastian Huber Date: Mon, 29 Dec 2025 23:41:38 +0000 (+0100) Subject: gcov: Fix counter update method selection X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bd0d3ba672870be1dfd5b58ddd0dbb95b4f80c04;p=thirdparty%2Fgcc.git gcov: Fix counter update method selection The counter update method selection had some issues. For PROFILE_UPDATE_ATOMIC, if atomic updates are not supported, then fallback to single mode, however, use partial atomic updates if available. Issue warnings. For PROFILE_UPDATE_PRFER_ATOMIC, if atomic updates are not supported, then fallback to single mode, however, use partial atomic updates if available. Do not issue warnings. gcc/ChangeLog: * tree-profile.cc (tree_profiling): Do not use atomic operations if they are not available. Try to use at least partial atomic updates as a fallback. --- diff --git a/gcc/tree-profile.cc b/gcc/tree-profile.cc index b8d9c76e466..885716535f1 100644 --- a/gcc/tree-profile.cc +++ b/gcc/tree-profile.cc @@ -1847,19 +1847,32 @@ tree_profiling (void) can_support_atomic = have_atomic_8; } - if (flag_profile_update != PROFILE_UPDATE_SINGLE && needs_split) - counter_update = COUNTER_UPDATE_ATOMIC_PARTIAL; - if (flag_profile_update == PROFILE_UPDATE_ATOMIC && !can_support_atomic) { - warning (0, "target does not support atomic profile update, " - "single mode is selected"); + if (needs_split) + { + warning (0, "target does not fully support atomic profile " + "update, single mode is selected with partial " + "atomic updates"); + counter_update = COUNTER_UPDATE_ATOMIC_PARTIAL; + } + else + warning (0, "target does not support atomic profile update, " + "single mode is selected"); flag_profile_update = PROFILE_UPDATE_SINGLE; } else if (flag_profile_update == PROFILE_UPDATE_PREFER_ATOMIC) - flag_profile_update - = can_support_atomic ? PROFILE_UPDATE_ATOMIC : PROFILE_UPDATE_SINGLE; + { + if (can_support_atomic) + flag_profile_update = PROFILE_UPDATE_ATOMIC; + else + { + if (needs_split) + counter_update = COUNTER_UPDATE_ATOMIC_PARTIAL; + flag_profile_update = PROFILE_UPDATE_SINGLE; + } + } if (flag_profile_update == PROFILE_UPDATE_ATOMIC) {