From e0a4872659c905880ed5388018fe0608b42427fd Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Tue, 14 Oct 2025 12:31:03 -0400 Subject: [PATCH] 11.5.0-13 Add branch, conditions, and calls to gcov function summaries Resolves: RHEL-116487 Fix testsuite failures when run with -fstack-protector* (PR testsuite/70230) Resolves: RHEL-116477 --- gcc.spec | 16 +- ...or-for-tests-relying-on-stack-offset.patch | 74 ++++++ gcc11-fix-failures-with-default-SSP.patch | 244 ++++++++++++++++++ gcc11-gcov-function-summaries.patch | 146 +++++++++++ 4 files changed, 479 insertions(+), 1 deletion(-) create mode 100644 gcc11-disable-stack-protector-for-tests-relying-on-stack-offset.patch create mode 100644 gcc11-fix-failures-with-default-SSP.patch create mode 100644 gcc11-gcov-function-summaries.patch diff --git a/gcc.spec b/gcc.spec index c2d1e1d..b5f43bd 100644 --- a/gcc.spec +++ b/gcc.spec @@ -5,7 +5,7 @@ %global gcc_major 11 # Note, gcc_release must be integer, if you want to add suffixes to # %%{release}, append them after %%{gcc_release} on Release: line. -%global gcc_release 12 +%global gcc_release 13 %global nvptx_tools_gitrev 5f6f343a302d620b0868edab376c00b15741e39e %global newlib_cygwin_gitrev 50e2a63b04bdd018484605fbb954fd1bd5147fa0 %global _unpackaged_files_terminate_build 0 @@ -348,6 +348,11 @@ Patch1000: gcc11-libstdc++-prettyprinter-update-15.patch Patch1001: gcc11-libstdc++-prettyprinter-update-15-tests.patch Patch1002: gcc11-libstdc++-prettyprinter-update-15-tests-48362.patch +# Backports +Patch2000: gcc11-gcov-function-summaries.patch +Patch2001: gcc11-fix-failures-with-default-SSP.patch +Patch2002: gcc11-disable-stack-protector-for-tests-relying-on-stack-offset.patch + # On ARM EABI systems, we do want -gnueabi to be part of the # target triple. %ifnarch %{arm} @@ -1067,6 +1072,10 @@ mark them as cross compiled. %patch1001 -p1 -b .libstdc++-prettyprinter-update-15-tests %patch1002 -p1 -b .libstdc++-prettyprinter-update-15-tests-48362 +%patch2000 -p1 -b .gcov-function-summaries +%patch2001 -p1 -b .fix-failures-with-default-SSP +%patch2002 -p1 -b .disable-stack-protector-for-tests-relying-on-stack-offset + %ifarch %{arm} rm -f gcc/testsuite/go.test/test/fixedbugs/issue19182.go %endif @@ -3862,6 +3871,11 @@ end %endif %changelog +* Tue Oct 14 2025 David Malcolm - 11.5.0-13 +- Add branch, conditions, and calls to gcov function summaries (RHEL-116487) +- Fix testsuite failures when run with -fstack-protector* (PR testsuite/70230, + RHEL-116477) + * Wed Sep 10 2025 Joseph Myers - 11.5.0-12 - Add cross compilers for ppc64le and s390x for non-production uses (RHEL-94764) diff --git a/gcc11-disable-stack-protector-for-tests-relying-on-stack-offset.patch b/gcc11-disable-stack-protector-for-tests-relying-on-stack-offset.patch new file mode 100644 index 0000000..97859f0 --- /dev/null +++ b/gcc11-disable-stack-protector-for-tests-relying-on-stack-offset.patch @@ -0,0 +1,74 @@ +From 59a72acbccf4c81a04b4d09760fc8b16992de106 Mon Sep 17 00:00:00 2001 +From: Xi Ruoyao +Date: Sat, 24 Sep 2022 15:16:57 +0800 +Subject: aarch64: testsuite: disable stack protector for tests relying on + stack offset + +Stack protector needs a guard value on the stack and change the stack +layout. So we need to disable it for those tests, to avoid test failure +with --enable-default-ssp. + +gcc/testsuite/ChangeLog: + + * gcc.target/aarch64/shrink_wrap_1.c (dg-options): Add + -fno-stack-protector. + * gcc.target/aarch64/stack-check-cfa-1.c (dg-options): Add + -fno-stack-protector. + * gcc.target/aarch64/stack-check-cfa-2.c (dg-options): Add + -fno-stack-protector. + * gcc.target/aarch64/test_frame_17.c (dg-options): Add + -fno-stack-protector. +--- + gcc/testsuite/gcc.target/aarch64/shrink_wrap_1.c | 2 +- + gcc/testsuite/gcc.target/aarch64/stack-check-cfa-1.c | 2 +- + gcc/testsuite/gcc.target/aarch64/stack-check-cfa-2.c | 2 +- + gcc/testsuite/gcc.target/aarch64/test_frame_17.c | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/gcc/testsuite/gcc.target/aarch64/shrink_wrap_1.c b/gcc/testsuite/gcc.target/aarch64/shrink_wrap_1.c +index ab7cd74ec3b4..067220c04a08 100644 +--- a/gcc/testsuite/gcc.target/aarch64/shrink_wrap_1.c ++++ b/gcc/testsuite/gcc.target/aarch64/shrink_wrap_1.c +@@ -1,5 +1,5 @@ + /* { dg-do compile { target { aarch64*-*-* } } } */ +-/* { dg-options "-O2" } */ ++/* { dg-options "-O2 -fno-stack-protector" } */ + /* { dg-final { check-function-bodies "**" "" } } */ + + /* +diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-cfa-1.c b/gcc/testsuite/gcc.target/aarch64/stack-check-cfa-1.c +index 6885894a97e0..412a9ed1aab0 100644 +--- a/gcc/testsuite/gcc.target/aarch64/stack-check-cfa-1.c ++++ b/gcc/testsuite/gcc.target/aarch64/stack-check-cfa-1.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -funwind-tables" } */ ++/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -funwind-tables -fno-stack-protector" } */ + /* { dg-require-effective-target supports_stack_clash_protection } */ + + #define SIZE 128*1024 +diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-cfa-2.c b/gcc/testsuite/gcc.target/aarch64/stack-check-cfa-2.c +index 5796a53be067..e440569a0785 100644 +--- a/gcc/testsuite/gcc.target/aarch64/stack-check-cfa-2.c ++++ b/gcc/testsuite/gcc.target/aarch64/stack-check-cfa-2.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -funwind-tables" } */ ++/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -funwind-tables -fno-stack-protector" } */ + /* { dg-require-effective-target supports_stack_clash_protection } */ + + #define SIZE 1280*1024 + 512 +diff --git a/gcc/testsuite/gcc.target/aarch64/test_frame_17.c b/gcc/testsuite/gcc.target/aarch64/test_frame_17.c +index 44f132911286..5d432ad0854e 100644 +--- a/gcc/testsuite/gcc.target/aarch64/test_frame_17.c ++++ b/gcc/testsuite/gcc.target/aarch64/test_frame_17.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2" } */ ++/* { dg-options "-O2 -fno-stack-protector" } */ + + /* Test reuse of stack adjustment temporaries. */ + +-- +cgit + diff --git a/gcc11-fix-failures-with-default-SSP.patch b/gcc11-fix-failures-with-default-SSP.patch new file mode 100644 index 0000000..ed984ae --- /dev/null +++ b/gcc11-fix-failures-with-default-SSP.patch @@ -0,0 +1,244 @@ +From 90c31ff339015ddd89ac519656fbd23a36ee6271 Mon Sep 17 00:00:00 2001 +From: Allan McRae +Date: Fri, 28 Jan 2022 12:44:08 -0500 +Subject: testsuite/70230 - fix failures with default SSP\ + +Configuring with --enable-default-ssp triggers various testsuite +failures. These contain asm statements that are not compatible with +-fstack-protector. Adding -fno-stack-protector to dg-options to +work around this issue. + +Tested on x86_64-linux. + + PR testsuite/70230 + * gcc.dg/asan/use-after-scope-4.c (dg-options): Add + -fno-stack-protector. + * gcc.dg/stack-usage-1.c: Likewise + * gcc.dg/superblock.c: Likewise + * gcc.target/i386/avx-vzeroupper-17.c: Likewise + * gcc.target/i386/cleanup-1.c: Likewise + * gcc.target/i386/cleanup-2.c: Likewise + * gcc.target/i386/interrupt-redzone-1.c: Likewise + * gcc.target/i386/interrupt-redzone-2.c: Likewise + * gcc.target/i386/pr79793-1.c: Likewise + * gcc.target/i386/pr79793-2.c: Likewise + * gcc.target/i386/shrink_wrap_1.c: Likewise + * gcc.target/i386/stack-check-11.c: Likewise + * gcc.target/i386/stack-check-18.c: Likewise + * gcc.target/i386/stack-check-19.c: Likewise + * gcc.target/i386/stackalign/pr88483-1.c: Likewise + * gcc.target/i386/stackalign/pr88483-2.c: Likewise + * gcc.target/i386/sw-1.c: Likewise + +Backported to gcc 11 by dmalcolm@redhat.com + This was r12-6922-g90c31ff339015d, modifying the change to sw-1.c + to avoid the change from r12-2671-gdadbb1a886af95. + +--- + gcc/testsuite/gcc.dg/asan/use-after-scope-4.c | 1 + + gcc/testsuite/gcc.dg/stack-usage-1.c | 2 +- + gcc/testsuite/gcc.dg/superblock.c | 2 +- + gcc/testsuite/gcc.target/i386/avx-vzeroupper-17.c | 2 +- + gcc/testsuite/gcc.target/i386/cleanup-1.c | 2 +- + gcc/testsuite/gcc.target/i386/cleanup-2.c | 2 +- + gcc/testsuite/gcc.target/i386/interrupt-redzone-1.c | 2 +- + gcc/testsuite/gcc.target/i386/interrupt-redzone-2.c | 2 +- + gcc/testsuite/gcc.target/i386/pr79793-1.c | 2 +- + gcc/testsuite/gcc.target/i386/pr79793-2.c | 2 +- + gcc/testsuite/gcc.target/i386/shrink_wrap_1.c | 2 +- + gcc/testsuite/gcc.target/i386/stack-check-11.c | 2 +- + gcc/testsuite/gcc.target/i386/stack-check-18.c | 2 +- + gcc/testsuite/gcc.target/i386/stack-check-19.c | 2 +- + gcc/testsuite/gcc.target/i386/stackalign/pr88483-1.c | 2 +- + gcc/testsuite/gcc.target/i386/stackalign/pr88483-2.c | 2 +- + gcc/testsuite/gcc.target/i386/sw-1.c | 2 +- + 17 files changed, 17 insertions(+), 16 deletions(-) + +diff --git a/gcc/testsuite/gcc.dg/asan/use-after-scope-4.c b/gcc/testsuite/gcc.dg/asan/use-after-scope-4.c +index 44dc79535d2a..e1486e75045f 100644 +--- a/gcc/testsuite/gcc.dg/asan/use-after-scope-4.c ++++ b/gcc/testsuite/gcc.dg/asan/use-after-scope-4.c +@@ -1,4 +1,5 @@ + // { dg-do run } ++/* { dg-options "-fno-stack-protector" } */ + + #define FN(NAME) \ + NAME (void) \ +diff --git a/gcc/testsuite/gcc.dg/stack-usage-1.c b/gcc/testsuite/gcc.dg/stack-usage-1.c +index 93cfe7c01639..1d7d1fee4351 100644 +--- a/gcc/testsuite/gcc.dg/stack-usage-1.c ++++ b/gcc/testsuite/gcc.dg/stack-usage-1.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-fstack-usage" } */ ++/* { dg-options "-fstack-usage -fno-stack-protector" } */ + /* nvptx doesn't have a reg allocator, and hence no stack usage data. */ + /* { dg-skip-if "" { nvptx-*-* } } */ + +diff --git a/gcc/testsuite/gcc.dg/superblock.c b/gcc/testsuite/gcc.dg/superblock.c +index 2b2fa9e154fb..6b4419adaf59 100644 +--- a/gcc/testsuite/gcc.dg/superblock.c ++++ b/gcc/testsuite/gcc.dg/superblock.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -fno-asynchronous-unwind-tables -fsched2-use-superblocks -fdump-rtl-sched2 -fdump-rtl-bbro" } */ ++/* { dg-options "-O2 -fno-asynchronous-unwind-tables -fsched2-use-superblocks -fdump-rtl-sched2 -fdump-rtl-bbro -fno-stack-protector" } */ + /* { dg-require-effective-target scheduling } */ + + typedef int aligned __attribute__ ((aligned (64))); +diff --git a/gcc/testsuite/gcc.target/i386/avx-vzeroupper-17.c b/gcc/testsuite/gcc.target/i386/avx-vzeroupper-17.c +index 6dc0dc053214..d677e6f10e01 100644 +--- a/gcc/testsuite/gcc.target/i386/avx-vzeroupper-17.c ++++ b/gcc/testsuite/gcc.target/i386/avx-vzeroupper-17.c +@@ -1,5 +1,5 @@ + /* { dg-do compile { target lp64 } } */ +-/* { dg-options "-O2 -mavx -mabi=ms -dp" } */ ++/* { dg-options "-O2 -mavx -mabi=ms -dp -fno-stack-protector" } */ + + typedef float __m256 __attribute__ ((__vector_size__ (32), __may_alias__)); + +diff --git a/gcc/testsuite/gcc.target/i386/cleanup-1.c b/gcc/testsuite/gcc.target/i386/cleanup-1.c +index dcfcc4edb5fa..6e7544c6b7ac 100644 +--- a/gcc/testsuite/gcc.target/i386/cleanup-1.c ++++ b/gcc/testsuite/gcc.target/i386/cleanup-1.c +@@ -1,5 +1,5 @@ + /* { dg-do run { target *-*-linux* *-*-gnu* } } */ +-/* { dg-options "-fexceptions -fnon-call-exceptions -fasynchronous-unwind-tables -O2" } */ ++/* { dg-options "-fexceptions -fnon-call-exceptions -fasynchronous-unwind-tables -O2 -fno-stack-protector" } */ + /* Test complex CFA value expressions. */ + + #include +diff --git a/gcc/testsuite/gcc.target/i386/cleanup-2.c b/gcc/testsuite/gcc.target/i386/cleanup-2.c +index 7e60323373b8..a24daba73da2 100644 +--- a/gcc/testsuite/gcc.target/i386/cleanup-2.c ++++ b/gcc/testsuite/gcc.target/i386/cleanup-2.c +@@ -1,5 +1,5 @@ + /* { dg-do run { target { *-*-linux* && { ! ia32 } } } } */ +-/* { dg-options "-fexceptions -fnon-call-exceptions -fasynchronous-unwind-tables -O2" } */ ++/* { dg-options "-fexceptions -fnon-call-exceptions -fasynchronous-unwind-tables -O2 -fno-stack-protector" } */ + /* Test complex CFA value expressions. */ + + #include +diff --git a/gcc/testsuite/gcc.target/i386/interrupt-redzone-1.c b/gcc/testsuite/gcc.target/i386/interrupt-redzone-1.c +index 10098848c506..0c412db427e3 100644 +--- a/gcc/testsuite/gcc.target/i386/interrupt-redzone-1.c ++++ b/gcc/testsuite/gcc.target/i386/interrupt-redzone-1.c +@@ -1,5 +1,5 @@ + /* { dg-do compile { target { ! ia32 } } } */ +-/* { dg-options "-O2 -mgeneral-regs-only -mno-cld -mred-zone" } */ ++/* { dg-options "-O2 -mgeneral-regs-only -mno-cld -mred-zone -fno-stack-protector" } */ + + void + __attribute__((interrupt)) +diff --git a/gcc/testsuite/gcc.target/i386/interrupt-redzone-2.c b/gcc/testsuite/gcc.target/i386/interrupt-redzone-2.c +index 2577f43c9168..caea99665f23 100644 +--- a/gcc/testsuite/gcc.target/i386/interrupt-redzone-2.c ++++ b/gcc/testsuite/gcc.target/i386/interrupt-redzone-2.c +@@ -1,5 +1,5 @@ + /* { dg-do compile { target { ! ia32 } } } */ +-/* { dg-options "-O2 -mgeneral-regs-only -mno-cld -mred-zone" } */ ++/* { dg-options "-O2 -mgeneral-regs-only -mno-cld -mred-zone -fno-stack-protector" } */ + + void + __attribute__((interrupt)) +diff --git a/gcc/testsuite/gcc.target/i386/pr79793-1.c b/gcc/testsuite/gcc.target/i386/pr79793-1.c +index 1cc67a83ba39..102d63afe8d9 100644 +--- a/gcc/testsuite/gcc.target/i386/pr79793-1.c ++++ b/gcc/testsuite/gcc.target/i386/pr79793-1.c +@@ -1,5 +1,5 @@ + /* { dg-do compile { target { *-*-linux* && { ! ia32 } } } } */ +-/* { dg-options "-O2 -mgeneral-regs-only -mtune=generic" } */ ++/* { dg-options "-O2 -mgeneral-regs-only -mtune=generic -fno-stack-protector" } */ + + void + __attribute__ ((interrupt)) +diff --git a/gcc/testsuite/gcc.target/i386/pr79793-2.c b/gcc/testsuite/gcc.target/i386/pr79793-2.c +index e1e6463e120a..30f22bea9884 100644 +--- a/gcc/testsuite/gcc.target/i386/pr79793-2.c ++++ b/gcc/testsuite/gcc.target/i386/pr79793-2.c +@@ -1,5 +1,5 @@ + /* { dg-do compile { target { *-*-linux* && { ! ia32 } } } } */ +-/* { dg-options "-O2 -mgeneral-regs-only -mtune=generic" } */ ++/* { dg-options "-O2 -mgeneral-regs-only -mtune=generic -fno-stack-protector" } */ + + typedef unsigned int uword_t __attribute__ ((mode (__word__))); + +diff --git a/gcc/testsuite/gcc.target/i386/shrink_wrap_1.c b/gcc/testsuite/gcc.target/i386/shrink_wrap_1.c +index 94dadd6cdbd8..4b286671e90b 100644 +--- a/gcc/testsuite/gcc.target/i386/shrink_wrap_1.c ++++ b/gcc/testsuite/gcc.target/i386/shrink_wrap_1.c +@@ -1,5 +1,5 @@ + /* { dg-do compile { target { ! ia32 } } } */ +-/* { dg-options "-O2 -fdump-rtl-pro_and_epilogue" } */ ++/* { dg-options "-O2 -fdump-rtl-pro_and_epilogue -fno-stack-protector" } */ + + enum machine_mode + { +diff --git a/gcc/testsuite/gcc.target/i386/stack-check-11.c b/gcc/testsuite/gcc.target/i386/stack-check-11.c +index 90ab6023b422..48341cedcd4b 100644 +--- a/gcc/testsuite/gcc.target/i386/stack-check-11.c ++++ b/gcc/testsuite/gcc.target/i386/stack-check-11.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -fstack-clash-protection -mtune=generic" } */ ++/* { dg-options "-O2 -fstack-clash-protection -mtune=generic -fno-stack-protector" } */ + /* { dg-require-effective-target supports_stack_clash_protection } */ + + #include +diff --git a/gcc/testsuite/gcc.target/i386/stack-check-18.c b/gcc/testsuite/gcc.target/i386/stack-check-18.c +index 1cf4bbcfafb5..a0aab4a98238 100644 +--- a/gcc/testsuite/gcc.target/i386/stack-check-18.c ++++ b/gcc/testsuite/gcc.target/i386/stack-check-18.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -fstack-clash-protection -mtune=generic -fdump-rtl-expand" } */ ++/* { dg-options "-O2 -fstack-clash-protection -mtune=generic -fdump-rtl-expand -fno-stack-protector" } */ + /* { dg-require-effective-target supports_stack_clash_protection } */ + /* { dg-skip-if "" { *-*-* } { "-fstack-protector*" } { "" } } */ + +diff --git a/gcc/testsuite/gcc.target/i386/stack-check-19.c b/gcc/testsuite/gcc.target/i386/stack-check-19.c +index bf6af5ffc3e9..94c75dcb47ce 100644 +--- a/gcc/testsuite/gcc.target/i386/stack-check-19.c ++++ b/gcc/testsuite/gcc.target/i386/stack-check-19.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -fstack-clash-protection -mtune=generic -fdump-rtl-expand" } */ ++/* { dg-options "-O2 -fstack-clash-protection -mtune=generic -fdump-rtl-expand -fno-stack-protector" } */ + /* { dg-require-effective-target supports_stack_clash_protection } */ + /* { dg-skip-if "" { *-*-* } { "-fstack-protector*" } { "" } } */ + +diff --git a/gcc/testsuite/gcc.target/i386/stackalign/pr88483-1.c b/gcc/testsuite/gcc.target/i386/stackalign/pr88483-1.c +index c8bb0832fe26..11ecdd52aa15 100644 +--- a/gcc/testsuite/gcc.target/i386/stackalign/pr88483-1.c ++++ b/gcc/testsuite/gcc.target/i386/stackalign/pr88483-1.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mavx2" } */ ++/* { dg-options "-O2 -mavx2 -fno-stack-protector" } */ + + struct B + { +diff --git a/gcc/testsuite/gcc.target/i386/stackalign/pr88483-2.c b/gcc/testsuite/gcc.target/i386/stackalign/pr88483-2.c +index e94fa1d18fad..33174fa29dec 100644 +--- a/gcc/testsuite/gcc.target/i386/stackalign/pr88483-2.c ++++ b/gcc/testsuite/gcc.target/i386/stackalign/pr88483-2.c +@@ -1,5 +1,5 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mavx512f" } */ ++/* { dg-options "-O2 -mavx512f -fno-stack-protector" } */ + + struct B + { +diff --git a/gcc/testsuite/gcc.target/i386/sw-1.c b/gcc/testsuite/gcc.target/i386/sw-1.c +index a9c89fca4ec4..b0432279644a 100644 +--- a/gcc/testsuite/gcc.target/i386/sw-1.c ++++ b/gcc/testsuite/gcc.target/i386/sw-1.c +@@ -1,4 +1,4 @@ + /* { dg-do compile } */ +-/* { dg-options "-O2 -mtune=generic -fshrink-wrap -fdump-rtl-pro_and_epilogue" } */ ++/* { dg-options "-O2 -mtune=generic -fshrink-wrap -fdump-rtl-pro_and_epilogue -fno-stack-protector" } */ + /* { dg-skip-if "No shrink-wrapping preformed" { x86_64-*-mingw* } } */ + +-- +cgit + diff --git a/gcc11-gcov-function-summaries.patch b/gcc11-gcov-function-summaries.patch new file mode 100644 index 0000000..641baac --- /dev/null +++ b/gcc11-gcov-function-summaries.patch @@ -0,0 +1,146 @@ +From 580664d1b66a5d98e5e87d9ff728566b309e89b1 Mon Sep 17 00:00:00 2001 +From: Jørgen Kvalsvik +Date: Wed, 7 Aug 2024 17:33:31 +0200 +Subject: gcov: branch, conds, calls in function summaries + +The gcov function summaries only output the covered lines, not the +branches and calls. Since the function summaries is an opt-in it +probably makes sense to also include branch coverage, calls, and +condition coverage. + +$ gcc --coverage -fpath-coverage hello.c -o hello +$ ./hello + +Before: + $ gcov -f hello + Function 'main' + Lines executed:100.00% of 4 + + Function 'fn' + Lines executed:100.00% of 7 + + File 'hello.c' + Lines executed:100.00% of 11 + Creating 'hello.c.gcov' + +After: + $ gcov -f hello + Function 'main' + Lines executed:100.00% of 3 + No branches + Calls executed:100.00% of 1 + + Function 'fn' + Lines executed:100.00% of 7 + Branches executed:100.00% of 4 + Taken at least once:50.00% of 4 + No calls + + File 'hello.c' + Lines executed:100.00% of 10 + Creating 'hello.c.gcov' + + Lines executed:100.00% of 10 + +With conditions: + $ gcov -fg hello + Function 'main' + Lines executed:100.00% of 3 + No branches + Calls executed:100.00% of 1 + No conditions + + Function 'fn' + Lines executed:100.00% of 7 + Branches executed:100.00% of 4 + Taken at least once:50.00% of 4 + Condition outcomes covered:100.00% of 8 + No calls + + File 'hello.c' + Lines executed:100.00% of 10 + Creating 'hello.c.gcov' + + Lines executed:100.00% of 10 + +gcc/ChangeLog: + + * gcov.cc (generate_results): Count branches, conditions. + (function_summary): Output branch, calls, condition count. + +Backported to gcc 11 by dmalcolm@redhat.com: +* undo renaming of gcov.c to gcov.cc + +--- + gcc/gcov.c | 48 +++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 43 insertions(+), 5 deletions(-) + +diff --git a/gcc/gcov.c b/gcc/gcov.c +index 96fdc50f0e8f..f9ab93b54d99 100644 +--- a/gcc/gcov.c ++++ b/gcc/gcov.c +@@ -1687,11 +1687,19 @@ generate_results (const char *file_name) + memset (&coverage, 0, sizeof (coverage)); + coverage.name = fn->get_name (); + add_line_counts (flag_function_summary ? &coverage : NULL, fn); +- if (flag_function_summary) +- { +- function_summary (&coverage); +- fnotice (stdout, "\n"); +- } ++ ++ if (!flag_function_summary) ++ continue; ++ ++ for (const block_info& block : fn->blocks) ++ for (arc_info *arc = block.succ; arc; arc = arc->succ_next) ++ add_branch_counts (&coverage, arc); ++ ++ for (const block_info& block : fn->blocks) ++ add_condition_counts (&coverage, &block); ++ ++ function_summary (&coverage); ++ fnotice (stdout, "\n"); + } + + name_map needle; +@@ -2764,6 +2772,36 @@ function_summary (const coverage_info *coverage) + { + fnotice (stdout, "%s '%s'\n", "Function", coverage->name); + executed_summary (coverage->lines, coverage->lines_executed); ++ ++ if (coverage->branches) ++ { ++ fnotice (stdout, "Branches executed:%s of %d\n", ++ format_gcov (coverage->branches_executed, coverage->branches, 2), ++ coverage->branches); ++ fnotice (stdout, "Taken at least once:%s of %d\n", ++ format_gcov (coverage->branches_taken, coverage->branches, 2), ++ coverage->branches); ++ } ++ else ++ fnotice (stdout, "No branches\n"); ++ ++ if (coverage->calls) ++ fnotice (stdout, "Calls executed:%s of %d\n", ++ format_gcov (coverage->calls_executed, coverage->calls, 2), ++ coverage->calls); ++ else ++ fnotice (stdout, "No calls\n"); ++ ++ if (flag_conditions) ++ { ++ if (coverage->conditions) ++ fnotice (stdout, "Condition outcomes covered:%s of %d\n", ++ format_gcov (coverage->conditions_covered, ++ coverage->conditions, 2), ++ coverage->conditions); ++ else ++ fnotice (stdout, "No conditions\n"); ++ } + } + + /* Output summary info for a file. */ +-- +cgit +