On Mon, Mar 31, 2025 at 7:54 PM Jørgen Kvalsvik <j...@lambda.is> wrote:
>
> gcov_write_* functions must be guarded so they only are called when
> output_to_file is true, like for -fcondition-coverage, otherwise it
> triggers an invalid read as detected by valgrind. The gcno file is
> mostly written to from profile.cc, so it doesn't make too much sense
> to hide it in path-coverage.cc. The find_paths name was a bit
> imprecise, and is renamed to instrument_prime_paths.

OK.

Richard.

>         PR gcov-profile/119553
>
> gcc/ChangeLog:
>
>         * path-coverage.cc (find_paths): Return path count, don't
>         write to gcno, and rename to ...
>         (instrument_prime_paths): ... this.
>         * profile.cc (branch_prob): Write path counts to gcno.
> ---
>  gcc/path-coverage.cc | 15 ++++++---------
>  gcc/profile.cc       | 12 ++++++++++--
>  2 files changed, 16 insertions(+), 11 deletions(-)
>
> diff --git a/gcc/path-coverage.cc b/gcc/path-coverage.cc
> index 55b39298603..55058fd04ff 100644
> --- a/gcc/path-coverage.cc
> +++ b/gcc/path-coverage.cc
> @@ -504,8 +504,8 @@ flush_on_gsi (gimple_stmt_iterator *gsi, size_t bucket, 
> tree local, tree mask,
>     bit N%64 in bucket N/64.  For large functions, an individual basic block
>     will only be part of a small subset of paths, and by extension buckets and
>     local counters.  Only the necessary counters are read and written.  */
> -void
> -find_paths (struct function *fn)
> +unsigned
> +instrument_prime_paths (struct function *fn)
>  {
>    mark_dfs_back_edges (fn);
>    vec<vec<int>> paths = find_prime_paths (fn);
> @@ -515,7 +515,7 @@ find_paths (struct function *fn)
>        warning_at (fn->function_start_locus, OPT_Wcoverage_too_many_paths,
>                   "paths exceeding limit, giving up path coverage");
>        release_vec_vec (paths);
> -      return;
> +      return 0;
>      }
>
>    tree gcov_type_node = get_gcov_type ();
> @@ -526,14 +526,9 @@ find_paths (struct function *fn)
>    if (!coverage_counter_alloc (GCOV_COUNTER_PATHS, nbuckets))
>      {
>        release_vec_vec (paths);
> -      return;
> +      return 0;
>      }
>
> -  gcov_position_t offset {};
> -  offset = gcov_write_tag (GCOV_TAG_PATHS);
> -  gcov_write_unsigned (paths.length ());
> -  gcov_write_length (offset);
> -
>    hash_map <edge_hash, uint64_t> ands;
>    hash_map <block_hash, uint64_t> iors;
>    hash_map <block_hash, uint64_t> flushes;
> @@ -771,6 +766,8 @@ find_paths (struct function *fn)
>         }
>      }
>
> +  const unsigned npaths = paths.length ();
>    blocks.release ();
>    release_vec_vec (paths);
> +  return npaths;
>  }
> diff --git a/gcc/profile.cc b/gcc/profile.cc
> index 0b222cf3864..c0f5097726b 100644
> --- a/gcc/profile.cc
> +++ b/gcc/profile.cc
> @@ -1611,9 +1611,17 @@ branch_prob (bool thunk)
>         instrument_values (values);
>      }
>
> -  void find_paths (struct function*);
> +  unsigned instrument_prime_paths (struct function*);
>    if (path_coverage_flag)
> -    find_paths (cfun);
> +    {
> +      const unsigned npaths = instrument_prime_paths (cfun);
> +      if (output_to_file)
> +       {
> +         gcov_position_t offset = gcov_write_tag (GCOV_TAG_PATHS);
> +         gcov_write_unsigned (npaths);
> +         gcov_write_length (offset);
> +       }
> +    }
>
>    free_aux_for_edges ();
>
> --
> 2.39.5
>

Reply via email to