[PATCH 05/17] scripts/code_cov_parse_info: add a tool to analyze branch coverage

Kamil Konieczny kamil.konieczny at linux.intel.com
Thu Feb 15 16:40:10 UTC 2024


Hi Mauro,
On 2024-02-15 at 11:27:14 +0100, Mauro Carvalho Chehab wrote:
> From: Mauro Carvalho Chehab <mchehab at kernel.org>
> 
> Branch coverage is trickier than functions. Add a tool that displays
> the starting line that it is not being covered, together with up
> to 10 context lines before.
> 
> Signed-off-by: Mauro Carvalho Chehab <mchehab at kernel.org>

Acked-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>

> ---
>  scripts/code_cov_parse_info | 86 ++++++++++++++++++++++++++++++++++++-
>  1 file changed, 85 insertions(+), 1 deletion(-)
> 
> diff --git a/scripts/code_cov_parse_info b/scripts/code_cov_parse_info
> index f0fb5716a6ca..1be7fddf3f3e 100755
> --- a/scripts/code_cov_parse_info
> +++ b/scripts/code_cov_parse_info
> @@ -879,6 +879,77 @@ sub generate_report($)
>  	close OUT;
>  }
>  
> +sub check_source_branches()
> +{
> +	foreach my $source (sort keys(%all_branch)) {
> +		next if (!$used_source{$source});
> +		next if (is_file_excluded($source));
> +
> +		my @lines;
> +		foreach my $where (sort keys %{$all_branch{$source}}) {
> +			my $taken = $all_branch{$source}{$where};
> +			next if ($taken > 0);
> +
> +			next if !($where =~ m/^(-?\d+),(-?\d+),(-?\d+)/);
> +
> +			my ($ln, $block, $branch, $ctx_lines);
> +			$ln = $1;
> +			$block = $2;
> +			$branch = $3;
> +
> +			if (!@lines) {
> +				open IN, "$source" || die "File $source not found. Can't check branches\n";
> +				@lines = <IN>;
> +				close IN;
> +			}
> +
> +			if ($ln >= $#lines) {
> +				die "$source:$ln line is bigger than the number of lines at the file ($#lines lines)\n";
> +				return;
> +			}
> +
> +			my $func = $all_branch{$source}{$where}{func};
> +			my $func_ln = $all_branch{$source}{$where}{func_ln};
> +
> +			print "Branch $source:$ln, ";
> +			if ($func) {
> +				if ($func_ln) {
> +					print "func: $func, ";
> +				} else {
> +					print "func: $func:$func_ln, ";
> +				}
> +			}
> +			print "block $block, branch $branch not taken:\n";
> +
> +			if ($func_ln) {
> +				$ctx_lines = $ln - $func_ln;
> +			} else {
> +				$ctx_lines = 10;
> +			}
> +
> +
> +			# Search for up to $ctx_lines before the occurrence
> +			my $context = "";
> +			my $has_if;
> +			$ln-- if ($ln > 0);
> +			my $delim = "->";
> +			for (my $if_ln = $ln; $if_ln >= 0 && (($ln - $if_ln) < $ctx_lines); $if_ln--) {
> +				$context = "$if_ln$delim\t$lines[$if_ln]" . $context;
> +				$delim = "";
> +				if ($lines[$if_ln] =~ m/(\bif\b|#if)/) {
> +					$has_if = 1;
> +					last;
> +				}
> +			}
> +			if ($has_if) {
> +				print $context;
> +			} else {
> +				print "$ln->\t$lines[$ln]";
> +			}
> +		}
> +	}
> +}
> +
>  #
>  # Argument handling
>  #
> @@ -896,6 +967,7 @@ my $show_lines;
>  my $only_i915;
>  my $only_xe;
>  my $only_drm;
> +my $check_branches;
>  
>  GetOptions(
>  	"print-coverage|print_coverage|print|p" => \$print_used,
> @@ -916,6 +988,7 @@ GetOptions(
>  	"show-files|show_files" => \$show_files,
>  	"show-lines|show_lines" => \$show_lines,
>  	"report|r=s" => \$gen_report,
> +	"check-branches" => \$check_branches,
>  	"css-file|css|c=s" => \$css_file,
>  	"title|t=s" => \$title,
>  	"html-prolog|prolog=s" => \$html_prolog,
> @@ -933,7 +1006,7 @@ if ($#ARGV < 0) {
>  }
>  
>  # At least one action should be specified
> -pod2usage(1) if (!$print_used && !$filter && !$stat && !$print_unused && !$gen_report);
> +pod2usage(1) if (!$print_used && !$filter && !$stat && !$print_unused && !$gen_report && !$check_branches);
>  
>  pod2usage(1) if ($gen_report && ($print_used || $filter || $stat || $print_unused));
>  
> @@ -1024,6 +1097,11 @@ if ($gen_report) {
>  
>  gen_stats();
>  
> +
> +if ($check_branches) {
> +	check_source_branches();
> +}
> +
>  die "Nothing counted. Wrong input files?" if (!$stats{"all_files"});
>  
>  print_code_coverage($print_used, $print_unused, $show_lines);
> @@ -1294,6 +1372,12 @@ This option is automaticaly enabled when B<--func-filters> is used.
>  Shows the list of files that were used to produce the code coverage
>  results.
>  
> +=item B<--check-branches>
> +
> +Checks at the Linux Kernel source files what's the contents of the
> +branches that weren't taken. The directory should match what's
> +stored inside the info files.
> +
>  =item B<--verbose> or B<-v>
>  
>  Prints the name of each parsed file.
> -- 
> 2.43.0
> 


More information about the igt-dev mailing list