Hello,
I apologize for late reply here.  I went thru the paper in gereater
detail. While I originally though the usual path-profiling can be
reasonably merged with the prime math profiling, so it is useful both
for optimizaiton and coverage testing, I think it is better to not do
that - the requirements of prime path profiling are rather specific and
expensive to get right.
> 
> gcc/ChangeLog:
> 
>       * Makefile.in (OBJS): Add prime-paths.o, path-coverage.o.
>       (GTFILES): Add prime-paths.cc, path-coverage.cc
>       (GCOV_OBJS): Add graphds.o, prime-paths.o, bitmap.o
>       * builtins.cc (expand_builtin_fork_or_exec): Check
>       path_coverage_flag.
>       * collect2.cc (main): Add -fno-path-coverage to OBSTACK.
>       * common.opt: Add new options -fpath-coverage,
>       -fpath-coverage-limit, -Wcoverage-too-many-paths
>       * doc/gcov.texi: Add --prime-paths, --prime-paths-lines,
>       --prime-paths-source documentation.
>       * doc/invoke.texi: Add -fpath-coverage, -fpath-coverage-limit,
>       -Wcoverage-too-many-paths documentation.
>       * gcc.cc: Link gcov on -fpath-coverage.
>       * gcov-counter.def (GCOV_COUNTER_PATHS): New.
>       * gcov-io.h (GCOV_TAG_PATHS): New.
>       (GCOV_TAG_PATHS_LENGTH): New.
>       (GCOV_TAG_PATHS_NUM): New.
>       * gcov.cc (class path_info): New.
>       (struct coverage_info): Add paths, paths_covered.
>       (find_prime_paths): New.
>       (add_path_counts): New.
>       (find_arc): New.
>       (print_usage): Add -e, --prime-paths, --prime-paths-lines,
>       --prime-paths-source.
>       (process_args): Likewise.
>       (json_set_prime_path_coverage): New.
>       (output_json_intermediate_file): Call
>       json_set_prime_path_coverage.
>       (process_all_functions): Call find_prime_paths.
>       (generate_results): Call add_path_counts.
>       (read_graph_file): Read path counters.
>       (read_count_file): Likewise.
>       (function_summary): Print path counts.
>       (file_summary): Likewise.
>       (print_source_line): New.
>       (print_prime_path_lines): New.
>       (print_inlined_separator): New.
>       (print_prime_path_source): New.
>       (output_path_coverage): New.
>       (output_lines): Print path coverage.
>       * ipa-inline.cc (can_early_inline_edge_p): Check
>       path_coverage_flag.
>       * passes.cc (finish_optimization_passes): Likewise.
>       * profile.cc (branch_prob): Likewise.
>       * selftest-run-tests.cc (selftest::run_tests): Run path coverage
>       tests.
>       * selftest.h (path_coverage_cc_tests): New declaration.
>       * tree-profile.cc (tree_profiling): Check path_coverage_flag.
>       (pass_ipa_tree_profile::gate): Likewise.
>       * path-coverage.cc: New file.
>       * prime-paths.cc: New file.
> 
> gcc/testsuite/ChangeLog:
> 
>       * lib/gcov.exp: Add prime paths test function.
>       * g++.dg/gcov/gcov-22.C: New test.
>       * g++.dg/gcov/gcov-23-1.h: New test.
>       * g++.dg/gcov/gcov-23-2.h: New test.
>       * g++.dg/gcov/gcov-23.C: New test.
>       * gcc.misc-tests/gcov-29.c: New test.
>       * gcc.misc-tests/gcov-30.c: New test.
>       * gcc.misc-tests/gcov-31.c: New test.
>       * gcc.misc-tests/gcov-32.c: New test.
>       * gcc.misc-tests/gcov-33.c: New test.
>       * gcc.misc-tests/gcov-34.c: New test.
> ---
>  gcc/Makefile.in                        |    6 +-
>  gcc/builtins.cc                        |    2 +-
>  gcc/collect2.cc                        |    6 +-
>  gcc/common.opt                         |   16 +
>  gcc/doc/gcov.texi                      |  187 +++
>  gcc/doc/invoke.texi                    |   36 +
>  gcc/gcc.cc                             |    4 +-
>  gcc/gcov-counter.def                   |    3 +
>  gcc/gcov-io.h                          |    3 +
>  gcc/gcov.cc                            |  487 +++++-
>  gcc/ipa-inline.cc                      |    2 +-
>  gcc/passes.cc                          |    4 +-
>  gcc/path-coverage.cc                   |  776 +++++++++
>  gcc/prime-paths.cc                     | 2052 ++++++++++++++++++++++++
>  gcc/profile.cc                         |    6 +-
>  gcc/selftest-run-tests.cc              |    1 +
>  gcc/selftest.h                         |    1 +
>  gcc/testsuite/g++.dg/gcov/gcov-22.C    |  170 ++
>  gcc/testsuite/g++.dg/gcov/gcov-23-1.h  |    9 +
>  gcc/testsuite/g++.dg/gcov/gcov-23-2.h  |    9 +
>  gcc/testsuite/g++.dg/gcov/gcov-23.C    |   30 +
>  gcc/testsuite/gcc.misc-tests/gcov-29.c |  869 ++++++++++
>  gcc/testsuite/gcc.misc-tests/gcov-30.c |  869 ++++++++++
>  gcc/testsuite/gcc.misc-tests/gcov-31.c |   35 +
>  gcc/testsuite/gcc.misc-tests/gcov-32.c |   24 +
>  gcc/testsuite/gcc.misc-tests/gcov-33.c |   27 +
>  gcc/testsuite/gcc.misc-tests/gcov-34.c |   29 +
>  gcc/testsuite/lib/gcov.exp             |  118 +-
>  gcc/tree-profile.cc                    |   11 +-
>  29 files changed, 5775 insertions(+), 17 deletions(-)
>  create mode 100644 gcc/path-coverage.cc
>  create mode 100644 gcc/prime-paths.cc
>  create mode 100644 gcc/testsuite/g++.dg/gcov/gcov-22.C
>  create mode 100644 gcc/testsuite/g++.dg/gcov/gcov-23-1.h
>  create mode 100644 gcc/testsuite/g++.dg/gcov/gcov-23-2.h
>  create mode 100644 gcc/testsuite/g++.dg/gcov/gcov-23.C
>  create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-29.c
>  create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-30.c
>  create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-31.c
>  create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-32.c
>  create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-33.c
>  create mode 100644 gcc/testsuite/gcc.misc-tests/gcov-34.c
> 

