> From: Dhruv Chawla <[email protected]>
> 
> This option prints the current version of GCOV that is being used by the
> AutoFDO infrastructure. This avoids the need to bump the number across
> mutiple files in the build system for future increments to it.
> 
> Bootstrapped and regtested on aarch64-linux-gnu.
> 
> Signed-off-by: Dhruv Chawla <[email protected]>
> 
> gcc/ChangeLog:
> 
>       * Makefile.in (all.fda): Add `--print-autofdo-gcov-version` to
>       profile_merger invocation.
>       * auto-profile.cc (AUTO_PROFILE_VERSION): Move from here ...
>       * auto-profile.h (AUTO_PROFILE_VERSION): ... to here.
>       * common.opt: Add -print-autofdo-gcov-version and
>       --print-autofdo-gcov-version.
>       * doc/invoke.texi: Document the options.
>       * gcc.cc: Add include for auto-profile.h.
>       (driver_handle_option): Add OPT_print_autofdo_gcov_version.
>       (driver::maybe_print_and_exit): Handle the option.
> 
> gcc/c/ChangeLog:
> 
>       * Make-lang.in: Add `--print-autofdo-gcov-version` to
>       profile_merger and create_gcov invocations.
> 
> gcc/cp/ChangeLog:
> 
>       * Make-lang.in: Likewise.
> 
> gcc/lto/ChangeLog:
> 
>       * Make-lang.in: Likewise.
> 
> gcc/testsuite/ChangeLog:
> 
>       * lib/profopt.exp: Invoke $GCC_UNDER_TEST with
>       `--print-autofdo-gcov-version` before running create_gcov to get
>       the GCOV version.
OK,
thanks!

