If get_gcov_type() returns a 64-bit type, then 64-bit atomic operations in
hardware are required for the "atomic" method. Add a new method to force
atomic operations even if a library implementation (libatomic) must be used.
gcc/
* common.opt (fprofile-update): Add force-atomic method.
* coretypes.h (profile_update): Add PROFILE_UPDATE_FORCE_ATOMIC.
* doc/invoke.texi (fprofile-update): Document force-atomic method.
* tree-profile.c (tree_profiling): Support force-atomic method.
---
gcc/common.opt | 5 ++++-
gcc/coretypes.h | 3 ++-
gcc/doc/invoke.texi | 14 +++++++++-----
gcc/tree-profile.c | 2 ++
4 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/gcc/common.opt b/gcc/common.opt
index d9da1131eda..ea887c987af 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -2247,7 +2247,7 @@ Enable correction of flow inconsistent profile data input.
fprofile-update=
Common Joined RejectNegative Enum(profile_update) Var(flag_profile_update)
Init(PROFILE_UPDATE_SINGLE)
--fprofile-update=[single|atomic|prefer-atomic] Set the profile update method.
+-fprofile-update=[single|atomic|prefer-atomic|force-atomic] Set the profile
update method.
fprofile-filter-files=
Common Joined RejectNegative Var(flag_profile_filter_files)
@@ -2285,6 +2285,9 @@ Enum(profile_update) String(atomic)
Value(PROFILE_UPDATE_ATOMIC)
EnumValue
Enum(profile_update) String(prefer-atomic) Value(PROFILE_UPDATE_PREFER_ATOMIC)
+EnumValue
+Enum(profile_update) String(force-atomic) Value(PROFILE_UPDATE_FORCE_ATOMIC)
+
fprofile-prefix-path=
Common Joined RejectNegative Var(profile_prefix_path)
Remove prefix from absolute path before mangling name for -fprofile-generate=
and -fprofile-use=.
diff --git a/gcc/coretypes.h b/gcc/coretypes.h
index 406572e947d..ded8e718994 100644
--- a/gcc/coretypes.h
+++ b/gcc/coretypes.h
@@ -209,7 +209,8 @@ enum offload_abi {
enum profile_update {
PROFILE_UPDATE_SINGLE,
PROFILE_UPDATE_ATOMIC,
- PROFILE_UPDATE_PREFER_ATOMIC
+ PROFILE_UPDATE_PREFER_ATOMIC,
+ PROFILE_UPDATE_FORCE_ATOMIC
};
/* Type of profile reproducibility methods. */
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index a64cec5387e..df920545ac1 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -14905,11 +14905,11 @@ part of the path and keep all file names relative to
the main build directory.
@item -fprofile-update=@var{method}
@opindex fprofile-update
-Alter the update method for an application instrumented for profile
-feedback based optimization. The @var{method} argument should be one of
-@samp{single}, @samp{atomic} or @samp{prefer-atomic}.
-The first one is useful for single-threaded applications,
-while the second one prevents profile corruption by emitting thread-safe code.
+Alter the update method for an application instrumented for profile feedback
+based optimization or code-coverage. The @var{method} argument should be one
+of @samp{single}, @samp{atomic}, @samp{prefer-atomic} or @samp{force-atomic}.
+The first one is useful for single-threaded applications, while the second one
+prevents profile corruption by emitting thread-safe code.
@strong{Warning:} When an application does not properly join all threads
(or creates an detached thread), a profile file can be still corrupted.
@@ -14919,6 +14919,10 @@ when supported by a target, or to @samp{single}
otherwise. The GCC driver
automatically selects @samp{prefer-atomic} when @option{-pthread}
is present in the command line.
+Using @samp{force-atomic} forces the use of an @samp{atomic} method even if the
+target does not support it directly in hardware and a library implementation
+must be used instead.
+
@item -fprofile-filter-files=@var{regex}
@opindex fprofile-filter-files
diff --git a/gcc/tree-profile.c b/gcc/tree-profile.c
index 5a74cc96e13..ac2ef4ccdf2 100644
--- a/gcc/tree-profile.c
+++ b/gcc/tree-profile.c
@@ -718,6 +718,8 @@ tree_profiling (void)
else if (flag_profile_update == PROFILE_UPDATE_PREFER_ATOMIC)
flag_profile_update = can_support_atomic
? PROFILE_UPDATE_ATOMIC : PROFILE_UPDATE_SINGLE;
+ else if (flag_profile_update == PROFILE_UPDATE_FORCE_ATOMIC)
+ flag_profile_update = PROFILE_UPDATE_ATOMIC;
/* This is a small-ipa pass that gets called only once, from
cgraphunit.c:ipa_passes(). */
--
2.26.2