[Maria-developers] Rev 2747: Gcov support improvements in file:///home/psergey/dev/maria-5.1-table-elim-r11-gcov/
At file:///home/psergey/dev/maria-5.1-table-elim-r11-gcov/ ------------------------------------------------------------ revno: 2747 revision-id: psergey@askmonty.org-20090825150255-46i5gvl2ctd0jcm2 parent: psergey@askmonty.org-20090825145915-rxwmfczgqe69r5ju committer: Sergey Petrunya <psergey@askmonty.org> branch nick: maria-5.1-table-elim-r11-gcov timestamp: Tue 2009-08-25 18:02:55 +0300 message: 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. === modified file 'mysql-test/lib/mtr_gcov.pl' --- a/mysql-test/lib/mtr_gcov.pl 2009-04-25 09:04:38 +0000 +++ b/mysql-test/lib/mtr_gcov.pl 2009-08-25 15:02:55 +0000 @@ -20,6 +20,8 @@ use strict; +our $basedir; + sub gcov_prepare ($) { my ($dir)= @_; print "Purging gcov information from '$dir'...\n"; @@ -42,7 +44,7 @@ # Get current directory to return to later. 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_err" and unlink("$start_dir/$gcov_err"); @@ -62,6 +64,7 @@ $dir_reported= 1; } 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); } === added file 'mysql-test/lib/process-purecov-annotations.pl' --- a/mysql-test/lib/process-purecov-annotations.pl 1970-01-01 00:00:00 +0000 +++ b/mysql-test/lib/process-purecov-annotations.pl 2009-08-25 15:02:55 +0000 @@ -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"); +} + + === modified file 'mysql-test/mysql-test-run.pl' --- a/mysql-test/mysql-test-run.pl 2009-06-22 08:06:35 +0000 +++ b/mysql-test/mysql-test-run.pl 2009-08-25 15:02:55 +0000 @@ -169,6 +169,7 @@ our $opt_mem= $ENV{'MTR_MEM'}; our $opt_gcov; +our $opt_gcov_src_dir; our $opt_gcov_exe= "gcov"; our $opt_gcov_err= "mysql-test-gcov.msg"; our $opt_gcov_msg= "mysql-test-gcov.err"; @@ -270,7 +271,7 @@ command_line_setup(); if ( $opt_gcov ) { - gcov_prepare($basedir); + gcov_prepare($basedir . "/" . $opt_gcov_src_dir); } if (!$opt_suites) { @@ -416,7 +417,7 @@ mtr_print_line(); 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); } @@ -882,6 +883,7 @@ # Coverage, profiling etc 'gcov' => \$opt_gcov, + 'gcov-src-dir=s' => \$opt_gcov_src_dir, 'valgrind|valgrind-all' => \$opt_valgrind, 'valgrind-mysqltest' => \$opt_valgrind_mysqltest, 'valgrind-mysqld' => \$opt_valgrind_mysqld, @@ -5397,6 +5399,9 @@ actions. Disable facility with NUM=0. gcov Collect coverage information after the test. 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 exit(1);
Sergey Petrunya <psergey@askmonty.org> writes:
At file:///home/psergey/dev/maria-5.1-table-elim-r11-gcov/
------------------------------------------------------------ revno: 2747 revision-id: psergey@askmonty.org-20090825150255-46i5gvl2ctd0jcm2 parent: psergey@askmonty.org-20090825145915-rxwmfczgqe69r5ju committer: Sergey Petrunya <psergey@askmonty.org> branch nick: maria-5.1-table-elim-r11-gcov timestamp: Tue 2009-08-25 18:02:55 +0300 message: 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.
Nice additions!
=== modified file 'mysql-test/lib/mtr_gcov.pl' --- a/mysql-test/lib/mtr_gcov.pl 2009-04-25 09:04:38 +0000 +++ b/mysql-test/lib/mtr_gcov.pl 2009-08-25 15:02:55 +0000
@@ -62,6 +64,7 @@ $dir_reported= 1; } system("$gcov $f 2>>$start_dir/$gcov_err >>$start_dir/$gcov_msg"); + system("perl $basedir/mysql-test/lib/process-purecov-annotations.pl $f.gcov");
Better do something like this: system("perl", "$basedir/mysql-test/lib/process-purecov-annotations.pl", "$f.gcov"); as it is robust to spaces and other shell metachars in the data.
=== added file 'mysql-test/lib/process-purecov-annotations.pl' --- a/mysql-test/lib/process-purecov-annotations.pl 1970-01-01 00:00:00 +0000 +++ b/mysql-test/lib/process-purecov-annotations.pl 2009-08-25 15:02:55 +0000
+ # 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
Maybe generated default constructor, destructor, or the like that was not run?
+ # + my @arr= split(/:/, $line); + if ($skipping || $line =~ /purecov: *(inspected|deadcode)/ || + $arr[2] =~ m/^{ */)
Note that m/^{ */ matches the same lines as m/^{/. Maybe you intended to use m/^{ *$/ to require the line to be empty except for a starting brace? Or else just use 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");
system("mv", "-f", $out_file_name, $in_file_name); (or cp / rm with multi-argument system()).
=== modified file 'mysql-test/mysql-test-run.pl' --- a/mysql-test/mysql-test-run.pl 2009-06-22 08:06:35 +0000 +++ b/mysql-test/mysql-test-run.pl 2009-08-25 15:02:55 +0000 @@ -169,6 +169,7 @@ our $opt_mem= $ENV{'MTR_MEM'};
our $opt_gcov; +our $opt_gcov_src_dir;
Don't you need to initialise to empty string '' to avoid a warning with undefined value? (Or maybe getopt handles it?). - Kristian.
On Thu, Aug 27, 2009 at 01:36:06PM +0200, Kristian Nielsen wrote:
Sergey Petrunya <psergey@askmonty.org> writes:
At file:///home/psergey/dev/maria-5.1-table-elim-r11-gcov/
------------------------------------------------------------ revno: 2747 revision-id: psergey@askmonty.org-20090825150255-46i5gvl2ctd0jcm2 parent: psergey@askmonty.org-20090825145915-rxwmfczgqe69r5ju committer: Sergey Petrunya <psergey@askmonty.org> branch nick: maria-5.1-table-elim-r11-gcov timestamp: Tue 2009-08-25 18:02:55 +0300 message: 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.
(Addressed all the omitted review feedback)
+ # 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
Maybe generated default constructor, destructor, or the like that was not run?
IIRC it wasn't the constructor (as it was used at some point and the warning was still there). It could be the destructor - objects were never delete'd. I'd prefer the removal to be still there though as it doesn't seem that we're at a point where we'll go and add default constructor, copy constructor, and destructor declaration to every class. For MySQL/Maria codebase, I don't remember a single case where there was an error that would have been prevented by such safeguards. BR Sergey -- Sergey Petrunia, Software Developer Monty Program AB, http://askmonty.org Blog: http://s.petrunia.net/blog
participants (2)
-
Kristian Nielsen
-
Sergey Petrunya