Combine query filters instead of combining them

This commit is contained in:
2026-08-05 19:20:31 +02:00
parent 54c28d703a
commit 84babe540d
+11 -7
View File
@@ -140,12 +140,11 @@ sub get_default_configs {
} }
sub build_filter_clause { sub build_filter_clause {
my ( $experiment_dir, $config_name ) = @_; my ( $experiment_dir, @config_names ) = @_;
return "" unless defined $config_name && length($config_name) > 0; # Drop empty ones, rest is combined
@config_names = grep { defined && length } @config_names;
my $regions = $CONFIGS{$config_name}{regions}; return "" unless @config_names;
return "" unless defined $regions;
return "" return ""
unless defined $experiment_dir && -f "$experiment_dir/system.elf"; unless defined $experiment_dir && -f "$experiment_dir/system.elf";
@@ -153,17 +152,21 @@ sub build_filter_clause {
my $elf = "$experiment_dir/system.elf"; my $elf = "$experiment_dir/system.elf";
my @filters; my @filters;
for my $config_name (@config_names) {
my $regions = $CONFIGS{$config_name}{regions};
next unless defined $regions;
for my $region (@$regions) { for my $region (@$regions) {
my ( $start, $end, $col ); my ( $start, $end, $col );
if ( ref($region) eq 'HASH' ) { if ( ref($region) eq 'HASH' ) {
# Single-function form: resolve [start, end) via symbol + size. # resolve [start, end) via symbol + size
$col = $region->{col}; $col = $region->{col};
( $start, $end ) = Util::elf_sym_range( $elf, $region->{func} ); ( $start, $end ) = Util::elf_sym_range( $elf, $region->{func} );
} }
else { else {
# Linker-range form: [start_sym, end_sym, col]. # [start_sym, end_sym, col]
my ( $start_sym, $end_sym ); my ( $start_sym, $end_sym );
( $start_sym, $end_sym, $col ) = @$region; ( $start_sym, $end_sym, $col ) = @$region;
$start = Util::elf_sym_addr( $elf, $start_sym ); $start = Util::elf_sym_addr( $elf, $start_sym );
@@ -173,6 +176,7 @@ sub build_filter_clause {
next unless defined $start && defined $end && $end > $start; next unless defined $start && defined $end && $end > $start;
push @filters, "$col NOT BETWEEN $start AND @{[$end - 1]}"; push @filters, "$col NOT BETWEEN $start AND @{[$end - 1]}";
} }
}
return "" unless @filters; return "" unless @filters;
return "\nAND " . join( "\nAND ", @filters ); return "\nAND " . join( "\nAND ", @filters );