From: Peter O. <obe...@us...> - 2013-01-25 16:29:32
|
Update of /cvsroot/ltp/utils/analysis/lcov/bin In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv22341 Modified Files: genhtml Log Message: genhtml: merge function data during demangling Merge function execution counts when multiple function names demangle to the same name. Index: genhtml =================================================================== RCS file: /cvsroot/ltp/utils/analysis/lcov/bin/genhtml,v retrieving revision 1.72 retrieving revision 1.73 diff -C2 -d -r1.72 -r1.73 *** genhtml 25 Jan 2013 11:46:28 -0000 1.72 --- genhtml 25 Jan 2013 16:29:30 -0000 1.73 *************** *** 707,710 **** --- 707,712 ---- # # Rename all function names in INFO according to CONV: OLD_NAME -> NEW_NAME. + # In case two functions demangle to the same name, assume that they are + # different object code implementations for the same source function. # *************** *** 720,728 **** my %newfuncdata; my %newsumfnccount; # funcdata: function name -> line number $funcdata = $data->{"func"}; ! foreach my $fn_name (keys(%{$funcdata})) { ! $newfuncdata{$conv->{$fn_name}} = $funcdata->{$fn_name}; } $data->{"func"} = \%newfuncdata; --- 722,743 ---- my %newfuncdata; my %newsumfnccount; + my $f_found; + my $f_hit; # funcdata: function name -> line number $funcdata = $data->{"func"}; ! foreach my $fn (keys(%{$funcdata})) { ! my $cn = $conv->{$fn}; ! ! # Abort if two functions on different lines map to the ! # same demangled name. ! if (defined($newfuncdata{$cn}) && ! $newfuncdata{$cn} != $funcdata->{$fn}) { ! die("ERROR: Demangled function name $fn ". ! " maps to different lines (". ! $newfuncdata{$cn}." vs ". ! $funcdata->{$fn}.")\n"); ! } ! $newfuncdata{$cn} = $funcdata->{$fn}; } $data->{"func"} = \%newfuncdata; *************** *** 731,774 **** # testfnccount: function name -> execution count $testfncdata = $data->{"testfnc"}; ! foreach my $test_name (keys(%{$testfncdata})) { ! my $testfnccount = $testfncdata->{$test_name}; my %newtestfnccount; ! foreach my $fn_name (keys(%{$testfnccount})) { ! $newtestfnccount{$conv->{$fn_name}} = ! $testfnccount->{$fn_name}; } ! $testfncdata->{$test_name} = \%newtestfnccount; } # sumfnccount: function name -> execution count $sumfnccount = $data->{"sumfnc"}; ! foreach my $fn_name (keys(%{$sumfnccount})) { ! $newsumfnccount{$conv->{$fn_name}} = ! $sumfnccount->{$fn_name}; } $data->{"sumfnc"} = \%newsumfnccount; - } - } - - # - # check_unique_conv(CONV) - # - # Check that there is no A in CONV: A -> B where C -> B. - # - - sub check_unique_conv($) - { - my ($conv) = @_; - my %rconv; ! foreach my $fn_name (keys(%{$conv})) { ! my $c = $conv->{$fn_name}; ! ! if (defined($rconv{$c})) { ! die("ERROR: non-unique c++filt output for ". ! "'$fn_name' and '$rconv{$c}!\n"); } ! $rconv{$c} = $fn_name; } } --- 746,785 ---- # testfnccount: function name -> execution count $testfncdata = $data->{"testfnc"}; ! foreach my $tn (keys(%{$testfncdata})) { ! my $testfnccount = $testfncdata->{$tn}; my %newtestfnccount; ! foreach my $fn (keys(%{$testfnccount})) { ! my $cn = $conv->{$fn}; ! ! # Add counts for different functions that map ! # to the same name. ! $newtestfnccount{$cn} += ! $testfnccount->{$fn}; } ! $testfncdata->{$tn} = \%newtestfnccount; } # sumfnccount: function name -> execution count $sumfnccount = $data->{"sumfnc"}; ! foreach my $fn (keys(%{$sumfnccount})) { ! my $cn = $conv->{$fn}; ! ! # Add counts for different functions that map ! # to the same name. ! $newsumfnccount{$cn} += $sumfnccount->{$fn}; } $data->{"sumfnc"} = \%newsumfnccount; ! # Update function found and hit counts since they may have ! # changed ! $f_found = 0; ! $f_hit = 0; ! foreach my $fn (keys(%newsumfnccount)) { ! $f_found++; ! $f_hit++ if ($newsumfnccount{$fn} > 0); } ! $data->{"f_found"} = $f_found; ! $data->{"f_hit"} = $f_hit; } } *************** *** 822,828 **** } - # Should not be necessary but could silently produce incorrect results - check_unique_conv(\%demangled); - info("Demangling $changed function names\n"); --- 833,836 ---- |