Hello community, here is the log from the commit of package lcov for openSUSE:Factory checked in at 2020-08-13 10:18:25 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/lcov (Old) and /work/SRC/openSUSE:Factory/.lcov.new.3399 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "lcov" Thu Aug 13 10:18:25 2020 rev:26 rq:826083 version:1.15+git.20200812.d100e6c Changes: -------- --- /work/SRC/openSUSE:Factory/lcov/lcov.changes 2020-08-04 20:22:50.917004931 +0200 +++ /work/SRC/openSUSE:Factory/.lcov.new.3399/lcov.changes 2020-08-13 10:24:35.142901620 +0200 @@ -1,0 +2,19 @@ +Wed Aug 12 17:15:51 UTC 2020 - mli...@suse.cz + +- Update to version 1.15+git.20200812.d100e6c: + * lcov: Finalize release 1.15 + * Makefile: Reduce unnecessary meta-data in tar and RPM files + * geninfo: Add workaround for MSYS GCC problem + * geninfo: Change json module + * geninfo: Fix warning due to non-numerical branch count + * geninfo: Fix missing check for unterminated exclusion marker + * Exclusion of exception branches + * genhtml: Fix applying prefix to a prefix filename + * genhtml: Add more demangler options + * tests: Minor improvements + * tests: Minor test improvements + * man: Add clarification regarding file patterns + * geninfo: Change gzip decompression module + * Fixed processing GCOV intermediate format. + +------------------------------------------------------------------- Old: ---- lcov-1.15+git.20200723.b668fab.tar.xz New: ---- lcov-1.15+git.20200812.d100e6c.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ lcov.spec ++++++ --- /var/tmp/diff_new_pack.I57Xfv/_old 2020-08-13 10:24:38.430901531 +0200 +++ /var/tmp/diff_new_pack.I57Xfv/_new 2020-08-13 10:24:38.434901531 +0200 @@ -17,7 +17,7 @@ Name: lcov -Version: 1.15+git.20200723.b668fab +Version: 1.15+git.20200812.d100e6c Release: 0 Summary: A Graphical GCOV Front-end License: GPL-2.0-or-later ++++++ _service ++++++ --- /var/tmp/diff_new_pack.I57Xfv/_old 2020-08-13 10:24:38.474901530 +0200 +++ /var/tmp/diff_new_pack.I57Xfv/_new 2020-08-13 10:24:38.474901530 +0200 @@ -5,7 +5,7 @@ <param name="changesgenerate">enable</param> <param name="filename">lcov</param> <param name="versionformat">1.15+git.%cd.%h</param> - <param name="revision">b668fab257931356bfb21ec9c89944143b5855e6</param> + <param name="revision">d100e6cdd4c67cbe5322fa26b2ee8aa34ea7ebcf</param> </service> <service mode="disabled" name="recompress"> <param name="file">*.tar</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.I57Xfv/_old 2020-08-13 10:24:38.494901529 +0200 +++ /var/tmp/diff_new_pack.I57Xfv/_new 2020-08-13 10:24:38.498901530 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">git://github.com/linux-test-project/lcov</param> - <param name="changesrevision">b668fab257931356bfb21ec9c89944143b5855e6</param> + <param name="changesrevision">d100e6cdd4c67cbe5322fa26b2ee8aa34ea7ebcf</param> </service> </servicedata> \ No newline at end of file ++++++ lcov-1.15+git.20200723.b668fab.tar.xz -> lcov-1.15+git.20200812.d100e6c.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/Makefile new/lcov-1.15+git.20200812.d100e6c/Makefile --- old/lcov-1.15+git.20200723.b668fab/Makefile 2020-07-23 12:56:54.000000000 +0200 +++ new/lcov-1.15+git.20200812.d100e6c/Makefile 2020-08-12 16:17:04.000000000 +0200 @@ -95,7 +95,8 @@ bin/updateversion.pl $(TMP_DIR)/lcov-$(VERSION) $(VERSION) $(RELEASE) $(FULL) bin/get_changes.sh > $(TMP_DIR)/lcov-$(VERSION)/CHANGES cd $(TMP_DIR) ; \ - tar cfz $(TMP_DIR)/lcov-$(VERSION).tar.gz lcov-$(VERSION) + tar cfz $(TMP_DIR)/lcov-$(VERSION).tar.gz lcov-$(VERSION) \ + --owner root --group root mv $(TMP_DIR)/lcov-$(VERSION).tar.gz . rm -rf $(TMP_DIR) @@ -112,7 +113,8 @@ cd $(TMP_DIR)/BUILD ; \ tar xfz $(TMP_DIR)/SOURCES/lcov-$(VERSION).tar.gz \ lcov-$(VERSION)/rpm/lcov.spec - rpmbuild --define '_topdir $(TMP_DIR)' \ + rpmbuild --define '_topdir $(TMP_DIR)' --define '_buildhost localhost' \ + --undefine vendor --undefine packager \ -ba $(TMP_DIR)/BUILD/lcov-$(VERSION)/rpm/lcov.spec mv $(TMP_DIR)/RPMS/noarch/lcov-$(VERSION)-$(RELEASE).noarch.rpm . mv $(TMP_DIR)/SRPMS/lcov-$(VERSION)-$(RELEASE).src.rpm . diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/README new/lcov-1.15+git.20200812.d100e6c/README --- old/lcov-1.15+git.20200723.b668fab/README 2020-07-23 12:56:54.000000000 +0200 +++ new/lcov-1.15+git.20200812.d100e6c/README 2020-08-12 16:17:04.000000000 +0200 @@ -1,6 +1,6 @@ ------------------------------------------------- - README file for the LTP GCOV extension (LCOV) - -- Last changes: 2016-12-19 - +- Last changes: 2019-02-28 - ------------------------------------------------- Description diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/bin/genhtml new/lcov-1.15+git.20200812.d100e6c/bin/genhtml --- old/lcov-1.15+git.20200723.b668fab/bin/genhtml 2020-07-23 12:56:54.000000000 +0200 +++ new/lcov-1.15+git.20200812.d100e6c/bin/genhtml 2020-08-12 16:17:04.000000000 +0200 @@ -287,6 +287,8 @@ our $html_ext = "html"; # Extension for generated HTML files our $html_gzip = 0; # Compress with gzip our $demangle_cpp = 0; # Demangle C++ function names +our $demangle_cpp_tool = "c++filt"; # Default demangler for C++ function names +our $demangle_cpp_params = ""; # Extra parameters for demangling our @opt_ignore_errors; # Ignore certain error classes during processing our @ignore; our $opt_config_file; # User-specified configuration file location @@ -379,6 +381,8 @@ "genhtml_charset" => \$charset, "genhtml_desc_html" => \$rc_desc_html, "genhtml_demangle_cpp" => \$demangle_cpp, + "genhtml_demangle_cpp_tool" => \$demangle_cpp_tool, + "genhtml_demangle_cpp_params" => \$demangle_cpp_params, "genhtml_missed" => \$opt_missed, "lcov_function_coverage" => \$lcov_func_coverage, "lcov_branch_coverage" => \$lcov_branch_coverage, @@ -547,8 +551,8 @@ # Ensure that the c++filt tool is available when using --demangle-cpp if ($demangle_cpp) { - if (system_no_output(3, "c++filt", "--version")) { - die("ERROR: could not find c++filt tool needed for ". + if (system_no_output(3, $demangle_cpp_tool, "--version")) { + die("ERROR: could not find $demangle_cpp_tool tool needed for ". "--demangle-cpp\n"); } } @@ -5246,7 +5250,7 @@ my $tmpfile; my $handle; my %demangle; - my $demangle_arg = ""; + my $demangle_arg = $demangle_cpp_params; my %versions; # Write function names to file @@ -5257,12 +5261,12 @@ # Extra flag necessary on OS X so that symbols listed by gcov get demangled # properly. - if ($^O eq "darwin") { + if ($demangle_arg eq "" && $^O eq "darwin") { $demangle_arg = "--no-strip-underscores"; } # Build translation hash from c++filt output - open($handle, "-|", "c++filt $demangle_arg < $tmpfile") or + open($handle, "-|", "$demangle_cpp_tool $demangle_arg < $tmpfile") or die("ERROR: could not run c++filt: $!\n"); foreach my $func (@$list) { my $translated = <$handle>; @@ -5660,6 +5664,10 @@ { foreach my $prefix (@dir_prefix) { + if ($prefix eq $filename) + { + return "root"; + } if ($prefix ne "" && $filename =~ /^\Q$prefix\E\/(.*)$/) { return substr($filename, length($prefix) + 1); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/bin/geninfo new/lcov-1.15+git.20200812.d100e6c/bin/geninfo --- old/lcov-1.15+git.20200723.b668fab/bin/geninfo 2020-07-23 12:56:54.000000000 +0200 +++ new/lcov-1.15+git.20200812.d100e6c/bin/geninfo 2020-08-12 16:17:04.000000000 +0200 @@ -59,8 +59,8 @@ use Getopt::Long; use Digest::MD5 qw(md5_base64); use Cwd qw/abs_path/; -use PerlIO::gzip; -use JSON qw(decode_json); +use IO::Uncompress::Gunzip qw(gunzip $GunzipError); +use JSON::PP qw(decode_json); if( $^O eq "msys" ) { @@ -96,10 +96,14 @@ our $EXCL_START = "LCOV_EXCL_START"; our $EXCL_STOP = "LCOV_EXCL_STOP"; -# Marker to exclude branch coverage but keep function and line coveage +# Marker to exclude branch coverage but keep function and line coverage our $EXCL_BR_START = "LCOV_EXCL_BR_START"; our $EXCL_BR_STOP = "LCOV_EXCL_BR_STOP"; +# Marker to exclude exception branch coverage but keep function, line coverage and non-exception branch coverage +our $EXCL_EXCEPTION_BR_START = "LCOV_EXCL_EXCEPTION_BR_START"; +our $EXCL_EXCEPTION_BR_STOP = "LCOV_EXCL_EXCEPTION_BR_STOP"; + # Compatibility mode values our $COMPAT_VALUE_OFF = 0; our $COMPAT_VALUE_ON = 1; @@ -268,11 +272,13 @@ our $gcno_split_crc; our $func_coverage = 1; our $br_coverage = 0; +our $no_exception_br = 0; our $rc_auto_base = 1; our $rc_intermediate = "auto"; our $intermediate; our $excl_line = "LCOV_EXCL_LINE"; our $excl_br_line = "LCOV_EXCL_BR_LINE"; +our $excl_exception_br_line = "LCOV_EXCL_EXCEPTION_BR_LINE"; our $cwd = `pwd`; chomp($cwd); @@ -339,10 +345,12 @@ "geninfo_adjust_src_path" => \$rc_adjust_src_path, "geninfo_auto_base" => \$rc_auto_base, "geninfo_intermediate" => \$rc_intermediate, + "geninfo_no_exception_branch" => \$no_exception_br, "lcov_function_coverage" => \$func_coverage, "lcov_branch_coverage" => \$br_coverage, "lcov_excl_line" => \$excl_line, "lcov_excl_br_line" => \$excl_br_line, + "lcov_excl_exception_br_line" => \$excl_exception_br_line, }); # Merge options @@ -372,7 +380,7 @@ $adjust_src_replace = $replace; } } - for my $regexp (($excl_line, $excl_br_line)) { + for my $regexp (($excl_line, $excl_br_line, $excl_exception_br_line)) { eval 'qr/'.$regexp.'/'; my $error = $@; chomp($error); @@ -476,8 +484,9 @@ } elsif ($rc_intermediate eq "1") { $intermediate = 1; } elsif (lc($rc_intermediate) eq "auto") { - # Use intermediate format if supported by gcov - $intermediate = ($gcov_caps->{'intermediate-format'} || + # Use intermediate format if supported by gcov and not conflicting with + # exception branch exclusion + $intermediate = (($gcov_caps->{'intermediate-format'} && !$no_exception_br) || $gcov_caps->{'json-format'}) ? 1 : 0; } else { die("ERROR: invalid value for geninfo_intermediate: ". @@ -491,6 +500,15 @@ "intermediate format - ignoring\n"); $opt_derive_func_data = 0; } + if ($no_exception_br && !$gcov_caps->{'json-format'}) { + die("ERROR: excluding exception branches is not compatible with ". + "text intermediate format\n"); + } +} + +if ($no_exception_br && ($gcov_version < $GCOV_VERSION_3_3_0)) { + die("ERROR: excluding exception branches is not compatible with ". + "gcov versions older than 3.3\n"); } # Determine gcov options @@ -1843,7 +1861,9 @@ my $exclude_flag = 0; my $exclude_line = 0; my $exclude_br_flag = 0; + my $exclude_exception_br_flag = 0; my $exclude_branch = 0; + my $exclude_exception_branch = 0; my $last_block = $UNNAMED_BLOCK; my $last_line = 0; local *INPUT; @@ -1913,6 +1933,13 @@ $exclude_branch = 0; } } + # Check for exclusion markers (exception branch exclude) + if (!$no_markers && + /($EXCL_EXCEPTION_BR_STOP|$EXCL_EXCEPTION_BR_START|$excl_exception_br_line)/) { + warn("WARNING: $1 found at $filename:$last_line but ". + "branch exceptions exclusion is not supported with ". + "gcov versions older than 3.3\n"); + } # Source code execution data if (/^\t\t(.*)$/) { @@ -1955,10 +1982,12 @@ # branches $last_line = $2; $last_block = $3; - } elsif (/^branch\s+(\d+)\s+taken\s+(\d+)/) { + } elsif (/^branch\s+(\d+)\s+taken\s+(\d+)(?:\s+\(([^)]*)\))?/) { next if (!$br_coverage); next if ($exclude_line); next if ($exclude_branch); + next if (($exclude_exception_branch || $no_exception_br) && + defined($3) && ($3 eq "throw")); $branches = br_gvec_push($branches, $last_line, $last_block, $1, $2); } elsif (/^branch\s+(\d+)\s+never\s+executed/) { @@ -2015,6 +2044,19 @@ $exclude_branch = 0; } } + # Check for exclusion markers (exception branch exclude) + if (!$no_markers) { + if (/$EXCL_EXCEPTION_BR_STOP/) { + $exclude_exception_br_flag = 0; + } elsif (/$EXCL_EXCEPTION_BR_START/) { + $exclude_exception_br_flag = 1; + } + if (/$excl_exception_br_line/ || $exclude_exception_br_flag) { + $exclude_exception_branch = 1; + } else { + $exclude_exception_branch = 0; + } + } # Strip unexecuted basic block marker $count =~ s/\*$//; @@ -2051,7 +2093,7 @@ } close(INPUT); - if ($exclude_flag || $exclude_br_flag) { + if ($exclude_flag || $exclude_br_flag || $exclude_exception_br_flag) { warn("WARNING: unterminated exclusion section in $filename\n"); } return(\@result, $branches, \@functions); @@ -2103,15 +2145,11 @@ sub read_intermediate_json($$$) { my ($gcov_filename, $data, $basedir_ref) = @_; - my $fd; my $text; my $json; - open($fd, "<:gzip", $gcov_filename) or - die("ERROR: Could not read $gcov_filename: $!\n"); - local $/; - $text = <$fd>; - close($fd); + gunzip($gcov_filename, \$text) or + die("ERROR: Could not read $gcov_filename: $GunzipError\n"); $json = decode_json($text); if (!defined($json) || !exists($json->{"files"}) || @@ -2122,6 +2160,12 @@ $$basedir_ref = $json->{"current_working_directory"}; + # Workaround for bug in MSYS GCC 9.x that encodes \ as \n in gcov JSON + # output + if ($^O eq "msys" && $$basedir_ref =~ /\n/) { + $$basedir_ref =~ s#\n#/#g; + } + for my $file (@{$json->{"files"}}) { my $filename = $file->{"file"}; @@ -2141,6 +2185,7 @@ # srcdata: filename -> [ excl, brexcl, checksums ] # excl: lineno -> 1 for all lines for which to exclude all data # brexcl: lineno -> 1 for all lines for which to exclude branch data +# 2 for all lines for which to exclude exception branch data # checksums: lineno -> source code checksum # # Note: To simplify processing, gcov data is not combined here, that is counts @@ -2159,6 +2204,12 @@ print($fd "TN:$test_name\n"); for my $filename (keys(%{$data})) { my ($excl, $brexcl, $checksums); + my $lines_found = 0; + my $lines_hit = 0; + my $functions_found = 0; + my $functions_hit = 0; + my $branches_found = 0; + my $branches_hit = 0; if (defined($srcdata->{$filename})) { ($excl, $brexcl, $checksums) = @{$srcdata->{$filename}}; @@ -2185,12 +2236,18 @@ # instances # b) an instance starts with an lcount line $branch_num = 0; + + $lines_found++; + $lines_hit++ if ($2 > 0); } elsif ($line =~ /^function:(\d+),(\d+),([^,]+)$/) { next if (!$func_coverage || $excl->{$1}); # function:<line>,<count>,<name> print($fd "FN:$1,$3\n"); print($fd "FNDA:$2,$3\n"); + + $functions_found++; + $functions_hit++ if ($2 > 0); } elsif ($line =~ /^function:(\d+),\d+,(\d+),([^,]+)$/) { next if (!$func_coverage || $excl->{$1}); @@ -2198,9 +2255,12 @@ # <name> print($fd "FN:$1,$3\n"); print($fd "FNDA:$2,$3\n"); + + $functions_found++; + $functions_hit++ if ($2 > 0); } elsif ($line =~ /^branch:(\d+),(taken|nottaken|notexec)/) { next if (!$br_coverage || $excl->{$1} || - $brexcl->{$1}); + (defined($brexcl->{$1}) && ($brexcl->{$1} == 1))); # branch:<line>,taken|nottaken|notexec if ($2 eq "taken") { @@ -2212,8 +2272,22 @@ } print($fd "BRDA:$1,0,$branch_num,$c\n"); $branch_num++; + + $branches_found++; + $branches_hit++ if ($2 eq "taken"); } } + + if ($functions_found > 0) { + printf($fd "FNF:%s\n", $functions_found); + printf($fd "FNH:%s\n", $functions_hit); + } + if ($branches_found > 0) { + printf($fd "BRF:%s\n", $branches_found); + printf($fd "BRH:%s\n", $branches_hit); + } + printf($fd "LF:%s\n", $lines_found); + printf($fd "LH:%s\n", $lines_hit); print($fd "end_of_record\n"); } } @@ -2230,6 +2304,7 @@ # srcdata: filename -> [ excl, brexcl, checksums ] # excl: lineno -> 1 for all lines for which to exclude all data # brexcl: lineno -> 1 for all lines for which to exclude branch data +# 2 for all lines for which to exclude exception branch data # checksums: lineno -> source code checksum # # Note: To simplify processing, gcov data is not combined here, that is counts @@ -2248,6 +2323,12 @@ for my $filename (keys(%{$data})) { my ($excl, $brexcl, $checksums); my $file_data = $data->{$filename}; + my $lines_found = 0; + my $lines_hit = 0; + my $functions_found = 0; + my $functions_hit = 0; + my $branches_found = 0; + my $branches_hit = 0; if (defined($srcdata->{$filename})) { ($excl, $brexcl, $checksums) = @{$srcdata->{$filename}}; @@ -2267,9 +2348,17 @@ print($fd "FN:$line,$name\n"); print($fd "FNDA:$count,$name\n"); + + $functions_found++; + $functions_hit++ if ($count > 0); } } + if ($functions_found > 0) { + printf($fd "FNF:%s\n", $functions_found); + printf($fd "FNH:%s\n", $functions_hit); + } + # Line data for my $d (@{$file_data->{"lines"}}) { my $line = $d->{"line_number"}; @@ -2294,24 +2383,39 @@ } print($fd "DA:$line,$count$c\n"); + $lines_found++; + $lines_hit++ if ($count > 0); + $branch_num = 0; # Branch data - if ($br_coverage && !$brexcl->{$line}) { + if ($br_coverage && (!defined($brexcl->{$line}) || + ($brexcl->{$line} != 1))) { for my $b (@$branches) { my $brcount = $b->{"count"}; + my $is_exception = $b->{"throw"}; - if (!defined($brcount) || $unexec) { - $brcount = "-"; + if (!$is_exception || ((!defined($brexcl->{$line}) || + ($brexcl->{$line} != 2)) && !$no_exception_br)) { + if (!defined($brcount) || $unexec) { + $brcount = "-"; + } + print($fd "BRDA:$line,0,$branch_num,". + "$brcount\n"); } - print($fd "BRDA:$line,0,$branch_num,". - "$brcount\n"); + $branches_found++; + $branches_hit++ if ($brcount ne "-" && $brcount > 0); $branch_num++; } } - } + if ($branches_found > 0) { + printf($fd "BRF:%s\n", $branches_found); + printf($fd "BRH:%s\n", $branches_hit); + } + printf($fd "LF:%s\n", $lines_found); + printf($fd "LH:%s\n", $lines_hit); print($fd "end_of_record\n"); } } @@ -2795,6 +2899,7 @@ my $flag = 0; my %brdata; my $brflag = 0; + my $exceptionbrflag = 0; my %checksums; local *HANDLE; @@ -2816,17 +2921,30 @@ } elsif (/$EXCL_BR_START/) { $brflag = 1; } + if (/$EXCL_EXCEPTION_BR_STOP/) { + $exceptionbrflag = 0; + } elsif (/$EXCL_EXCEPTION_BR_START/) { + $exceptionbrflag = 1; + } if (/$excl_br_line/ || $brflag) { $brdata{$.} = 1; + } elsif (/$excl_exception_br_line/ || $exceptionbrflag) { + $brdata{$.} = 2; } if ($checksum) { chomp(); $checksums{$.} = md5_base64($_); } + if ($intermediate && !$gcov_caps->{'json-format'} && + /($EXCL_EXCEPTION_BR_STOP|$EXCL_EXCEPTION_BR_START|$excl_exception_br_line)/) { + warn("WARNING: $1 found at $filename:$. but branch exceptions ". + "exclusion is not supported when using text intermediate ". + "format\n"); + } } close(HANDLE); - if ($flag || $brflag) { + if ($flag || $brflag || $exceptionbrflag) { warn("WARNING: unterminated exclusion section in $filename\n"); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/lcovrc new/lcov-1.15+git.20200812.d100e6c/lcovrc --- old/lcov-1.15+git.20200723.b668fab/lcovrc 2020-07-23 12:56:54.000000000 +0200 +++ new/lcov-1.15+git.20200812.d100e6c/lcovrc 2020-08-12 16:17:04.000000000 +0200 @@ -102,6 +102,12 @@ # Demangle C++ symbols #genhtml_demangle_cpp=1 +# Name of the tool used for demangling C++ function names +#genhtml_demangle_cpp_tool = c++filt + +# Specify extra parameters to be passed to the demangling tool +#genhtml_demangle_cpp_params = "" + # Location of the gcov tool (same as --gcov-info option of geninfo) #geninfo_gcov_tool = gcov @@ -137,6 +143,9 @@ # Use gcov intermediate format? Valid values are 0, 1, auto geninfo_intermediate = auto +# Specify if exception branches should be excluded from branch coverage. +geninfo_no_exception_branch = 0 + # Directory containing gcov kernel files # lcov_gcov_dir = /proc/gcov diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/man/gendesc.1 new/lcov-1.15+git.20200812.d100e6c/man/gendesc.1 --- old/lcov-1.15+git.20200723.b668fab/man/gendesc.1 2020-07-23 12:56:54.000000000 +0200 +++ new/lcov-1.15+git.20200812.d100e6c/man/gendesc.1 2020-08-12 16:17:04.000000000 +0200 @@ -1,4 +1,4 @@ -.TH gendesc 1 "LCOV 1.14" 2016\-12\-19 "User Manuals" +.TH gendesc 1 "LCOV 1.15" 2019\-02\-28 "User Manuals" .SH NAME gendesc \- Generate a test case description file .SH SYNOPSIS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/man/genhtml.1 new/lcov-1.15+git.20200812.d100e6c/man/genhtml.1 --- old/lcov-1.15+git.20200723.b668fab/man/genhtml.1 2020-07-23 12:56:54.000000000 +0200 +++ new/lcov-1.15+git.20200812.d100e6c/man/genhtml.1 2020-08-12 16:17:04.000000000 +0200 @@ -1,4 +1,4 @@ -.TH genhtml 1 "LCOV 1.14" 2018\-01\-30 "User Manuals" +.TH genhtml 1 "LCOV 1.15" 2019\-03\-04 "User Manuals" .SH NAME genhtml \- Generate HTML view from LCOV coverage data files .SH SYNOPSIS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/man/geninfo.1 new/lcov-1.15+git.20200812.d100e6c/man/geninfo.1 --- old/lcov-1.15+git.20200723.b668fab/man/geninfo.1 2020-07-23 12:56:54.000000000 +0200 +++ new/lcov-1.15+git.20200812.d100e6c/man/geninfo.1 2020-08-12 16:17:04.000000000 +0200 @@ -1,4 +1,4 @@ -.TH geninfo 1 "LCOV 1.14" 2017\-10\-10 "User Manuals" +.TH geninfo 1 "LCOV 1.15" 2020\-08\-07 "User Manuals" .SH NAME geninfo \- Generate tracefiles from .da files .SH SYNOPSIS @@ -123,6 +123,25 @@ line not part of this section. .RE .br +LCOV_EXCL_EXCEPTION_BR_LINE +.RS +Lines containing this marker will be excluded from exception branch coverage: +Exception branches will be ignored, but non-exception branches will not be +affected. +.br +.RE +LCOV_EXCL_EXCEPTION_BR_START +.RS +Marks the beginning of a section which is excluded from exception branch +coverage. The current line is part of this section. +.br +.RE +LCOV_EXCL_EXCEPTION_BR_STOP +.RS +Marks the end of a section which is excluded from exception branch coverage. +The current line not part of this section. +.RE +.br .SH OPTIONS @@ -307,6 +326,10 @@ will be interpreted as shell wildcard patterns (note that they may need to be escaped accordingly to prevent the shell from expanding them first). +Note: The pattern must be specified to match the +.B absolute +path of each source file. + Can be combined with the .B --include command line switch. If a given file matches both the include pattern and the @@ -366,6 +389,10 @@ .I patterns will be interpreted as shell wildcard patterns (note that they may need to be escaped accordingly to prevent the shell from expanding them first). + +Note: The pattern must be specified to match the +.B absolute +path of each source file. .RE .B \-\-ignore\-errors diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/man/genpng.1 new/lcov-1.15+git.20200812.d100e6c/man/genpng.1 --- old/lcov-1.15+git.20200723.b668fab/man/genpng.1 2020-07-23 12:56:54.000000000 +0200 +++ new/lcov-1.15+git.20200812.d100e6c/man/genpng.1 2020-08-12 16:17:04.000000000 +0200 @@ -1,4 +1,4 @@ -.TH genpng 1 "LCOV 1.14" 2016\-12\-19 "User Manuals" +.TH genpng 1 "LCOV 1.15" 2019\-02\-28 "User Manuals" .SH NAME genpng \- Generate an overview image from a source file .SH SYNOPSIS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/man/lcov.1 new/lcov-1.15+git.20200812.d100e6c/man/lcov.1 --- old/lcov-1.15+git.20200723.b668fab/man/lcov.1 2020-07-23 12:56:54.000000000 +0200 +++ new/lcov-1.15+git.20200812.d100e6c/man/lcov.1 2020-08-12 16:17:04.000000000 +0200 @@ -1,4 +1,4 @@ -.TH lcov 1 "LCOV 1.14" 2017\-10\-10 "User Manuals" +.TH lcov 1 "LCOV 1.15" 2020\-07\-31 "User Manuals" .SH NAME lcov \- a graphical GCOV front\-end .SH SYNOPSIS @@ -497,6 +497,10 @@ will be interpreted as shell wildcard patterns (note that they may need to be escaped accordingly to prevent the shell from expanding them first). +Note: The pattern must be specified to match the +.B absolute +path of each source file. + Can be combined with the .B --include command line switch. If a given file matches both the include pattern and the @@ -540,6 +544,10 @@ .I tracefile which matches at least one of those patterns will be extracted. +Note: The pattern must be specified to match the +.B absolute +path of each source file. + The result of the extract operation will be written to stdout or the tracefile specified with \-o. @@ -598,6 +606,10 @@ .I patterns will be interpreted as shell wildcard patterns (note that they may need to be escaped accordingly to prevent the shell from expanding them first). + +Note: The pattern must be specified to match the +.B absolute +path of each source file. .RE .B \-\-ignore\-errors @@ -799,6 +811,10 @@ .I tracefile which matches at least one of those patterns will be removed. +Note: The pattern must be specified to match the +.B absolute +path of each source file. + The result of the remove operation will be written to stdout or the tracefile specified with \-o. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/man/lcovrc.5 new/lcov-1.15+git.20200812.d100e6c/man/lcovrc.5 --- old/lcov-1.15+git.20200723.b668fab/man/lcovrc.5 2020-07-23 12:56:54.000000000 +0200 +++ new/lcov-1.15+git.20200812.d100e6c/man/lcovrc.5 2020-08-12 16:17:04.000000000 +0200 @@ -1,4 +1,4 @@ -.TH lcovrc 5 "LCOV 1.14" 2018\-01\-30 "User Manuals" +.TH lcovrc 5 "LCOV 1.15" 2020\-08\-07 "User Manuals" .SH NAME lcovrc \- lcov configuration file @@ -169,6 +169,16 @@ #genhtml_demangle_cpp=1 .br +# Name of the tool used for demangling C++ function names +.br +#genhtml_demangle_cpp_tool = c++filt +.br + +# Specify extra parameters to be passed to the demangling tool +.br +#genhtml_demangle_cpp_params = "" +.br + # Location of the gcov tool .br #geninfo_gcov_tool = gcov @@ -591,6 +601,32 @@ Default is 0. .PP +.BR genhtml_demangle_cpp_tool " =" +.I path_to_c++filt +.IP +Specify the location of the demangle tool (see +.BR c++filt (1)) +used to convert C++ internal function names to human readable format +for display on the HTML function overview page. +.br + +Default is 'c++filt'. +.PP + +.BR genhtml_demangle_cpp_params " =" +.I parameters +.IP +Specify extra parameters to be passed to the demangling tool + +Use this option if your environment requires additional parameters such +as --no-strip-underscore for correctly demangling C++ internal function +names. See also +.BR c++filt (1)). +.br + +Default is "". +.PP + .BR genhtml_desc_html " =" .IR 0 | 1 .IP @@ -813,6 +849,15 @@ Default is "auto". .PP +.BR geninfo_no_exception_branch " =" +.IR 0 | 1 +.IP +Specify whether to exclude exception branches from branch coverage. +.br + +Default is 0. +.PP + .BR lcov_gcov_dir " =" .I path_to_kernel_coverage_data .IP @@ -917,6 +962,15 @@ Default is 'LCOV_EXCL_BR_LINE'. .PP +.BR lcov_excl_exception_br_line " =" +.I expression +.IP +Specify the regular expression of lines to exclude from exception branch coverage. +.br + +Default is 'LCOV_EXCL_EXCEPTION_BR_LINE'. +.PP + .SH FILES .TP diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/rpm/lcov.spec new/lcov-1.15+git.20200812.d100e6c/rpm/lcov.spec --- old/lcov-1.15+git.20200723.b668fab/rpm/lcov.spec 2020-07-23 12:56:54.000000000 +0200 +++ new/lcov-1.15+git.20200812.d100e6c/rpm/lcov.spec 2020-08-12 16:17:04.000000000 +0200 @@ -1,6 +1,6 @@ Summary: A graphical GCOV front-end Name: lcov -Version: 1.14 +Version: 1.15 Release: 1 License: GPLv2+ Group: Development/Tools diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/tests/bin/checkdeps new/lcov-1.15+git.20200812.d100e6c/tests/bin/checkdeps --- old/lcov-1.15+git.20200723.b668fab/tests/bin/checkdeps 1970-01-01 01:00:00.000000000 +0100 +++ new/lcov-1.15+git.20200812.d100e6c/tests/bin/checkdeps 2020-08-12 16:17:04.000000000 +0200 @@ -0,0 +1,63 @@ +#!/usr/bin/env perl +# +# Copyright IBM Corp. 2020 +# +# Usage: checkdeps <perl-file1> [<perl-file2> ...] +# +# Check if all Perl modules required by the Perl programs specified on the +# command line are available. Note that this is a simple check that will only +# catch straight-forward use directives. +# +# Example: +# $ checkdeps file.pl file2.pl +# + +use strict; +use warnings; + +my $verbose = 0; + +sub check_file($) +{ + my ($file) = @_; + my $fd; + my $line; + my $rc = 0; + + open($fd, "<", $file) or die("Could not open $file: $!\n"); + $line = <$fd>; + + if ($line =~ /^#.*perl/) { + while ($line = <$fd>) { + my $module; + + # Look for ...use...module...; + next if ($line !~ /^\s*use\s+(\S+).*;\s*$/); + + $module = $1; + print("Checking for $module\n") if ($verbose); + if (!eval("require $module")) { + warn("Error: Missing Perl module '$module' ". + "required by $file\n"); + $rc = 1; + } + } + } + + close($fd); + + return $rc; +} + +sub main() +{ + my $rc = 0; + + for my $file (@ARGV) { + $rc = 1 if (check_file($file)); + } + + return $rc; +} + +exit(main()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/tests/bin/runtests new/lcov-1.15+git.20200812.d100e6c/tests/bin/runtests --- old/lcov-1.15+git.20200723.b668fab/tests/bin/runtests 2020-07-23 12:56:54.000000000 +0200 +++ new/lcov-1.15+git.20200812.d100e6c/tests/bin/runtests 2020-08-12 16:17:04.000000000 +0200 @@ -15,17 +15,19 @@ testsuite_init trap testsuite_exit exit + # Suppress test results on keyboard interrupt + trap "trap exit ; exit 1" SIGINT fi for TEST in ${TESTS} ; do if [[ -d "${TEST}" ]] ; then # Enter sub-directory - ${MAKE} -C "${TEST}" check + ${MAKE} -C "${TEST}" check || exit 1 else # Enter test ABS_TEST="$PWD/$TEST" REL_TEST="${ABS_TEST##$TOPDIR}" - test_run "${REL_TEST}" "${ABS_TEST}" </dev/null + test_run "${REL_TEST}" "${ABS_TEST}" </dev/null || exit 1 fi done diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/tests/bin/test_run new/lcov-1.15+git.20200812.d100e6c/tests/bin/test_run --- old/lcov-1.15+git.20200723.b668fab/tests/bin/test_run 2020-07-23 12:56:54.000000000 +0200 +++ new/lcov-1.15+git.20200812.d100e6c/tests/bin/test_run 2020-08-12 16:17:04.000000000 +0200 @@ -8,12 +8,17 @@ # test log file. Must be run after testsuite_init. # -TOPDIR=$(realpath $(dirname $0)/..) && source "$TOPDIR/bin/common" +trap 'echo ; exit 1' SIGINT + +[[ -z "$TOPDIR" ]] && TOPDIR=$(realpath $(dirname $0)/..) + +source "$TOPDIR/bin/common" + EXCERPTLEN=10 TESTNAME="$1" shift -TIME=$(which time 2>/dev/null) +TIME=$(type -P time 2>/dev/null) if [ ! -z "$TIME" ] ; then TIME="$TIME -v -o $TIMEFILE" if ! $TIME true 2>/dev/null ; then diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/tests/common.mak new/lcov-1.15+git.20200812.d100e6c/tests/common.mak --- old/lcov-1.15+git.20200723.b668fab/tests/common.mak 2020-07-23 12:56:54.000000000 +0200 +++ new/lcov-1.15+git.20200812.d100e6c/tests/common.mak 2020-08-12 16:17:04.000000000 +0200 @@ -43,15 +43,28 @@ # make TESTS=subdir MAKEOVERRIDES := $(filter-out TESTS=%,$(MAKEOVERRIDES)) -check: prepare +# Default target +check: runtests "$(MAKE)" $(TESTS) +ifeq ($(_ONCE),) + +# Do these only once during initialization +export _ONCE := 1 + +check: checkdeps prepare + +checkdeps: + checkdeps $(TOPDIR)/../bin/* $(TOPDIR)/bin/* + prepare: $(INFOFILES) $(COUNTFILES) # Create artificial info files as test data $(INFOFILES) $(COUNTFILES): cd $(TOPDIR) && mkinfo profiles/$(SIZE) -o src/ +endif + clean: clean_echo clean_subdirs clean_echo: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/tests/genhtml/Makefile new/lcov-1.15+git.20200812.d100e6c/tests/genhtml/Makefile --- old/lcov-1.15+git.20200723.b668fab/tests/genhtml/Makefile 2020-07-23 12:56:54.000000000 +0200 +++ new/lcov-1.15+git.20200812.d100e6c/tests/genhtml/Makefile 2020-08-12 16:17:04.000000000 +0200 @@ -1,6 +1,6 @@ include ../common.mak -TESTS := full.sh part1.sh part2.sh target.sh zero.sh +TESTS := full.sh part1.sh part2.sh target.sh zero.sh demangle.sh clean: - rm -rf *.log out_* + rm -rf *.log out_* *.tmp diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/tests/genhtml/demangle.sh new/lcov-1.15+git.20200812.d100e6c/tests/genhtml/demangle.sh --- old/lcov-1.15+git.20200723.b668fab/tests/genhtml/demangle.sh 1970-01-01 01:00:00.000000000 +0100 +++ new/lcov-1.15+git.20200812.d100e6c/tests/genhtml/demangle.sh 2020-08-12 16:17:04.000000000 +0200 @@ -0,0 +1,119 @@ +#!/usr/bin/env bash +# +# Check demangling options +# genhtml_demangle_cpp +# genhtml_demangle_cpp_tool +# genhtml_demangle_cpp_params +# + +OUTDIR="out_demangle" +STDOUT="demangle_stdout.log" +STDERR="demangle_stderr.log" +INFO="demangle.info.tmp" +SOURCE="file.tmp" +HTML="${OUTDIR}/genhtml/${SOURCE}.func.html" +MYFILT="${PWD}/mycppfilt.sh" + +function die() { + echo "Error: $*" >&2 + exit 1 +} + +function cleanup() { + rm -rf "${OUTDIR}" "${INFO}" "${SOURCE}" +} + +function prepare() { + cat >"${INFO}" <<EOF +SF:$SOURCE +FN:1,myfunc1 +FN:2,_Z7myfunc2v +FN:3,__Z7myfunc3v +DA:1,1 +end_of_record +EOF + touch "${SOURCE}" +} + +function run() { + local CMDLINE="${GENHTML} ${INFO} -o ${OUTDIR} $*" + + rm -rf "${OUTDIR}" + + # Run genhtml + echo "CMDLINE: $CMDLINE" + $CMDLINE >${STDOUT} 2>${STDERR} + RC=$? + + echo "STDOUT_START" + cat ${STDOUT} + echo "STDOUT_STOP" + + echo "STDERR_START" + cat ${STDERR} + echo "STDERR_STOP" + + # Check exit code + [[ $RC -ne 0 ]] && die "Non-zero genhtml exit code $RC" + + # Output must not contain warnings + if [[ -s ${STDERR} ]] ; then + echo "Error: Output on stderr.log:" + cat ${STDERR} + exit 1 + fi + + # Log function names + echo "Found function names:" + grep coverFn ${HTML} +} + +prepare + +echo "Run 1: No demangling" +run "" +if grep -q myfunc1 ${HTML} ; then + echo "Success - found myfunc1" +else + die "Missing function name 'myfunc1' in output" +fi + +echo +echo "Run 2: Demangle using defaults" +if type -P c++filt >/dev/null ; then + # Depending on environment, encoded symbols are converted to either + # myfunc2() or myfunc3() + run "--demangle-cpp" + if grep -q 'myfunc[23]()' ${HTML} ; then + echo "Success - found myfunc[23]() converted by c++filt" + else + die "Missing converted function name 'myfunc[23]()' in output" + fi +else + echo "Skipping - missing c++filt tool" +fi + +echo +echo "Run 3: Demangle using custom demangling tool" +# mycppfilt.sh with no parameters prepends aaa to each function name +run "--demangle-cpp --rc genhtml_demangle_cpp_tool=$MYFILT" +if grep -q 'aaamyfunc' ${HTML} ; then + echo "Success - found myfunc prefixed by mycppfilt.sh" +else + die "Missing converted function name 'aaamyfunc' in output" +fi + +echo +echo "Run 4: Demangle with params set" +# mycppfilt.sh with parameter prepends that parameter to to each function name +run "--demangle-cpp --rc genhtml_demangle_cpp_tool=$MYFILT --rc genhtml_demangle_cpp_params='bbb'" +if grep -q 'bbbmyfunc' ${HTML} ; then + echo "Success - found myfunc prefixed by custom prefix" +else + die "Missing converted function name 'bbbmyfunc' in output" +fi + +# Success +cleanup + +exit 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lcov-1.15+git.20200723.b668fab/tests/genhtml/mycppfilt.sh new/lcov-1.15+git.20200812.d100e6c/tests/genhtml/mycppfilt.sh --- old/lcov-1.15+git.20200723.b668fab/tests/genhtml/mycppfilt.sh 1970-01-01 01:00:00.000000000 +0100 +++ new/lcov-1.15+git.20200812.d100e6c/tests/genhtml/mycppfilt.sh 2020-08-12 16:17:04.000000000 +0200 @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# +# Dummy c++filt replacement for testing purpose +# + +# Skip over any valid options +while [[ $1 =~ ^- ]] ; do + shift +done + +if [[ -n "$*" ]] ; then + PREFIX="$*" +else + PREFIX="aaa" +fi + +while read LINE ; do + echo "${PREFIX}${LINE}" + unset LINE +done + +# Last line isn't newline-terminated +[[ -n "${LINE}" ]] && echo "${PREFIX}${LINE}" + +exit 0