[Maria-developers] Rev 2747: Gcov support improvements in file:///home/psergey/dev/maria-5.1-table-elim-r11-gcov/

2009-08-26 Thread Sergey Petrunya
At file:///home/psergey/dev/maria-5.1-table-elim-r11-gcov/


revno: 2747
revision-id: pser...@askmonty.org-20090825150255-46i5gvl2ctd0jcm2
parent: pser...@askmonty.org-20090825145915-rxwmfczgqe69r5ju
committer: Sergey Petrunya 
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.pl2009-04-25 09:04:38 +
+++ b/mysql-test/lib/mtr_gcov.pl2009-08-25 15:02:55 +
@@ -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 
+
+++ b/mysql-test/lib/process-purecov-annotations.pl 2009-08-25 15:02:55 
+
@@ -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()
+  {
+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 +
+++ b/mysql-test/mysql-test-run.pl  2009-08-25 15:02:55 +
@@ -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=s

Re: [Maria-developers] Rev 2747: Gcov support improvements in file:///home/psergey/dev/maria-5.1-table-elim-r11-gcov/

2009-08-27 Thread Kristian Nielsen
Sergey Petrunya  writes:

> At file:///home/psergey/dev/maria-5.1-table-elim-r11-gcov/
>
> 
> revno: 2747
> revision-id: pser...@askmonty.org-20090825150255-46i5gvl2ctd0jcm2
> parent: pser...@askmonty.org-20090825145915-rxwmfczgqe69r5ju
> committer: Sergey Petrunya 
> 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 +
> +++ b/mysql-test/lib/mtr_gcov.pl  2009-08-25 15:02:55 +

> @@ -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 
> +
> +++ b/mysql-test/lib/process-purecov-annotations.pl   2009-08-25 15:02:55 
> +

> +# 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.pl2009-06-22 08:06:35 +
> +++ b/mysql-test/mysql-test-run.pl2009-08-25 15:02:55 +
> @@ -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.

___
Mailing list: https://launchpad.net/~maria-developers
Post to : maria-developers@lists.launchpad.net
Unsubscribe : https://launchpad.net/~maria-developers
More help   : https://help.launchpad.net/ListHelp


Re: [Maria-developers] Rev 2747: Gcov support improvements in file:///home/psergey/dev/maria-5.1-table-elim-r11-gcov/

2009-09-17 Thread Sergey Petrunya
On Thu, Aug 27, 2009 at 01:36:06PM +0200, Kristian Nielsen wrote:
> Sergey Petrunya  writes:
> 
> > At file:///home/psergey/dev/maria-5.1-table-elim-r11-gcov/
> >
> > 
> > revno: 2747
> > revision-id: pser...@askmonty.org-20090825150255-46i5gvl2ctd0jcm2
> > parent: pser...@askmonty.org-20090825145915-rxwmfczgqe69r5ju
> > committer: Sergey Petrunya 
> > 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

___
Mailing list: https://launchpad.net/~maria-developers
Post to : maria-developers@lists.launchpad.net
Unsubscribe : https://launchpad.net/~maria-developers
More help   : https://help.launchpad.net/ListHelp