> 2013-11-19 Rong Xu <[email protected]>
>
> * gcc/gcov-io.h: Add atomic function macros for compiler use.
> * gcc/common.opt (fprofile-generate-atomic): New option.
> * gcc/tree-profile.c (gimple_init_edge_profiler): Support for
> atomic counter update.
> (gimple_gen_edge_profiler): Ditto.
> * libgcc/libgcov-profiler.c
> (__gcov_interval_profiler_atomic): Ditto.
> (__gcov_pow2_profiler_atomic): Ditto.
> (__gcov_one_value_profiler_body_atomic): Ditto.
> (__gcov_one_value_profiler_atomic): Ditto.
> (__gcov_indirect_call_profiler_atomic): Ditto.
> (__gcov_indirect_call_profiler_v2_atomic): Ditto.
> (__gcov_time_profiler_atomic): Ditto.
> (__gcov_average_profiler_atomic): Ditto.
> * gcc/gcc.c: Link libatomic when -fprofile-generate-atomic used.
> * libgcc/Makefile.in: Add atomic objects.
>
> Index: gcc/common.opt
> ===================================================================
> --- gcc/common.opt (revision 205053)
> +++ gcc/common.opt (working copy)
> @@ -1684,6 +1684,15 @@ fprofile-correction
> Common Report Var(flag_profile_correction)
> Enable correction of flow inconsistent profile data input
>
> +; fprofile-generate-atomic=0: default and disable atomical update.
> +; fprofile-generate-atomic=1: atomically update edge profile counters.
> +; fprofile-generate-atomic=2: atomically update value profile counters.
> +; fprofile-generate-atomic=3: atomically update edge and value profile
> counters.
> +; other values will be ignored (fall back to the default of 0).
> +fprofile-generate-atomic=
> +Common Joined UInteger Report Var(flag_profile_generate_atomic) Init(3)
> Optimization
> +fprofile-generate-atomic=[0..3] Atomical increments of profile counters.
Instead magic numbers I would preffer flags, like "edge" and "value"
and permiting combinations like -ffprofile-generate-atomic=edge,value
I wonder about the option name, I suppose this option also combine with
-ftest-coverage
(and no longer too useful -fprofile-arcs), so the profile-generate prefix may
be bit
misleading here (giving an impression that it is not useful in this case).
But I can't think of something really better.
Other thing I wonder about is that we may want to implement alternative
solution with
TLS or smaller per-thread buffers and locked updates. It would be bit
difficult to
extend -fprofile-generate-atomic to this...
> @@ -155,6 +155,9 @@ gimple_init_edge_profiler (void)
> tree ic_profiler_fn_type;
> tree average_profiler_fn_type;
> tree time_profiler_fn_type;
> + const char *fn_name;
> + bool profile_gen_value_atomic = (flag_profile_generate_atomic == 2 ||
> + flag_profile_generate_atomic == 3);
>
> if (!gcov_type_node)
> {
Will this work with optimization attributes?
The rest of patch looks OK, lets settle option name and get it in.
Sorry for dropping the ball for 4.8.