Honza
> ---
>  gcc/Makefile.in               | 2 +-
>  gcc/auto-profile.cc           | 1 -
>  gcc/auto-profile.h            | 2 ++
>  gcc/c/Make-lang.in            | 6 +++---
>  gcc/common.opt                | 6 ++++++
>  gcc/cp/Make-lang.in           | 6 +++---
>  gcc/doc/invoke.texi           | 7 +++++++
>  gcc/gcc.cc                    | 8 ++++++++
>  gcc/lto/Make-lang.in          | 6 +++---
>  gcc/testsuite/lib/profopt.exp | 5 ++++-
>  10 files changed, 37 insertions(+), 12 deletions(-)
> 
> diff --git a/gcc/Makefile.in b/gcc/Makefile.in
> index 9e8da255186..6da805fbb62 100644
> --- a/gcc/Makefile.in
> +++ b/gcc/Makefile.in
> @@ -4818,7 +4818,7 @@ paranoia: paranoia.o real.o $(LIBIBERTY)
>       g++ -o $@ paranoia.o real.o $(LIBIBERTY)
>  
>  all.fda: $(ALL_FDAS)
> -     $(PROFILE_MERGER) $(ALL_FDAS) --output_file all.fda -gcov_version 3
> +     $(PROFILE_MERGER) $(ALL_FDAS) --output_file all.fda -gcov_version 
> `../stage1-gcc/xgcc$(exeext) --print-autofdo-gcov-version`
>  
>  # These exist for maintenance purposes.
>  
> diff --git a/gcc/auto-profile.cc b/gcc/auto-profile.cc
> index b448565376d..34f863a7731 100644
> --- a/gcc/auto-profile.cc
> +++ b/gcc/auto-profile.cc
> @@ -122,7 +122,6 @@ along with GCC; see the file COPYING3.  If not see
>  */
>  
>  #define DEFAULT_AUTO_PROFILE_FILE "fbdata.afdo"
> -#define AUTO_PROFILE_VERSION 3
>  
>  /* profile counts determined by AFDO smaller than afdo_hot_bb_threshold are
>     considered cols.  */
> diff --git a/gcc/auto-profile.h b/gcc/auto-profile.h
> index d971401238e..2685a1453c5 100644
> --- a/gcc/auto-profile.h
> +++ b/gcc/auto-profile.h
> @@ -21,6 +21,8 @@ along with GCC; see the file COPYING3.  If not see
>  #ifndef AUTO_PROFILE_H
>  #define AUTO_PROFILE_H
>  
> +#define AUTO_PROFILE_VERSION 3
> +
>  /* Read, process, finalize AutoFDO data structures.  */
>  extern void read_autofdo_file (void);
>  extern void end_auto_profile (void);
> diff --git a/gcc/c/Make-lang.in b/gcc/c/Make-lang.in
> index fd127caba91..313bba88835 100644
> --- a/gcc/c/Make-lang.in
> +++ b/gcc/c/Make-lang.in
> @@ -93,7 +93,7 @@ components_in_prev = "bfd opcodes binutils fixincludes gas 
> gcc gmp mpfr mpc isl
>  components_in_prev_target = "libstdc++-v3 libsanitizer libvtv libgcc 
> libbacktrace libphobos zlib libgomp libatomic"
>  
>  cc1.fda: create_fdas_for_cc1
> -     $(PROFILE_MERGER) $(shell ls -ha cc1_*.fda) --output_file cc1.fda 
> -gcov_version 3
> +     $(PROFILE_MERGER) $(shell ls -ha cc1_*.fda) --output_file cc1.fda 
> -gcov_version `../stage1-gcc/xgcc$(exeext) --print-autofdo-gcov-version`
>  
>  create_fdas_for_cc1: ../stage1-gcc/cc1$(exeext) ../prev-gcc/$(PERF_DATA)
>       for component_in_prev in "$(components_in_prev)"; do \
> @@ -102,7 +102,7 @@ create_fdas_for_cc1: ../stage1-gcc/cc1$(exeext) 
> ../prev-gcc/$(PERF_DATA)
>         echo $$perf_path; \
>         if [ -f $$perf_path ]; then \
>           profile_name=cc1_$$component_in_prev.fda; \
> -         $(CREATE_GCOV) -binary ../stage1-gcc/cc1$(exeext) -gcov 
> $$profile_name -profile $$perf_path -gcov_version 3 || exit 1; \
> +         $(CREATE_GCOV) -binary ../stage1-gcc/cc1$(exeext) -gcov 
> $$profile_name -profile $$perf_path -gcov_version 
> `../stage1-gcc/xgcc$(exeext) --print-autofdo-gcov-version` || exit 1; \
>         fi; \
>       done;
>  
> @@ -112,7 +112,7 @@ create_fdas_for_cc1: ../stage1-gcc/cc1$(exeext) 
> ../prev-gcc/$(PERF_DATA)
>         echo $$perf_path; \
>         if [ -f $$perf_path ]; then \
>           profile_name=cc1_$$component_in_prev_target.fda; \
> -         $(CREATE_GCOV) -binary ../prev-gcc/cc1$(exeext) -gcov 
> $$profile_name -profile $$perf_path -gcov_version 3 || exit 1; \
> +         $(CREATE_GCOV) -binary ../prev-gcc/cc1$(exeext) -gcov 
> $$profile_name -profile $$perf_path -gcov_version `../prev-gcc/xgcc$(exeext) 
> --print-autofdo-gcov-version` || exit 1; \
>         fi; \
>       done;
>  
> diff --git a/gcc/common.opt b/gcc/common.opt
> index 88b79bbf8f5..e46f249e380 100644
> --- a/gcc/common.opt
> +++ b/gcc/common.opt
> @@ -349,6 +349,9 @@ Driver JoinedOrMissing Alias(B)
>  -preprocess
>  Driver Alias(E)
>  
> +-print-autofdo-gcov-version
> +Driver Alias(print-autofdo-gcov-version)
> +
>  -print-file-name
>  Driver Separate Alias(print-file-name=)
>  
> @@ -3902,6 +3905,9 @@ Driver
>  pipe
>  Driver Var(use_pipes)
>  
> +print-autofdo-gcov-version
> +Driver Var(print_autofdo_gcov_version)
> +
>  print-file-name=
>  Driver JoinedOrMissing Var(print_file_name)
>  
> diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in
> index 55be730f502..621c53632fc 100644
> --- a/gcc/cp/Make-lang.in
> +++ b/gcc/cp/Make-lang.in
> @@ -210,7 +210,7 @@ components_in_prev = "bfd opcodes binutils fixincludes 
> gas gcc gmp mpfr mpc isl
>  components_in_prev_target = "libstdc++-v3 libsanitizer libvtv libgcc 
> libbacktrace libphobos zlib libgomp libatomic"
>  
>  cc1plus.fda: create_fdas_for_cc1plus
> -     $(PROFILE_MERGER) $(shell ls -ha cc1plus_*.fda) --output_file 
> cc1plus.fda -gcov_version 3
> +     $(PROFILE_MERGER) $(shell ls -ha cc1plus_*.fda) --output_file 
> cc1plus.fda -gcov_version `../stage1-gcc/xgcc$(exeext) 
> --print-autofdo-gcov-version`
>  
>  create_fdas_for_cc1plus: ../stage1-gcc/cc1plus$(exeext) 
> ../prev-gcc/$(PERF_DATA)
>       for component_in_prev in "$(components_in_prev)"; do \
> @@ -219,7 +219,7 @@ create_fdas_for_cc1plus: ../stage1-gcc/cc1plus$(exeext) 
> ../prev-gcc/$(PERF_DATA)
>         echo $$perf_path; \
>         if [ -f $$perf_path ]; then \
>           profile_name=cc1plus_$$component_in_prev.fda; \
> -         $(CREATE_GCOV) -binary ../stage1-gcc/cc1plus$(exeext) -gcov 
> $$profile_name -profile $$perf_path -gcov_version 3 || exit 1; \
> +         $(CREATE_GCOV) -binary ../stage1-gcc/cc1plus$(exeext) -gcov 
> $$profile_name -profile $$perf_path -gcov_version 
> `../stage1-gcc/xgcc$(exeext) --print-autofdo-gcov-version` || exit 1; \
>         fi; \
>       done;
>  
> @@ -229,7 +229,7 @@ create_fdas_for_cc1plus: ../stage1-gcc/cc1plus$(exeext) 
> ../prev-gcc/$(PERF_DATA)
>         echo $$perf_path; \
>         if [ -f $$perf_path ]; then \
>           profile_name=cc1plus_$$component_in_prev_target.fda; \
> -         $(CREATE_GCOV) -binary ../prev-gcc/cc1plus$(exeext) -gcov 
> $$profile_name -profile $$perf_path -gcov_version 3 || exit 1; \
> +         $(CREATE_GCOV) -binary ../prev-gcc/cc1plus$(exeext) -gcov 
> $$profile_name -profile $$perf_path -gcov_version `../prev-gcc/xgcc$(exeext) 
> --print-autofdo-gcov-version` || exit 1; \
>         fi; \
>       done;
>  
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index 60d0b570710..ee5487824aa 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -865,6 +865,7 @@ Objective-C and Objective-C++ Dialects}.
>  -fsel-sched-verbose  -fsel-sched-dump-cfg  -fsel-sched-pipelining-verbose
>  -fstats  -fstack-usage  -ftime-report  -ftime-report-details
>  -fvar-tracking-assignments-toggle  -gtoggle
> +-print-autofdo-gcov-version
>  -print-file-name=@var{library}  -print-libgcc-file-name
>  -print-multi-directory  -print-multi-lib  -print-multi-os-directory
>  -print-multiarch
> @@ -872,6 +873,7 @@ Objective-C and Objective-C++ Dialects}.
>  -print-sysroot  -print-sysroot-headers-suffix
>  -save-temps  -save-temps=cwd  -save-temps=obj  -time@r{[}=@var{file}@r{]}
>  --dump=@var{letters}
> +--print-autofdo-gcov-version
>  --print-file-name=@var{library}  --print-libgcc-file-file-name
>  --print-multi-directory  --print-multi-lib  --print-multi-os-directory
>  --print-multiarch  --print-prog-name=@var{program}
> @@ -21027,6 +21029,11 @@ For example, with 
> @option{-fdbg-cnt=dce:2-4:10-11,tail_call:10},
>  eleventh invocation.
>  For @code{dbg_cnt(tail_call)} true is returned for first 10 invocations.
>  
> +@opindex print-autofdo-gcov-version
> +@item -print-autofdo-gcov-version
> +@itemx --print-autofdo-gcov-version
> +Print the current version of GCOV being used by the AutoFDO infrastructure.
> +
>  @opindex print-file-name
>  @item -print-file-name=@var{library}
>  @itemx --print-file-name=@var{library}
> diff --git a/gcc/gcc.cc b/gcc/gcc.cc
> index 065f69c9d8b..aa8e5553982 100644
> --- a/gcc/gcc.cc
> +++ b/gcc/gcc.cc
> @@ -54,6 +54,7 @@ compilation is specified by a string called a "spec".  */
>  #include "common/common-target.h"
>  #include "gcc-urlifier.h"
>  #include "opts-diagnostic.h"
> +#include "auto-profile.h" /* for AUTO_PROFILE_VERSION.  */
>  
>  #ifndef MATH_LIBRARY
>  #define MATH_LIBRARY "m"
> @@ -4297,6 +4298,7 @@ driver_handle_option (struct gcc_options *opts,
>      case OPT__no_sysroot_suffix:
>      case OPT_pass_exit_codes:
>      case OPT_print_search_dirs:
> +    case OPT_print_autofdo_gcov_version:
>      case OPT_print_file_name_:
>      case OPT_print_prog_name_:
>      case OPT_print_multi_lib:
> @@ -8830,6 +8832,12 @@ driver::maybe_print_and_exit () const
>        return (0);
>      }
>  
> +  if (print_autofdo_gcov_version)
> +    {
> +      printf ("%d\n", AUTO_PROFILE_VERSION);
> +      return (0);
> +    }
> +
>    if (print_file_name)
>      {
>        printf ("%s\n", find_file (print_file_name));
> diff --git a/gcc/lto/Make-lang.in b/gcc/lto/Make-lang.in
> index eacfe53ca14..3d8c1f55376 100644
> --- a/gcc/lto/Make-lang.in
> +++ b/gcc/lto/Make-lang.in
> @@ -106,7 +106,7 @@ components_in_prev = "bfd opcodes binutils fixincludes 
> gas gcc gmp mpfr mpc isl
>  components_in_prev_target = "libstdc++-v3 libsanitizer libvtv libgcc 
> libbacktrace libphobos zlib libgomp libatomic"
>  
>  lto1.fda: create_fdas_for_lto1
> -     $(PROFILE_MERGER) $(shell ls -ha lto1_*.fda) --output_file lto1.fda 
> -gcov_version 3
> +     $(PROFILE_MERGER) $(shell ls -ha lto1_*.fda) --output_file lto1.fda 
> -gcov_version `../stage1-gcc/xgcc$(exeext) --print-autofdo-gcov-version`
>  
>  create_fdas_for_lto1: ../stage1-gcc/lto1$(exeext) ../prev-gcc/$(PERF_DATA)
>       for component_in_prev in "$(components_in_prev)"; do \
> @@ -115,7 +115,7 @@ create_fdas_for_lto1: ../stage1-gcc/lto1$(exeext) 
> ../prev-gcc/$(PERF_DATA)
>         echo $$perf_path; \
>         if [ -f $$perf_path ]; then \
>           profile_name=lto1_$$component_in_prev.fda; \
> -         $(CREATE_GCOV) -binary ../stage1-gcc/lto1$(exeext) -gcov 
> $$profile_name -profile $$perf_path -gcov_version 3 || exit 1; \
> +         $(CREATE_GCOV) -binary ../stage1-gcc/lto1$(exeext) -gcov 
> $$profile_name -profile $$perf_path -gcov_version 
> `../stage1-gcc/xgcc$(exeext) --print-autofdo-gcov-version` || exit 1; \
>         fi; \
>       done;
>  
> @@ -125,7 +125,7 @@ create_fdas_for_lto1: ../stage1-gcc/lto1$(exeext) 
> ../prev-gcc/$(PERF_DATA)
>         echo $$perf_path; \
>         if [ -f $$perf_path ]; then \
>           profile_name=lto1_$$component_in_prev_target.fda; \
> -         $(CREATE_GCOV) -binary ../prev-gcc/lto1$(exeext) -gcov 
> $$profile_name -profile $$perf_path -gcov_version 3 || exit 1; \
> +         $(CREATE_GCOV) -binary ../prev-gcc/lto1$(exeext) -gcov 
> $$profile_name -profile $$perf_path -gcov_version `../prev-gcc/xgcc$(exeext) 
> --print-autofdo-gcov-version` || exit 1; \
>         fi; \
>       done;
>  
> diff --git a/gcc/testsuite/lib/profopt.exp b/gcc/testsuite/lib/profopt.exp
> index c9f5ae53d49..d1266539003 100644
> --- a/gcc/testsuite/lib/profopt.exp
> +++ b/gcc/testsuite/lib/profopt.exp
> @@ -313,6 +313,7 @@ proc profopt-execute { src } {
>      global verbose
>      global testname_with_flags
>      global additional_sources_used
> +    global GCC_UNDER_TEST
>  
>      if ![info exists profile_option] {
>          error "No profile option specified for first compile."
> @@ -453,7 +454,9 @@ proc profopt-execute { src } {
>           # convert profile
>           if { $run_autofdo == 1 } {
>                  set bprefix "afdo."
> -             set cmd "create_gcov --binary $execname1 
> --profile=$tmpdir/$base.perf.data --gcov_version=3 
> --gcov=$tmpdir/$bprefix$base.$ext"
> +             set compiler [lindex $GCC_UNDER_TEST 0]
> +             set autofdo_version [string trim [lindex [remote_exec target 
> "$compiler --print-autofdo-gcov-version"] 1] ]
> +             set cmd "create_gcov --binary $execname1 
> --profile=$tmpdir/$base.perf.data --gcov_version=$autofdo_version 
> --gcov=$tmpdir/$bprefix$base.$ext"
>               verbose "Running $cmd"
>               set id [remote_spawn "" $cmd]
>               if { $id < 0 } {
> -- 
> 2.52.0
> 

Reply via email to