cg_diff.in revision 69d495de9c26f1b99c9af8b2d366a09f23b47b76
169d495de9c26f1b99c9af8b2d366a09f23b47b76njn#! @PERL@ 269d495de9c26f1b99c9af8b2d366a09f23b47b76njn 369d495de9c26f1b99c9af8b2d366a09f23b47b76njn##--------------------------------------------------------------------## 469d495de9c26f1b99c9af8b2d366a09f23b47b76njn##--- Cachegrind's differencer. cg_diff.in ---## 569d495de9c26f1b99c9af8b2d366a09f23b47b76njn##--------------------------------------------------------------------## 669d495de9c26f1b99c9af8b2d366a09f23b47b76njn 769d495de9c26f1b99c9af8b2d366a09f23b47b76njn# This file is part of Cachegrind, a Valgrind tool for cache 869d495de9c26f1b99c9af8b2d366a09f23b47b76njn# profiling programs. 969d495de9c26f1b99c9af8b2d366a09f23b47b76njn# 1069d495de9c26f1b99c9af8b2d366a09f23b47b76njn# Copyright (C) 2002-2010 Nicholas Nethercote 1169d495de9c26f1b99c9af8b2d366a09f23b47b76njn# njn@valgrind.org 1269d495de9c26f1b99c9af8b2d366a09f23b47b76njn# 1369d495de9c26f1b99c9af8b2d366a09f23b47b76njn# This program is free software; you can redistribute it and/or 1469d495de9c26f1b99c9af8b2d366a09f23b47b76njn# modify it under the terms of the GNU General Public License as 1569d495de9c26f1b99c9af8b2d366a09f23b47b76njn# published by the Free Software Foundation; either version 2 of the 1669d495de9c26f1b99c9af8b2d366a09f23b47b76njn# License, or (at your option) any later version. 1769d495de9c26f1b99c9af8b2d366a09f23b47b76njn# 1869d495de9c26f1b99c9af8b2d366a09f23b47b76njn# This program is distributed in the hope that it will be useful, but 1969d495de9c26f1b99c9af8b2d366a09f23b47b76njn# WITHOUT ANY WARRANTY; without even the implied warranty of 2069d495de9c26f1b99c9af8b2d366a09f23b47b76njn# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 2169d495de9c26f1b99c9af8b2d366a09f23b47b76njn# General Public License for more details. 2269d495de9c26f1b99c9af8b2d366a09f23b47b76njn# 2369d495de9c26f1b99c9af8b2d366a09f23b47b76njn# You should have received a copy of the GNU General Public License 2469d495de9c26f1b99c9af8b2d366a09f23b47b76njn# along with this program; if not, write to the Free Software 2569d495de9c26f1b99c9af8b2d366a09f23b47b76njn# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 2669d495de9c26f1b99c9af8b2d366a09f23b47b76njn# 02111-1307, USA. 2769d495de9c26f1b99c9af8b2d366a09f23b47b76njn# 2869d495de9c26f1b99c9af8b2d366a09f23b47b76njn# The GNU General Public License is contained in the file COPYING. 2969d495de9c26f1b99c9af8b2d366a09f23b47b76njn 3069d495de9c26f1b99c9af8b2d366a09f23b47b76njn#---------------------------------------------------------------------------- 3169d495de9c26f1b99c9af8b2d366a09f23b47b76njn# This is a very cut-down and modified version of cg_annotate. 3269d495de9c26f1b99c9af8b2d366a09f23b47b76njn#---------------------------------------------------------------------------- 3369d495de9c26f1b99c9af8b2d366a09f23b47b76njn 3469d495de9c26f1b99c9af8b2d366a09f23b47b76njnuse warnings; 3569d495de9c26f1b99c9af8b2d366a09f23b47b76njnuse strict; 3669d495de9c26f1b99c9af8b2d366a09f23b47b76njn 3769d495de9c26f1b99c9af8b2d366a09f23b47b76njn#---------------------------------------------------------------------------- 3869d495de9c26f1b99c9af8b2d366a09f23b47b76njn# Global variables 3969d495de9c26f1b99c9af8b2d366a09f23b47b76njn#---------------------------------------------------------------------------- 4069d495de9c26f1b99c9af8b2d366a09f23b47b76njn 4169d495de9c26f1b99c9af8b2d366a09f23b47b76njn# Version number 4269d495de9c26f1b99c9af8b2d366a09f23b47b76njnmy $version = "@VERSION@"; 4369d495de9c26f1b99c9af8b2d366a09f23b47b76njn 4469d495de9c26f1b99c9af8b2d366a09f23b47b76njn# Usage message. 4569d495de9c26f1b99c9af8b2d366a09f23b47b76njnmy $usage = <<END 4669d495de9c26f1b99c9af8b2d366a09f23b47b76njnusage: cg_diff [options] <cachegrind-out-file1> <cachegrind-out-file2> 4769d495de9c26f1b99c9af8b2d366a09f23b47b76njn 4869d495de9c26f1b99c9af8b2d366a09f23b47b76njn options for the user, with defaults in [ ], are: 4969d495de9c26f1b99c9af8b2d366a09f23b47b76njn -h --help show this message 5069d495de9c26f1b99c9af8b2d366a09f23b47b76njn -v --version show version 5169d495de9c26f1b99c9af8b2d366a09f23b47b76njn --mod-filename=<expr> a Perl search-and-replace expression that is applied 5269d495de9c26f1b99c9af8b2d366a09f23b47b76njn to filenames, eg. --mod-filename='s/prog[0-9]/projN/' 5369d495de9c26f1b99c9af8b2d366a09f23b47b76njn 5469d495de9c26f1b99c9af8b2d366a09f23b47b76njn cg_diff is Copyright (C) 2010-2010 Nicholas Nethercote. 5569d495de9c26f1b99c9af8b2d366a09f23b47b76njn and licensed under the GNU General Public License, version 2. 5669d495de9c26f1b99c9af8b2d366a09f23b47b76njn Bug reports, feedback, admiration, abuse, etc, to: njn\@valgrind.org. 5769d495de9c26f1b99c9af8b2d366a09f23b47b76njn 5869d495de9c26f1b99c9af8b2d366a09f23b47b76njnEND 5969d495de9c26f1b99c9af8b2d366a09f23b47b76njn; 6069d495de9c26f1b99c9af8b2d366a09f23b47b76njn 6169d495de9c26f1b99c9af8b2d366a09f23b47b76njn# --mod-filename expression 6269d495de9c26f1b99c9af8b2d366a09f23b47b76njnmy $mod_filename = undef; 6369d495de9c26f1b99c9af8b2d366a09f23b47b76njn 6469d495de9c26f1b99c9af8b2d366a09f23b47b76njn#----------------------------------------------------------------------------- 6569d495de9c26f1b99c9af8b2d366a09f23b47b76njn# Argument and option handling 6669d495de9c26f1b99c9af8b2d366a09f23b47b76njn#----------------------------------------------------------------------------- 6769d495de9c26f1b99c9af8b2d366a09f23b47b76njnsub process_cmd_line() 6869d495de9c26f1b99c9af8b2d366a09f23b47b76njn{ 6969d495de9c26f1b99c9af8b2d366a09f23b47b76njn my ($file1, $file2) = (undef, undef); 7069d495de9c26f1b99c9af8b2d366a09f23b47b76njn 7169d495de9c26f1b99c9af8b2d366a09f23b47b76njn for my $arg (@ARGV) { 7269d495de9c26f1b99c9af8b2d366a09f23b47b76njn 7369d495de9c26f1b99c9af8b2d366a09f23b47b76njn if ($arg =~ /^-/) { 7469d495de9c26f1b99c9af8b2d366a09f23b47b76njn # --version 7569d495de9c26f1b99c9af8b2d366a09f23b47b76njn if ($arg =~ /^-v$|^--version$/) { 7669d495de9c26f1b99c9af8b2d366a09f23b47b76njn die("cg_diff-$version\n"); 7769d495de9c26f1b99c9af8b2d366a09f23b47b76njn 7869d495de9c26f1b99c9af8b2d366a09f23b47b76njn } elsif ($arg =~ /^--mod-filename=(.*)/) { 7969d495de9c26f1b99c9af8b2d366a09f23b47b76njn $mod_filename = $1; 8069d495de9c26f1b99c9af8b2d366a09f23b47b76njn 8169d495de9c26f1b99c9af8b2d366a09f23b47b76njn } else { # -h and --help fall under this case 8269d495de9c26f1b99c9af8b2d366a09f23b47b76njn die($usage); 8369d495de9c26f1b99c9af8b2d366a09f23b47b76njn } 8469d495de9c26f1b99c9af8b2d366a09f23b47b76njn 8569d495de9c26f1b99c9af8b2d366a09f23b47b76njn } elsif (not defined($file1)) { 8669d495de9c26f1b99c9af8b2d366a09f23b47b76njn $file1 = $arg; 8769d495de9c26f1b99c9af8b2d366a09f23b47b76njn 8869d495de9c26f1b99c9af8b2d366a09f23b47b76njn } elsif (not defined($file2)) { 8969d495de9c26f1b99c9af8b2d366a09f23b47b76njn $file2 = $arg; 9069d495de9c26f1b99c9af8b2d366a09f23b47b76njn 9169d495de9c26f1b99c9af8b2d366a09f23b47b76njn } else { 9269d495de9c26f1b99c9af8b2d366a09f23b47b76njn die($usage); 9369d495de9c26f1b99c9af8b2d366a09f23b47b76njn } 9469d495de9c26f1b99c9af8b2d366a09f23b47b76njn } 9569d495de9c26f1b99c9af8b2d366a09f23b47b76njn 9669d495de9c26f1b99c9af8b2d366a09f23b47b76njn # Must have specified two input files. 9769d495de9c26f1b99c9af8b2d366a09f23b47b76njn if (not defined $file1 or not defined $file2) { 9869d495de9c26f1b99c9af8b2d366a09f23b47b76njn die($usage); 9969d495de9c26f1b99c9af8b2d366a09f23b47b76njn } 10069d495de9c26f1b99c9af8b2d366a09f23b47b76njn 10169d495de9c26f1b99c9af8b2d366a09f23b47b76njn return ($file1, $file2); 10269d495de9c26f1b99c9af8b2d366a09f23b47b76njn} 10369d495de9c26f1b99c9af8b2d366a09f23b47b76njn 10469d495de9c26f1b99c9af8b2d366a09f23b47b76njn#----------------------------------------------------------------------------- 10569d495de9c26f1b99c9af8b2d366a09f23b47b76njn# Reading of input file 10669d495de9c26f1b99c9af8b2d366a09f23b47b76njn#----------------------------------------------------------------------------- 10769d495de9c26f1b99c9af8b2d366a09f23b47b76njnsub max ($$) 10869d495de9c26f1b99c9af8b2d366a09f23b47b76njn{ 10969d495de9c26f1b99c9af8b2d366a09f23b47b76njn my ($x, $y) = @_; 11069d495de9c26f1b99c9af8b2d366a09f23b47b76njn return ($x > $y ? $x : $y); 11169d495de9c26f1b99c9af8b2d366a09f23b47b76njn} 11269d495de9c26f1b99c9af8b2d366a09f23b47b76njn 11369d495de9c26f1b99c9af8b2d366a09f23b47b76njn# Add the two arrays; any '.' entries are ignored. Two tricky things: 11469d495de9c26f1b99c9af8b2d366a09f23b47b76njn# 1. If $a2->[$i] is undefined, it defaults to 0 which is what we want; we turn 11569d495de9c26f1b99c9af8b2d366a09f23b47b76njn# off warnings to allow this. This makes things about 10% faster than 11669d495de9c26f1b99c9af8b2d366a09f23b47b76njn# checking for definedness ourselves. 11769d495de9c26f1b99c9af8b2d366a09f23b47b76njn# 2. We don't add an undefined count or a ".", even though it's value is 0, 11869d495de9c26f1b99c9af8b2d366a09f23b47b76njn# because we don't want to make an $a2->[$i] that is undef become 0 11969d495de9c26f1b99c9af8b2d366a09f23b47b76njn# unnecessarily. 12069d495de9c26f1b99c9af8b2d366a09f23b47b76njnsub add_array_a_to_b ($$) 12169d495de9c26f1b99c9af8b2d366a09f23b47b76njn{ 12269d495de9c26f1b99c9af8b2d366a09f23b47b76njn my ($a, $b) = @_; 12369d495de9c26f1b99c9af8b2d366a09f23b47b76njn 12469d495de9c26f1b99c9af8b2d366a09f23b47b76njn my $n = max(scalar @$a, scalar @$b); 12569d495de9c26f1b99c9af8b2d366a09f23b47b76njn $^W = 0; 12669d495de9c26f1b99c9af8b2d366a09f23b47b76njn foreach my $i (0 .. $n-1) { 12769d495de9c26f1b99c9af8b2d366a09f23b47b76njn $b->[$i] += $a->[$i] if (defined $a->[$i] && "." ne $a->[$i]); 12869d495de9c26f1b99c9af8b2d366a09f23b47b76njn } 12969d495de9c26f1b99c9af8b2d366a09f23b47b76njn $^W = 1; 13069d495de9c26f1b99c9af8b2d366a09f23b47b76njn} 13169d495de9c26f1b99c9af8b2d366a09f23b47b76njn 13269d495de9c26f1b99c9af8b2d366a09f23b47b76njnsub sub_array_b_from_a ($$) 13369d495de9c26f1b99c9af8b2d366a09f23b47b76njn{ 13469d495de9c26f1b99c9af8b2d366a09f23b47b76njn my ($a, $b) = @_; 13569d495de9c26f1b99c9af8b2d366a09f23b47b76njn 13669d495de9c26f1b99c9af8b2d366a09f23b47b76njn my $n = max(scalar @$a, scalar @$b); 13769d495de9c26f1b99c9af8b2d366a09f23b47b76njn $^W = 0; 13869d495de9c26f1b99c9af8b2d366a09f23b47b76njn foreach my $i (0 .. $n-1) { 13969d495de9c26f1b99c9af8b2d366a09f23b47b76njn $a->[$i] -= $b->[$i]; # XXX: doesn't handle '.' entries 14069d495de9c26f1b99c9af8b2d366a09f23b47b76njn } 14169d495de9c26f1b99c9af8b2d366a09f23b47b76njn $^W = 1; 14269d495de9c26f1b99c9af8b2d366a09f23b47b76njn} 14369d495de9c26f1b99c9af8b2d366a09f23b47b76njn 14469d495de9c26f1b99c9af8b2d366a09f23b47b76njn# Add each event count to the CC array. '.' counts become undef, as do 14569d495de9c26f1b99c9af8b2d366a09f23b47b76njn# missing entries (implicitly). 14669d495de9c26f1b99c9af8b2d366a09f23b47b76njnsub line_to_CC ($$) 14769d495de9c26f1b99c9af8b2d366a09f23b47b76njn{ 14869d495de9c26f1b99c9af8b2d366a09f23b47b76njn my ($line, $numEvents) = @_; 14969d495de9c26f1b99c9af8b2d366a09f23b47b76njn 15069d495de9c26f1b99c9af8b2d366a09f23b47b76njn my @CC = (split /\s+/, $line); 15169d495de9c26f1b99c9af8b2d366a09f23b47b76njn (@CC <= $numEvents) or die("Line $.: too many event counts\n"); 15269d495de9c26f1b99c9af8b2d366a09f23b47b76njn return \@CC; 15369d495de9c26f1b99c9af8b2d366a09f23b47b76njn} 15469d495de9c26f1b99c9af8b2d366a09f23b47b76njn 15569d495de9c26f1b99c9af8b2d366a09f23b47b76njnsub read_input_file($) 15669d495de9c26f1b99c9af8b2d366a09f23b47b76njn{ 15769d495de9c26f1b99c9af8b2d366a09f23b47b76njn my ($input_file) = @_; 15869d495de9c26f1b99c9af8b2d366a09f23b47b76njn 15969d495de9c26f1b99c9af8b2d366a09f23b47b76njn open(INPUTFILE, "< $input_file") 16069d495de9c26f1b99c9af8b2d366a09f23b47b76njn || die "Cannot open $input_file for reading\n"; 16169d495de9c26f1b99c9af8b2d366a09f23b47b76njn 16269d495de9c26f1b99c9af8b2d366a09f23b47b76njn # Read "desc:" lines. 16369d495de9c26f1b99c9af8b2d366a09f23b47b76njn my $desc; 16469d495de9c26f1b99c9af8b2d366a09f23b47b76njn my $line; 16569d495de9c26f1b99c9af8b2d366a09f23b47b76njn while ($line = <INPUTFILE>) { 16669d495de9c26f1b99c9af8b2d366a09f23b47b76njn if ($line =~ s/desc:\s+//) { 16769d495de9c26f1b99c9af8b2d366a09f23b47b76njn $desc .= $line; 16869d495de9c26f1b99c9af8b2d366a09f23b47b76njn } else { 16969d495de9c26f1b99c9af8b2d366a09f23b47b76njn last; 17069d495de9c26f1b99c9af8b2d366a09f23b47b76njn } 17169d495de9c26f1b99c9af8b2d366a09f23b47b76njn } 17269d495de9c26f1b99c9af8b2d366a09f23b47b76njn 17369d495de9c26f1b99c9af8b2d366a09f23b47b76njn # Read "cmd:" line (Nb: will already be in $line from "desc:" loop above). 17469d495de9c26f1b99c9af8b2d366a09f23b47b76njn ($line =~ s/^cmd:\s+//) or die("Line $.: missing command line\n"); 17569d495de9c26f1b99c9af8b2d366a09f23b47b76njn my $cmd = $line; 17669d495de9c26f1b99c9af8b2d366a09f23b47b76njn chomp($cmd); # Remove newline 17769d495de9c26f1b99c9af8b2d366a09f23b47b76njn 17869d495de9c26f1b99c9af8b2d366a09f23b47b76njn # Read "events:" line. We make a temporary hash in which the Nth event's 17969d495de9c26f1b99c9af8b2d366a09f23b47b76njn # value is N, which is useful for handling --show/--sort options below. 18069d495de9c26f1b99c9af8b2d366a09f23b47b76njn $line = <INPUTFILE>; 18169d495de9c26f1b99c9af8b2d366a09f23b47b76njn (defined $line && $line =~ s/^events:\s+//) 18269d495de9c26f1b99c9af8b2d366a09f23b47b76njn or die("Line $.: missing events line\n"); 18369d495de9c26f1b99c9af8b2d366a09f23b47b76njn my @events = split(/\s+/, $line); 18469d495de9c26f1b99c9af8b2d366a09f23b47b76njn my $numEvents = scalar @events; 18569d495de9c26f1b99c9af8b2d366a09f23b47b76njn 18669d495de9c26f1b99c9af8b2d366a09f23b47b76njn my $currFileName; 18769d495de9c26f1b99c9af8b2d366a09f23b47b76njn my $currFileFuncName; 18869d495de9c26f1b99c9af8b2d366a09f23b47b76njn 18969d495de9c26f1b99c9af8b2d366a09f23b47b76njn my %CCs; # hash("$filename#$funcname" => CC array) 19069d495de9c26f1b99c9af8b2d366a09f23b47b76njn my $currCC = undef; # CC array 19169d495de9c26f1b99c9af8b2d366a09f23b47b76njn 19269d495de9c26f1b99c9af8b2d366a09f23b47b76njn my $summaryCC; 19369d495de9c26f1b99c9af8b2d366a09f23b47b76njn 19469d495de9c26f1b99c9af8b2d366a09f23b47b76njn # Read body of input file. 19569d495de9c26f1b99c9af8b2d366a09f23b47b76njn while (<INPUTFILE>) { 19669d495de9c26f1b99c9af8b2d366a09f23b47b76njn s/#.*$//; # remove comments 19769d495de9c26f1b99c9af8b2d366a09f23b47b76njn if (s/^(\d+)\s+//) { 19869d495de9c26f1b99c9af8b2d366a09f23b47b76njn my $CC = line_to_CC($_, $numEvents); 19969d495de9c26f1b99c9af8b2d366a09f23b47b76njn defined($currCC) || die; 20069d495de9c26f1b99c9af8b2d366a09f23b47b76njn add_array_a_to_b($CC, $currCC); 20169d495de9c26f1b99c9af8b2d366a09f23b47b76njn 20269d495de9c26f1b99c9af8b2d366a09f23b47b76njn } elsif (s/^fn=(.*)$//) { 20369d495de9c26f1b99c9af8b2d366a09f23b47b76njn defined($currFileName) || die; 20469d495de9c26f1b99c9af8b2d366a09f23b47b76njn $currFileFuncName = "$currFileName#$1"; 20569d495de9c26f1b99c9af8b2d366a09f23b47b76njn $currCC = $CCs{$currFileFuncName}; 20669d495de9c26f1b99c9af8b2d366a09f23b47b76njn if (not defined $currCC) { 20769d495de9c26f1b99c9af8b2d366a09f23b47b76njn $currCC = []; 20869d495de9c26f1b99c9af8b2d366a09f23b47b76njn $CCs{$currFileFuncName} = $currCC; 20969d495de9c26f1b99c9af8b2d366a09f23b47b76njn } 21069d495de9c26f1b99c9af8b2d366a09f23b47b76njn 21169d495de9c26f1b99c9af8b2d366a09f23b47b76njn } elsif (s/^fl=(.*)$//) { 21269d495de9c26f1b99c9af8b2d366a09f23b47b76njn $currFileName = $1; 21369d495de9c26f1b99c9af8b2d366a09f23b47b76njn if (defined $mod_filename) { 21469d495de9c26f1b99c9af8b2d366a09f23b47b76njn eval "\$currFileName =~ $mod_filename"; 21569d495de9c26f1b99c9af8b2d366a09f23b47b76njn } 21669d495de9c26f1b99c9af8b2d366a09f23b47b76njn # Assume that a "fn=" line is followed by a "fl=" line. 21769d495de9c26f1b99c9af8b2d366a09f23b47b76njn $currFileFuncName = undef; 21869d495de9c26f1b99c9af8b2d366a09f23b47b76njn 21969d495de9c26f1b99c9af8b2d366a09f23b47b76njn } elsif (s/^\s*$//) { 22069d495de9c26f1b99c9af8b2d366a09f23b47b76njn # blank, do nothing 22169d495de9c26f1b99c9af8b2d366a09f23b47b76njn 22269d495de9c26f1b99c9af8b2d366a09f23b47b76njn } elsif (s/^summary:\s+//) { 22369d495de9c26f1b99c9af8b2d366a09f23b47b76njn $summaryCC = line_to_CC($_, $numEvents); 22469d495de9c26f1b99c9af8b2d366a09f23b47b76njn (scalar(@$summaryCC) == @events) 22569d495de9c26f1b99c9af8b2d366a09f23b47b76njn or die("Line $.: summary event and total event mismatch\n"); 22669d495de9c26f1b99c9af8b2d366a09f23b47b76njn 22769d495de9c26f1b99c9af8b2d366a09f23b47b76njn } else { 22869d495de9c26f1b99c9af8b2d366a09f23b47b76njn warn("WARNING: line $. malformed, ignoring\n"); 22969d495de9c26f1b99c9af8b2d366a09f23b47b76njn } 23069d495de9c26f1b99c9af8b2d366a09f23b47b76njn } 23169d495de9c26f1b99c9af8b2d366a09f23b47b76njn 23269d495de9c26f1b99c9af8b2d366a09f23b47b76njn # Check if summary line was present 23369d495de9c26f1b99c9af8b2d366a09f23b47b76njn if (not defined $summaryCC) { 23469d495de9c26f1b99c9af8b2d366a09f23b47b76njn die("missing final summary line, aborting\n"); 23569d495de9c26f1b99c9af8b2d366a09f23b47b76njn } 23669d495de9c26f1b99c9af8b2d366a09f23b47b76njn 23769d495de9c26f1b99c9af8b2d366a09f23b47b76njn close(INPUTFILE); 23869d495de9c26f1b99c9af8b2d366a09f23b47b76njn 23969d495de9c26f1b99c9af8b2d366a09f23b47b76njn return ($cmd, \@events, \%CCs, $summaryCC); 24069d495de9c26f1b99c9af8b2d366a09f23b47b76njn} 24169d495de9c26f1b99c9af8b2d366a09f23b47b76njn 24269d495de9c26f1b99c9af8b2d366a09f23b47b76njn#---------------------------------------------------------------------------- 24369d495de9c26f1b99c9af8b2d366a09f23b47b76njn# "main()" 24469d495de9c26f1b99c9af8b2d366a09f23b47b76njn#---------------------------------------------------------------------------- 24569d495de9c26f1b99c9af8b2d366a09f23b47b76njn# Commands seen in the files. Need not match. 24669d495de9c26f1b99c9af8b2d366a09f23b47b76njnmy $cmd1; 24769d495de9c26f1b99c9af8b2d366a09f23b47b76njnmy $cmd2; 24869d495de9c26f1b99c9af8b2d366a09f23b47b76njn 24969d495de9c26f1b99c9af8b2d366a09f23b47b76njn# Events seen in the files. They must match. 25069d495de9c26f1b99c9af8b2d366a09f23b47b76njnmy $events1; 25169d495de9c26f1b99c9af8b2d366a09f23b47b76njnmy $events2; 25269d495de9c26f1b99c9af8b2d366a09f23b47b76njn 25369d495de9c26f1b99c9af8b2d366a09f23b47b76njn# Individual CCs, organised by filename/funcname/line_num. 25469d495de9c26f1b99c9af8b2d366a09f23b47b76njn# hashref("$filename#$funcname", CC array) 25569d495de9c26f1b99c9af8b2d366a09f23b47b76njnmy $CCs1; 25669d495de9c26f1b99c9af8b2d366a09f23b47b76njnmy $CCs2; 25769d495de9c26f1b99c9af8b2d366a09f23b47b76njn 25869d495de9c26f1b99c9af8b2d366a09f23b47b76njn# Total counts for summary (an arrayref). 25969d495de9c26f1b99c9af8b2d366a09f23b47b76njnmy $summaryCC1; 26069d495de9c26f1b99c9af8b2d366a09f23b47b76njnmy $summaryCC2; 26169d495de9c26f1b99c9af8b2d366a09f23b47b76njn 26269d495de9c26f1b99c9af8b2d366a09f23b47b76njn#---------------------------------------------------------------------------- 26369d495de9c26f1b99c9af8b2d366a09f23b47b76njn# Read the input files 26469d495de9c26f1b99c9af8b2d366a09f23b47b76njn#---------------------------------------------------------------------------- 26569d495de9c26f1b99c9af8b2d366a09f23b47b76njnmy ($file1, $file2) = process_cmd_line(); 26669d495de9c26f1b99c9af8b2d366a09f23b47b76njn($cmd1, $events1, $CCs1, $summaryCC1) = read_input_file($file1); 26769d495de9c26f1b99c9af8b2d366a09f23b47b76njn($cmd2, $events2, $CCs2, $summaryCC2) = read_input_file($file2); 26869d495de9c26f1b99c9af8b2d366a09f23b47b76njn 26969d495de9c26f1b99c9af8b2d366a09f23b47b76njn#---------------------------------------------------------------------------- 27069d495de9c26f1b99c9af8b2d366a09f23b47b76njn# Check the events match 27169d495de9c26f1b99c9af8b2d366a09f23b47b76njn#---------------------------------------------------------------------------- 27269d495de9c26f1b99c9af8b2d366a09f23b47b76njnmy $n = max(scalar @$events1, scalar @$events2); 27369d495de9c26f1b99c9af8b2d366a09f23b47b76njn$^W = 0; # turn off warnings, because we might hit undefs 27469d495de9c26f1b99c9af8b2d366a09f23b47b76njnforeach my $i (0 .. $n-1) { 27569d495de9c26f1b99c9af8b2d366a09f23b47b76njn ($events1->[$i] eq $events2->[$i]) || die "events don't match, aborting\n"; 27669d495de9c26f1b99c9af8b2d366a09f23b47b76njn} 27769d495de9c26f1b99c9af8b2d366a09f23b47b76njn$^W = 1; 27869d495de9c26f1b99c9af8b2d366a09f23b47b76njn 27969d495de9c26f1b99c9af8b2d366a09f23b47b76njn#---------------------------------------------------------------------------- 28069d495de9c26f1b99c9af8b2d366a09f23b47b76njn# Do the subtraction: CCs2 -= CCs1 28169d495de9c26f1b99c9af8b2d366a09f23b47b76njn#---------------------------------------------------------------------------- 28269d495de9c26f1b99c9af8b2d366a09f23b47b76njnwhile (my ($filefuncname, $CC1) = each(%$CCs1)) { 28369d495de9c26f1b99c9af8b2d366a09f23b47b76njn my $CC2 = $CCs2->{$filefuncname}; 28469d495de9c26f1b99c9af8b2d366a09f23b47b76njn if (not defined $CC2) { 28569d495de9c26f1b99c9af8b2d366a09f23b47b76njn $CC2 = []; 28669d495de9c26f1b99c9af8b2d366a09f23b47b76njn sub_array_b_from_a($CC2, $CC1); # CC2 -= CC1 28769d495de9c26f1b99c9af8b2d366a09f23b47b76njn $CCs2->{$filefuncname} = $CC2; 28869d495de9c26f1b99c9af8b2d366a09f23b47b76njn } else { 28969d495de9c26f1b99c9af8b2d366a09f23b47b76njn sub_array_b_from_a($CC2, $CC1); # CC2 -= CC1 29069d495de9c26f1b99c9af8b2d366a09f23b47b76njn } 29169d495de9c26f1b99c9af8b2d366a09f23b47b76njn} 29269d495de9c26f1b99c9af8b2d366a09f23b47b76njnsub_array_b_from_a($summaryCC2, $summaryCC1); 29369d495de9c26f1b99c9af8b2d366a09f23b47b76njn 29469d495de9c26f1b99c9af8b2d366a09f23b47b76njn#---------------------------------------------------------------------------- 29569d495de9c26f1b99c9af8b2d366a09f23b47b76njn# Print the result, in CCs2 29669d495de9c26f1b99c9af8b2d366a09f23b47b76njn#---------------------------------------------------------------------------- 29769d495de9c26f1b99c9af8b2d366a09f23b47b76njnprint("desc: Files compared: $file1; $file2\n"); 29869d495de9c26f1b99c9af8b2d366a09f23b47b76njnprint("cmd: $cmd1; $cmd2\n"); 29969d495de9c26f1b99c9af8b2d366a09f23b47b76njnprint("events: "); 30069d495de9c26f1b99c9af8b2d366a09f23b47b76njnfor my $e (@$events1) { 30169d495de9c26f1b99c9af8b2d366a09f23b47b76njn print(" $e"); 30269d495de9c26f1b99c9af8b2d366a09f23b47b76njn} 30369d495de9c26f1b99c9af8b2d366a09f23b47b76njnprint("\n"); 30469d495de9c26f1b99c9af8b2d366a09f23b47b76njn 30569d495de9c26f1b99c9af8b2d366a09f23b47b76njnwhile (my ($filefuncname, $CC) = each(%$CCs2)) { 30669d495de9c26f1b99c9af8b2d366a09f23b47b76njn 30769d495de9c26f1b99c9af8b2d366a09f23b47b76njn my @x = split(/#/, $filefuncname); 30869d495de9c26f1b99c9af8b2d366a09f23b47b76njn (scalar @x == 2) || die; 30969d495de9c26f1b99c9af8b2d366a09f23b47b76njn 31069d495de9c26f1b99c9af8b2d366a09f23b47b76njn print("fl=$x[0]\n"); 31169d495de9c26f1b99c9af8b2d366a09f23b47b76njn print("fn=$x[1]\n"); 31269d495de9c26f1b99c9af8b2d366a09f23b47b76njn 31369d495de9c26f1b99c9af8b2d366a09f23b47b76njn print("0"); 31469d495de9c26f1b99c9af8b2d366a09f23b47b76njn foreach my $n (@$CC) { 31569d495de9c26f1b99c9af8b2d366a09f23b47b76njn print(" $n"); 31669d495de9c26f1b99c9af8b2d366a09f23b47b76njn } 31769d495de9c26f1b99c9af8b2d366a09f23b47b76njn print("\n"); 31869d495de9c26f1b99c9af8b2d366a09f23b47b76njn} 31969d495de9c26f1b99c9af8b2d366a09f23b47b76njn 32069d495de9c26f1b99c9af8b2d366a09f23b47b76njnprint("summary:"); 32169d495de9c26f1b99c9af8b2d366a09f23b47b76njnforeach my $n (@$summaryCC2) { 32269d495de9c26f1b99c9af8b2d366a09f23b47b76njn print(" $n"); 32369d495de9c26f1b99c9af8b2d366a09f23b47b76njn} 32469d495de9c26f1b99c9af8b2d366a09f23b47b76njnprint("\n"); 32569d495de9c26f1b99c9af8b2d366a09f23b47b76njn 32669d495de9c26f1b99c9af8b2d366a09f23b47b76njn##--------------------------------------------------------------------## 32769d495de9c26f1b99c9af8b2d366a09f23b47b76njn##--- end ---## 32869d495de9c26f1b99c9af8b2d366a09f23b47b76njn##--------------------------------------------------------------------## 329