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.

Reply via email to