← Back to team overview

maria-developers team mailing list archive

Re: 00f9df29224: MDEV-20787: Script dgcov.pl does not work

 

Hi, Anel!

On Apr 23, Anel Husakovic wrote:
> revision-id: 00f9df29224 (mariadb-10.2.29-23-g00f9df29224)
> parent(s): 6718d3bc324
> author: Anel Husakovic <anel@xxxxxxxxxxx>
> committer: Anel Husakovic <anel@xxxxxxxxxxx>
> timestamp: 2019-11-19 15:00:48 +0100
> message:
> 
> MDEV-20787: Script dgcov.pl does not work
> 
> Let's change CMakeList with `--coverage` flag as an alias for
> `-fprofile-arcs -ftest-coverage -lgcov` in addition.
> When the server is compiled with `-DENABLE_GCOV=ON`, from object files are generated
> `.gcno` and `.gcda` files.
> `./mtr --gcov is_check_constraint` is invoking the script calls
> `./dgcov.pl --purge`, `./mtr is_check_constraint`,
> `./dgcov.pl --generate>/var/last_changes.dgcov`.
> The `purge` flag is clearing `.gcda` files (and others extensions),
> while running the test new `.gcda` files are obtained.
> With `generate` flag, `gcov -i` (`intermediate format`) is called
> on obtained `<object-files-name>.gcda` files (`dbug.c.gcda` e.g.).
> The patch is tested on `gcov 6.3` and `gcov 7.4` versions
> and can be seen that resulting `.gcov` file for `6.3` creates
> `<full path>.gcov` (`dbug.c.gcda.gcov` e.g.) file,
> where `gcov 7.4` is still creating `object-file-names.gcov`(`dbug.c.gcov`) files
> as `gcov` in general is doing.
> 
> diff --git a/CMakeLists.txt b/CMakeLists.txt
> index 0dcc2a75587..af025a0312f 100644
> --- a/CMakeLists.txt
> +++ b/CMakeLists.txt
> @@ -249,7 +249,7 @@ SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC")
>   
>  OPTION(ENABLE_GCOV "Enable gcov (debug, Linux builds only)" OFF)
>  IF (ENABLE_GCOV)
> -  MY_CHECK_AND_SET_COMPILER_FLAG("-fprofile-arcs -ftest-coverage -lgcov" DEBUG)
> +  MY_CHECK_AND_SET_COMPILER_FLAG("--coverage" DEBUG)

Why?
Since what version does gcc support it?

>  ENDIF()
>  
>  MY_CHECK_AND_SET_COMPILER_FLAG(-ggdb3 DEBUG)
> diff --git a/mysql-test/dgcov.pl b/mysql-test/dgcov.pl
> index fbc5540e697..47ffaca04ef 100755
> --- a/mysql-test/dgcov.pl
> +++ b/mysql-test/dgcov.pl
> @@ -68,8 +68,11 @@ if ($opt_purge)
>    system($cmd)==0 or die "system($cmd): $? $!";
>    exit 0;
>  }
> -
> +my $gcov_vers= `gcov -v`;
> +$gcov_vers=~ s/\D//g;
> +$gcov_vers= substr($gcov_vers, 0, 1);

my gcov is 9.3.0. gcc version 10 is already out.
You get just the first digit, 10 will become 1.

Better to something like

    $gcov_vers ~= s/^.*(\d+\.\d+\.\d+).*$/\1/s;

>  find(\&gcov_one_file, $root);
> +undef $gcov_vers;

why?

>  find(\&write_coverage, $root) if $opt_generate;
>  exit 0 if $opt_only_gcov;
>  
> @@ -162,7 +165,16 @@ sub gcov_one_file {
>    }
>  
>    # now, read the generated file
> -  open FH, '<', "$_.gcov" or die "open(<$_.gcov): $!";
> +  if($gcov_vers<7)
> +  {
> +    open FH, '<', "$_.gcov" or die "open(<$_.gcov): $!";
> +  }
> +  else
> +  {
> +    my $f=substr $_, 0, -5;
> +    open FH, '<', "$f.gcov" or die "open(<$f.gcov): $!";
> +    undef $f;
> +  }

I'd rather write it more compact, in two lines like

     my $f = $gcov_vers < 7 ? $_ : substr $_, 0, -5;
     open FH, '<', "$f.gcov" or die "open(<$f.gcov): $!";

>    my $fname;
>    while (<FH>) {
>      chomp;
> 
Regards,
Sergei
VP of MariaDB Server Engineering
and security@xxxxxxxxxxx