[igt-dev] [PATCH 11/12] code_cov_parse_info: add support for exclude filters

Andrzej Hajda andrzej.hajda at intel.com
Mon Apr 11 12:28:24 UTC 2022



On 04.04.2022 08:26, Mauro Carvalho Chehab wrote:
> From: Mauro Carvalho Chehab <mchehab at kernel.org>
>
> It is interesting to have support not only for including, but
> also for excluding functions and files. Also, it is trivial to
> have support for it.
>
> Signed-off-by: Mauro Carvalho Chehab <mchehab at kernel.org>
> ---
>   scripts/code_cov_parse_info | 71 +++++++++++++++++++++++++++++++++----
>   1 file changed, 65 insertions(+), 6 deletions(-)
>
> diff --git a/scripts/code_cov_parse_info b/scripts/code_cov_parse_info
> index 7987b0068e88..9624dc33468d 100755
> --- a/scripts/code_cov_parse_info
> +++ b/scripts/code_cov_parse_info
> @@ -17,8 +17,10 @@ my %used_source;
>   my %record;
>   my %files;
>   my @func_regexes;
> +my @func_exclude_regexes;
>   my %test_names;
>   my @src_regexes;
> +my @src_exclude_regexes;
>   
>   my $verbose = 0;
>   my $ignore_unused = 0;
> @@ -28,10 +30,16 @@ my $skip_func = 0;
>   
>   sub is_function_excluded($)
>   {
> -	return 0 if (!@func_regexes);
> +	return 0 if (!@func_regexes && !@func_exclude_regexes);
>   
>   	my $func = shift;
>   
> +	foreach my $r (@func_exclude_regexes) {
> +		return 1 if ($func =~ m/$r/);
> +	}
> +
> +	return 0 if (!@func_regexes);
> +
>   	foreach my $r (@func_regexes) {
>   		return 0 if ($func =~ m/$r/);
>   	}
> @@ -64,9 +72,13 @@ sub filter_file($)
>   		}
>   	}
>   
> -	return 0 if (!@src_regexes);
> +	return 0 if (!@src_regexes && !@src_exclude_regexes);
>   
> -	my $func = shift;
> +	foreach my $r (@src_exclude_regexes) {
> +		return 1 if ($s =~ m/$r/);
> +	}
> +
> +	return 0 if (!@src_regexes);
>   
>   	foreach my $r (@src_regexes) {
>   		return 0 if ($s =~ m/$r/);
> @@ -482,7 +494,9 @@ my $filter;
>   my $help;
>   my $man;
>   my $func_filters;
> +my $func_exclude;
>   my $src_filters;
> +my $src_exclude;
>   my $show_files;
>   my $show_lines;
>   
> @@ -496,7 +510,9 @@ GetOptions(
>   	"only-i915|only_i915" => \$only_i915,
>   	"only-drm|only_drm" => \$only_drm,
>   	"func-filters|f=s" => \$func_filters,
> +	"exclude-func=s" => \$func_exclude,
>   	"source-filters|S=s" => \$src_filters,
> +	"exclude-source=s" => \$src_exclude,
>   	"show-files|show_files" => \$show_files,
>   	"show-lines|show_lines" => \$show_lines,
>   	"help" => \$help,
> @@ -539,7 +555,29 @@ if ($src_filters) {
>   	close IN;
>   }
>   
> -$ignore_unused = 1 if (@func_regexes);
> +if ($func_exclude) {
> +	open IN, $func_exclude or die "Can't open $func_exclude";
> +	while (<IN>) {
> +		s/^\s+//;
> +		s/\s+$//;
> +		next if (m/^#/ || m/^$/);
> +		push @func_exclude_regexes, qr /$_/;
> +	}
> +	close IN;
> +}
> +
> +if ($src_exclude) {
> +	open IN, $src_exclude or die "Can't open $src_exclude";
> +	while (<IN>) {
> +		s/^\s+//;
> +		s/\s+$//;
> +		next if (m/^#/ || m/^$/);
> +		push @src_exclude_regexes, qr /$_/;
> +	}
> +	close IN;
> +}
> +

Now there are four loops with the same purpose, I think it is time to 
put common code into one routine.

> +$ignore_unused = 1 if (@func_regexes || @func_exclude_regexes);
>   
>   if ($only_i915) {
>   	$filter_str = " non-i915 files";
> @@ -552,7 +590,7 @@ if ($only_drm) {
>   	$has_filter = 1;
>   }
>   
> -if (@func_regexes) {
> +if (@func_regexes || @func_exclude_regexes) {
>   	$filter_str .= "," if ($filter_str ne "");
>   	$filter_str .= " unmatched functions";
>   	foreach my $r (@func_regexes) {
> @@ -562,7 +600,7 @@ if (@func_regexes) {
>   	$has_filter = 1;
>   }
>   
> -if (@src_regexes) {
> +if (@src_regexes || @src_exclude_regexes) {
>   	$filter_str .= "," if ($filter_str ne "");
>   	$filter_str .= " unmatched source files";
>   	foreach my $r (@src_regexes) {
> @@ -708,11 +746,32 @@ the regular expressions contained at the B<[filter's file]>.
>   When this filter is used, B<--ignore-unused> will be automaticaly enabled,
>   as the final goal is to report per-function usage, and not per-file.
>   
> +When used with B<--exclude-func>, exclusions take precedence.
> +
> +=item B<--exclude-func>  B<[filter's file]>
> +
> +Exclude all functions that match the regular expressions contained
> +at the B<[filter's file]>.
> +
> +When this filter is used, B<--ignore-unused> will be automaticaly enabled,
> +as the final goal is to report per-function usage, and not per-file.
> +
> +When used with B<--func-filters>, exclusions take precedence.
> +
>   =item B<--source-filters>  B<[filter's file]> or B<-S>  B<[filter's file]>
>   
>   Takes into account only the code coverage for the source files that match
>   the regular expressions contained at the B<[filter's file]>.
>   
> +When used with B<--exclude-source>, exclusions take precedence.
> +
> +=item B<--exclude-source> B<[filter's file]>
> +
> +Exclude all files that match the regular expressions contained
> +at the B<[filter's file]>.
> +
> +When used with B<--source-filters>, exclusions take precedence.
> +

Now there are two filtering options per functions and two per files.
Wouldn't be better to squash include/exclude rules into one param in 
'rsync like' patterns:
+ include_pattern
- exclude_pattern
...
This way it would be easier to manage filters - less options, less 
helper files.

One could think about squashing also filters for function and files, but 
this I am not sure.


Regards
Andrzej


>   =item B<--ignore-unused> or B<--ignore_unused>
>   
>   Filters out unused C files and headers from the code coverage results.



More information about the igt-dev mailing list