Blame maint/gcovmerge

Packit 0848f5
#! /usr/bin/env perl
Packit 0848f5
# -*- Mode: perl; -*-
Packit 0848f5
#
Packit 0848f5
# This script merges output from two files that should be applied to the
Packit 0848f5
# same source file.  This is needed for MPICH on systems that support
Packit 0848f5
# gcov but do not support weak symbols.  This script is invoked by 
Packit 0848f5
# the coverage target in the Makefiles generated by automake.
Packit 0848f5
#
Packit 0848f5
$debug = 0;
Packit 0848f5
if ($#ARGV != 1) {
Packit 0848f5
    print STDERR "gcovmerge.pl file1 file2
Packit 0848f5
      Merge the gcov output of file1 and file 2 and write the result to stdout
Packit 0848f5
";
Packit 0848f5
    exit(1);
Packit 0848f5
}
Packit 0848f5
$f1 = $ARGV[0];
Packit 0848f5
$f2 = $ARGV[1];
Packit 0848f5
open (I1, "<$f1" ) || die "Cannot open $f1";
Packit 0848f5
open (I2, "<$f2" ) || die "Cannot open $f2";
Packit 0848f5
while (!eof(I1) && !eof(I2)) {
Packit 0848f5
    $s1 = <I1>;
Packit 0848f5
    $s2 = <I2>;
Packit 0848f5
    # The following apply to the preceeding line, and in the case of
Packit 0848f5
    # a macro, there may be multiple lines.  In the merge case, 
Packit 0848f5
    # we don't have a good way to interpret these, so we skip them
Packit 0848f5
    # ^\s*branch\s+\d+\s+never executed
Packit 0848f5
    # ^\s*call\s+\d+\s+never executed
Packit 0848f5
    do {
Packit 0848f5
	$foundSkip = 0;
Packit 0848f5
	if ($s1 =~ /^\s*branch\s+\d+\s+never executed/ ||
Packit 0848f5
	    $s1 =~ /^\s*call\s+\d+\s+never executed/) {
Packit 0848f5
	    $s1 = <I1>;
Packit 0848f5
	    $foundSkip = 1;
Packit 0848f5
	}
Packit 0848f5
	if ($s2 =~ /^\s*branch\s+\d+\s+never executed/ ||
Packit 0848f5
	    $s2 =~ /^\s*call\s+\d+\s+never executed/) {
Packit 0848f5
	    $s2 = <I2>;
Packit 0848f5
	    $foundSkip = 1;
Packit 0848f5
	}
Packit 0848f5
	# Other cases:  If text, then compare and output 
Packit 0848f5
	if ($s1 =~ /^\s*[A-za-z]+/) {
Packit 0848f5
	    $foundSkip = 1;
Packit 0848f5
	    if ($s1 eq $s2) {
Packit 0848f5
		print $s1;
Packit 0848f5
		$s1 = <I1>;
Packit 0848f5
		$s2 = <I2>;
Packit 0848f5
	    }
Packit 0848f5
	    else {
Packit 0848f5
		$s1 = <I1>;
Packit 0848f5
	    }
Packit 0848f5
	}
Packit 0848f5
	if ($s2 =~ /^\s*[A-za-z]+/) {
Packit 0848f5
	    $foundSkip = 1;
Packit 0848f5
	    $s2 = <I2>;
Packit 0848f5
	}
Packit 0848f5
    } while ($foundSkip);
Packit 0848f5
Packit 0848f5
Packit 0848f5
    print "Comparing >$s1< and >$s2<\n" if $debug;
Packit 0848f5
    $out = "";
Packit 0848f5
    if ($s1 ne $s2) {
Packit 0848f5
	# See if these are in expected format:
Packit 0848f5
	# ^\s*#####:\s*\d+:.* or
Packit 0848f5
	# ^\s*\d+:\s*d+:.* or
Packit 0848f5
	# ^\s*-:\s*d+:.*
Packit 0848f5
	if ($s1 =~ /^\s*#+:\s*(\d+):(.*)/) {
Packit 0848f5
	    $s1count    = -1;
Packit 0848f5
	    $s1linenum  = $1;
Packit 0848f5
	    $s1line     = $2;
Packit 0848f5
	}
Packit 0848f5
	elsif ($s1 =~ /^\s*(\d+):\s*(\d+):(.*)/) {
Packit 0848f5
	    $s1count    = $1;
Packit 0848f5
	    $s1linenum  = $2;
Packit 0848f5
	    $s1line     = $3;
Packit 0848f5
	}
Packit 0848f5
	elsif ($s1 =~ /^\s*-:\s*(\d+):(.*)/) {
Packit 0848f5
	    $s1count    = -1;
Packit 0848f5
	    $s1linenum  = $1;
Packit 0848f5
	    $s1line     = $2;
Packit 0848f5
	}
Packit 0848f5
	else {
Packit 0848f5
	    print "Unrecognized format for s1\n";
Packit 0848f5
	}
Packit 0848f5
	if ($s2 =~ /^\s*#+:\s*(\d+):(.*)/) {
Packit 0848f5
	    $s2count    = -1;
Packit 0848f5
	    $s2linenum  = $1;
Packit 0848f5
	    $s2line     = $2;
Packit 0848f5
	}
Packit 0848f5
	elsif ($s2 =~ /^\s*(\d+):\s*(\d+):(.*)/) {
Packit 0848f5
	    $s2count    = $1;
Packit 0848f5
	    $s2linenum  = $2;
Packit 0848f5
	    $s2line     = $3;
Packit 0848f5
	}
Packit 0848f5
	elsif ($s2 =~ /^\s*-:\s*(\d+):(.*)/) {
Packit 0848f5
	    $s2count    = -1;
Packit 0848f5
	    $s2linenum  = $1;
Packit 0848f5
	    $s2line     = $2;
Packit 0848f5
	}
Packit 0848f5
	else {
Packit 0848f5
	    print "Unrecognized format for s2\n";
Packit 0848f5
	}
Packit 0848f5
	if ($s1line eq $s2line && $s1linenum == $s2linenum) {
Packit 0848f5
	    $nlines = 0;
Packit 0848f5
	    if ($s1count > 0) { $nlines += $s1count; }
Packit 0848f5
	    if ($s2count > 0) { $nlines += $s2count; }
Packit 0848f5
	    # Format line: number of characters in leader (9:5:.*)
Packit 0848f5
	    if ($nlines == 0) {
Packit 0848f5
	        $nlineTxt = "    #####";
Packit 0848f5
	    }
Packit 0848f5
	    else {
Packit 0848f5
	        $nlineTxt = sprintf( "%9d", $nlines );
Packit 0848f5
	    }
Packit 0848f5
	    $linenumTxt = sprintf( "%5d", $s1linenum );
Packit 0848f5
	    $out = "$nlineTxt:$linenumTxt:$s1line\n";
Packit 0848f5
	    #$out = "$nlines:$s1linenum:$s1line\n";
Packit 0848f5
	}
Packit 0848f5
	else {
Packit 0848f5
	    # This outputs both lines
Packit 0848f5
	    $out = $s1 . $s2;
Packit 0848f5
	}
Packit 0848f5
    }
Packit 0848f5
    else {
Packit 0848f5
	$out = $s1;
Packit 0848f5
    }
Packit 0848f5
	
Packit 0848f5
    print $out;
Packit 0848f5
}
Packit 0848f5
Packit 0848f5
# One of the two files has reached the EOF.  Copy out the rest of the other file
Packit 0848f5
while (!eof(I1)) {
Packit 0848f5
    $s1 = <I1>;
Packit 0848f5
    print $s1;
Packit 0848f5
}
Packit 0848f5
while (!eof(I2)) {
Packit 0848f5
    $s2 = <I2>;
Packit 0848f5
    print $s2;
Packit 0848f5
}