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.
This commit is contained in:
Sebastian Huber
2025-12-30 00:41:38 +01:00
parent 8cd878a2f0
commit bd0d3ba672

View File

@@ -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)
{