← Back to team overview

maria-developers team mailing list archive

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@xxxxxxxxxxxx-20090825150255-46i5gvl2ctd0jcm2
parent: psergey@xxxxxxxxxxxx-20090825145915-rxwmfczgqe69r5ju
committer: Sergey Petrunya <psergey@xxxxxxxxxxxx>
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);




Follow ups