> diff --git a/gcc/builtins.cc b/gcc/builtins.cc
> index 9d106405f79..e70a8132337 100644
> --- a/gcc/builtins.cc
> +++ b/gcc/builtins.cc
> @@ -6362,7 +6362,7 @@ expand_builtin_fork_or_exec (tree fn, tree exp, rtx 
> target, int ignore)
>    tree call;
>  
>    /* If we are not profiling, just call the function.  */
> -  if (!profile_arc_flag && !condition_coverage_flag)
> +  if (!profile_arc_flag && !condition_coverage_flag && !path_coverage_flag)

It is somewhat ugly to keep adding new flags in many places.  Can you
please add predicate profile_instrumentation_p () (better neame welcome)
and use it on all places?
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index 18322247fb4..a754405ada6 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -659,6 +659,7 @@ Objective-C and Objective-C++ Dialects}.
>  @xref{Instrumentation Options,,Program Instrumentation Options}.
>  @gccoptlist{-p  -pg  -fprofile-arcs  --coverage  -ftest-coverage
>  -fcondition-coverage
> +-fpath-coverage
>  -fprofile-abs-path
>  -fprofile-dir=@var{path}  -fprofile-generate  -fprofile-generate=@var{path}
>  -fprofile-info-section  -fprofile-info-section=@var{name}
> @@ -6689,6 +6690,13 @@ terms and GCC gives up coverage.  Coverage is given up 
> when there are more
>  terms in the conditional than there are bits in a @code{gcov_type_unsigned}.
>  This warning is enabled by default.
>  
> +@opindex Wno-coverage-too-many-paths
> +@opindex Wcoverage-too-many-paths
> +@item -Wno-coverage-too-many-paths
> +Warn if @option{-fpath-coverage} is used and a function has too many
> +paths and GCC gives up coverage.  Giving up is controlled by
> +@option{-fpath-coverage-limit}.  This warning is enabled by default.
> +
>  @opindex Wno-coverage-invalid-line-number
>  @opindex Wcoverage-invalid-line-number
>  @item -Wno-coverage-invalid-line-number
> @@ -17464,6 +17472,26 @@ can be used to verify that all terms in a Boolean 
> function are tested and have
>  an independent effect on the outcome of a decision.  The result can be read
>  with @code{gcov --conditions}.
>  
> +@item -fpath-coverage
> +@opindex fpath-coverage
> +Add code so that the paths taken are tracked.  During execution the
> +program records the prime paths taken.  The number of paths grows very
> +fast with complexity, and to avoid exploding compile times GCC will give
> +up instrumentation if the approximate number of paths exceeds the limit
> +controlled by @option{-fpath-coverage-limit}.  The result can be read
> +with @code{gcov --prime-paths --prime-paths-lines --prime-paths-source}.

Do we have a way to link the section of gcov manual? (I am not quite
sure - my texinfo skills are rather pedestrian).

Patch is OK with this change.  Do you plan more profiling work next
stage1?  I realize that this is second time I left long patch from you
to slip for many months, which is not good.  Contributions are welcome
and I will try to do better.

Honza

Reply via email to