https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114715
Bug ID: 114715 Summary: Gcov allocates branches to wrong row for nested switches Product: gcc Version: 11.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: gcov-profile Assignee: unassigned at gcc dot gnu.org Reporter: a_aili at hotmail dot com Target Milestone: --- While using the following GCC version gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa OFFLOAD_TARGET_DEFAULT=1 Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 11.4.0-1ubuntu1~22.04' --with-bugurl=file:///usr/share/doc/gcc-11/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-11 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-11-XeT9lY/gcc-11-11.4.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-11-XeT9lY/gcc-11-11.4.0/debian/tmp-gcn/usr --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2 Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04) gcov allocates branches to the wrong row when using nested switches. Given the following test program: #include <stdio.h> int main() { int a = 1; int b = 2; int c = -3; switch(a) { case 1: c = 3; switch(b) { case 1: c = 4; break; case 2: c = 5; break; } break; case 2: c = 6; break; default: break; } printf("%i, %i, %i\n", a, b, c); } compiled with 'gcc test.c -o0 --coverage -o test'. Gcov invoked with 'gcov --branch-count --branch-probabilities test.c' gives -: 0:Source:test.c -: 0:Graph:test.gcno -: 0:Data:test.gcda -: 0:Runs:1 -: 1:#include <stdio.h> -: 2: function main called 1 returned 100% blocks executed 70% 1: 3:int main() -: 4:{ 1: 5: int a = 1; 1: 6: int b = 2; 1: 7: int c = -3; 1: 8: switch(a) branch 0 taken 1 branch 1 taken 0 branch 2 taken 0 -: 9: { 1: 10: case 1: 1: 11: c = 3; branch 0 taken 0 branch 1 taken 1 branch 2 taken 0 -: 12: switch(b) { #####: 13: case 1: #####: 14: c = 4; #####: 15: break; 1: 16: case 2: 1: 17: c = 5; 1: 18: break; -: 19: } 1: 20: break; #####: 21: case 2: #####: 22: c = 6; #####: 23: break; #####: 24: default: #####: 25: break; -: 26: } -: 27: 1: 28: printf("%i, %i, %i\n", a, b, c); call 0 returned 1 -: 29:} As you can see the branches for the nested switch is allocated to row 11 and row 12 is marked as not executed. If gcov should have been consistent on how it allocates coverage the branches on row 11 should have been allocated correctly to the switch as on row 8. The second switch on row 12 should also be marked as executed.