mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Gcov support improvements
- add process-gcov-annotations.pl script that processes .gcov files according to purecov annotations in source code - add --gcov-src-dir=subdir option to mysql-test-run so that one can do gcov processing only for source files in a certain directory.
This commit is contained in:
@ -20,6 +20,8 @@
|
|||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
|
our $basedir;
|
||||||
|
|
||||||
sub gcov_prepare ($) {
|
sub gcov_prepare ($) {
|
||||||
my ($dir)= @_;
|
my ($dir)= @_;
|
||||||
print "Purging gcov information from '$dir'...\n";
|
print "Purging gcov information from '$dir'...\n";
|
||||||
@ -42,7 +44,7 @@ sub gcov_collect ($$$) {
|
|||||||
# Get current directory to return to later.
|
# Get current directory to return to later.
|
||||||
my $start_dir= cwd();
|
my $start_dir= cwd();
|
||||||
|
|
||||||
print "Collecting source coverage info using '$gcov'...\n";
|
print "Collecting source coverage info using '$gcov'...$basedir\n";
|
||||||
-f "$start_dir/$gcov_msg" and unlink("$start_dir/$gcov_msg");
|
-f "$start_dir/$gcov_msg" and unlink("$start_dir/$gcov_msg");
|
||||||
-f "$start_dir/$gcov_err" and unlink("$start_dir/$gcov_err");
|
-f "$start_dir/$gcov_err" and unlink("$start_dir/$gcov_err");
|
||||||
|
|
||||||
@ -62,6 +64,7 @@ sub gcov_collect ($$$) {
|
|||||||
$dir_reported= 1;
|
$dir_reported= 1;
|
||||||
}
|
}
|
||||||
system("$gcov $f 2>>$start_dir/$gcov_err >>$start_dir/$gcov_msg");
|
system("$gcov $f 2>>$start_dir/$gcov_err >>$start_dir/$gcov_msg");
|
||||||
|
system("perl $basedir/mysql-test/lib/process-purecov-annotations.pl $f.gcov");
|
||||||
}
|
}
|
||||||
chdir($start_dir);
|
chdir($start_dir);
|
||||||
}
|
}
|
||||||
|
64
mysql-test/lib/process-purecov-annotations.pl
Executable file
64
mysql-test/lib/process-purecov-annotations.pl
Executable file
@ -0,0 +1,64 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
# -*- cperl -*-
|
||||||
|
|
||||||
|
# This script processes a .gcov coverage report to honor purecov
|
||||||
|
# annotations: lines marked as inspected or as deadcode are changed
|
||||||
|
# from looking like lines with code that was never executed to look
|
||||||
|
# like lines that have no executable code.
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
foreach my $in_file_name ( @ARGV )
|
||||||
|
{
|
||||||
|
my $out_file_name=$in_file_name . ".tmp";
|
||||||
|
my $skipping=0;
|
||||||
|
|
||||||
|
open(IN, "<", $in_file_name) || next;
|
||||||
|
open(OUT, ">", $out_file_name);
|
||||||
|
while(<IN>)
|
||||||
|
{
|
||||||
|
my $line= $_;
|
||||||
|
my $check= $line;
|
||||||
|
|
||||||
|
# process purecov: start/end multi-blocks
|
||||||
|
my $started=0;
|
||||||
|
my $ended= 0;
|
||||||
|
while (($started=($check =~ s/purecov: *begin *(deadcode|inspected)//)) ||
|
||||||
|
($ended=($check =~ s/purecov: *end//)))
|
||||||
|
{
|
||||||
|
$skipping= $skipping + $started - $ended;
|
||||||
|
}
|
||||||
|
if ($skipping < 0)
|
||||||
|
{
|
||||||
|
print OUT "WARNING: #####: incorrect order of purecov begin/end annotations\n";
|
||||||
|
$skipping= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Besides purecov annotations, also remove uncovered code mark from cases
|
||||||
|
# like the following:
|
||||||
|
#
|
||||||
|
# -: 211:*/
|
||||||
|
# -: 212:class Field_value : public Value_dep
|
||||||
|
# #####: 213:{
|
||||||
|
# -: 214:public:
|
||||||
|
#
|
||||||
|
# I have no idea why would gcov think there is uncovered code there
|
||||||
|
#
|
||||||
|
my @arr= split(/:/, $line);
|
||||||
|
if ($skipping || $line =~ /purecov: *(inspected|deadcode)/ ||
|
||||||
|
$arr[2] =~ m/^{ */)
|
||||||
|
{
|
||||||
|
# Change '####' to '-'.
|
||||||
|
$arr[0] =~ s/#####/ -/g;
|
||||||
|
$line= join(":", @arr);
|
||||||
|
}
|
||||||
|
print OUT $line;
|
||||||
|
}
|
||||||
|
close(IN);
|
||||||
|
close(OUT);
|
||||||
|
system("cat $out_file_name > $in_file_name");
|
||||||
|
system("rm $out_file_name");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -169,6 +169,7 @@ our $opt_force;
|
|||||||
our $opt_mem= $ENV{'MTR_MEM'};
|
our $opt_mem= $ENV{'MTR_MEM'};
|
||||||
|
|
||||||
our $opt_gcov;
|
our $opt_gcov;
|
||||||
|
our $opt_gcov_src_dir;
|
||||||
our $opt_gcov_exe= "gcov";
|
our $opt_gcov_exe= "gcov";
|
||||||
our $opt_gcov_err= "mysql-test-gcov.msg";
|
our $opt_gcov_err= "mysql-test-gcov.msg";
|
||||||
our $opt_gcov_msg= "mysql-test-gcov.err";
|
our $opt_gcov_msg= "mysql-test-gcov.err";
|
||||||
@ -270,7 +271,7 @@ sub main {
|
|||||||
command_line_setup();
|
command_line_setup();
|
||||||
|
|
||||||
if ( $opt_gcov ) {
|
if ( $opt_gcov ) {
|
||||||
gcov_prepare($basedir);
|
gcov_prepare($basedir . "/" . $opt_gcov_src_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$opt_suites) {
|
if (!$opt_suites) {
|
||||||
@ -416,7 +417,7 @@ sub main {
|
|||||||
mtr_print_line();
|
mtr_print_line();
|
||||||
|
|
||||||
if ( $opt_gcov ) {
|
if ( $opt_gcov ) {
|
||||||
gcov_collect($basedir, $opt_gcov_exe,
|
gcov_collect($basedir . "/" . $opt_gcov_src_dir, $opt_gcov_exe,
|
||||||
$opt_gcov_msg, $opt_gcov_err);
|
$opt_gcov_msg, $opt_gcov_err);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -882,6 +883,7 @@ sub command_line_setup {
|
|||||||
|
|
||||||
# Coverage, profiling etc
|
# Coverage, profiling etc
|
||||||
'gcov' => \$opt_gcov,
|
'gcov' => \$opt_gcov,
|
||||||
|
'gcov-src-dir=s' => \$opt_gcov_src_dir,
|
||||||
'valgrind|valgrind-all' => \$opt_valgrind,
|
'valgrind|valgrind-all' => \$opt_valgrind,
|
||||||
'valgrind-mysqltest' => \$opt_valgrind_mysqltest,
|
'valgrind-mysqltest' => \$opt_valgrind_mysqltest,
|
||||||
'valgrind-mysqld' => \$opt_valgrind_mysqld,
|
'valgrind-mysqld' => \$opt_valgrind_mysqld,
|
||||||
@ -5397,6 +5399,9 @@ Misc options
|
|||||||
actions. Disable facility with NUM=0.
|
actions. Disable facility with NUM=0.
|
||||||
gcov Collect coverage information after the test.
|
gcov Collect coverage information after the test.
|
||||||
The result is a gcov file per source and header file.
|
The result is a gcov file per source and header file.
|
||||||
|
gcov-src-dir=subdir Colllect coverage only within the given subdirectory.
|
||||||
|
For example, if you're only developing the SQL layer,
|
||||||
|
it makes sense to use --gcov-src-dir=sql
|
||||||
|
|
||||||
HERE
|
HERE
|
||||||
exit(1);
|
exit(1);
|
||||||
|
Reference in New Issue
Block a user