From: Dhruv Chawla <[email protected]> This patch adds support for ARM SPE as a profiler to gcc-auto-profile and the corresponding detection required for passing the --profiler=perf_spe option to create_gcov when creating the GCOV files.
Errors from create_gcov are also set to be ignored. This is because some of the profiles end up not including invocations of one of cc1, cc1plus or lto1 and trying to use them to generate the GCOV with the missing binary ends up failing the create_gcov command. This is expected and is not an error condition. For example: >> perf buildid-list -i prev-libbacktrace/perf.data aff9c7b2c5c294612904563fa3da88cb054d313d [kernel.kallsyms] 962097804b5c10ba831958fbb9609cb6d0c1101f /usr/bin/make ... 8227253257ca616415b6d90c8b94de71b314997c /local/home/dhruvc/misc-testing/build-afdo-bootstrap-all/prev-gcc/xgcc 077d6240baadea4c3288e106b17164d164ea7b31 /local/home/dhruvc/misc-testing/build-afdo-bootstrap-all/prev-gcc/cc1 ... There is no instance of cc1plus or lto1 here, so create_gcov cannot be run on this. Autoprofilebootstrapped and regtested on aarch64-linux-gnu. Signed-off-by: Dhruv Chawla <[email protected]> gcc/ChangeLog: * config/aarch64/gcc-auto-profile: Detect and use ARM SPE events when invoking perf record. gcc/c/ChangeLog: * Make-lang.in: Add support for profiler type detection. (create_fdas_for_cc1): Use $(PROFILER) when passing --profiler to create_gcov. Ignore create_gcov failures by changing "|| exit 1" to "|| exit 0". gcc/cp/ChangeLog: * Make-lang.in: Likewise. (create_fdas_for_cc1plus): Likewise. gcc/lto/ChangeLog: * Make-lang.in: Likewise. (create_fdas_for_lto1): Likewise. gcc/testsuite/ChangeLog: * lib/profopt.exp (profopt-execute): Add support for profiler type detection. --- gcc/c/Make-lang.in | 6 ++++-- gcc/config/aarch64/gcc-auto-profile | 5 +++++ gcc/cp/Make-lang.in | 6 ++++-- gcc/lto/Make-lang.in | 6 ++++-- gcc/testsuite/lib/profopt.exp | 8 +++++++- 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/gcc/c/Make-lang.in b/gcc/c/Make-lang.in index fd127caba91..547328bf8f6 100644 --- a/gcc/c/Make-lang.in +++ b/gcc/c/Make-lang.in @@ -95,6 +95,8 @@ components_in_prev_target = "libstdc++-v3 libsanitizer libvtv libgcc libbacktrac cc1.fda: create_fdas_for_cc1 $(PROFILE_MERGER) $(shell ls -ha cc1_*.fda) --output_file cc1.fda -gcov_version 3 +PROFILER=$(shell [ -n "$$(perf list | grep arm_spe)" ] && echo perf_spe || echo perf) + create_fdas_for_cc1: ../stage1-gcc/cc1$(exeext) ../prev-gcc/$(PERF_DATA) for component_in_prev in "$(components_in_prev)"; do \ perf_path=../prev-$$component_in_prev/$(PERF_DATA); \ @@ -102,7 +104,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 -profiler $(PROFILER) -gcov_version 3 || exit 0; \ fi; \ done; @@ -112,7 +114,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 -profiler $(PROFILER) -gcov_version 3 || exit 0; \ fi; \ done; diff --git a/gcc/config/aarch64/gcc-auto-profile b/gcc/config/aarch64/gcc-auto-profile index 4d5c2e34855..430a70b4e17 100755 --- a/gcc/config/aarch64/gcc-auto-profile +++ b/gcc/config/aarch64/gcc-auto-profile @@ -45,6 +45,11 @@ if [ "$use_brbe" = true ] ; then set -x perf record -j any,$FLAGS "$@" set +x +elif [ -n "$(perf list | grep arm_spe)" ] ; then + echo >&2 "Info: Using SPE to collect branch profiles" + set -x + perf record -e arm_spe_0/branch_filter=1/ "$@" + set +x else echo >&2 "Warning: branch profiling may not be functional without BRBE" set -x diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in index 55be730f502..a1541d858a6 100644 --- a/gcc/cp/Make-lang.in +++ b/gcc/cp/Make-lang.in @@ -212,6 +212,8 @@ components_in_prev_target = "libstdc++-v3 libsanitizer libvtv libgcc libbacktrac cc1plus.fda: create_fdas_for_cc1plus $(PROFILE_MERGER) $(shell ls -ha cc1plus_*.fda) --output_file cc1plus.fda -gcov_version 3 +PROFILER=$(shell [ -n "$$(perf list | grep arm_spe)" ] && echo perf_spe || echo perf) + create_fdas_for_cc1plus: ../stage1-gcc/cc1plus$(exeext) ../prev-gcc/$(PERF_DATA) for component_in_prev in "$(components_in_prev)"; do \ perf_path=../prev-$$component_in_prev/$(PERF_DATA); \ @@ -219,7 +221,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 -profiler $(PROFILER) -gcov_version 3 || exit 0; \ fi; \ done; @@ -229,7 +231,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 -profiler $(PROFILER) -gcov_version 3 || exit 0; \ fi; \ done; diff --git a/gcc/lto/Make-lang.in b/gcc/lto/Make-lang.in index eacfe53ca14..8f7df0c104d 100644 --- a/gcc/lto/Make-lang.in +++ b/gcc/lto/Make-lang.in @@ -108,6 +108,8 @@ components_in_prev_target = "libstdc++-v3 libsanitizer libvtv libgcc libbacktrac lto1.fda: create_fdas_for_lto1 $(PROFILE_MERGER) $(shell ls -ha lto1_*.fda) --output_file lto1.fda -gcov_version 3 +PROFILER=$(shell [ -n "$$(perf list | grep arm_spe)" ] && echo perf_spe || echo perf) + create_fdas_for_lto1: ../stage1-gcc/lto1$(exeext) ../prev-gcc/$(PERF_DATA) for component_in_prev in "$(components_in_prev)"; do \ perf_path=../prev-$$component_in_prev/$(PERF_DATA); \ @@ -115,7 +117,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 -profiler $(PROFILER) -gcov_version 3 || exit 0; \ fi; \ done; @@ -125,7 +127,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 -profiler $(PROFILER) -gcov_version 3 || exit 0; \ fi; \ done; diff --git a/gcc/testsuite/lib/profopt.exp b/gcc/testsuite/lib/profopt.exp index c9f5ae53d49..a7e90e9a162 100644 --- a/gcc/testsuite/lib/profopt.exp +++ b/gcc/testsuite/lib/profopt.exp @@ -453,7 +453,13 @@ 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" + # Determine the profiler type + if { [catch {exec sh -c "perf list | grep -q arm_spe"} result] == 0 } { + set profiler "perf_spe" + } else { + set profiler "perf" + } + set cmd "create_gcov --binary $execname1 --profile=$tmpdir/$base.perf.data --profiler=$profiler --gcov_version=3 --gcov=$tmpdir/$bprefix$base.$ext" verbose "Running $cmd" set id [remote_spawn "" $cmd] if { $id < 0 } { -- 2.52.0
