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.
---
 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