Combine query filters instead of combining them
This commit is contained in:
+25
-21
@@ -140,12 +140,11 @@ sub get_default_configs {
|
||||
}
|
||||
|
||||
sub build_filter_clause {
|
||||
my ( $experiment_dir, $config_name ) = @_;
|
||||
my ( $experiment_dir, @config_names ) = @_;
|
||||
|
||||
return "" unless defined $config_name && length($config_name) > 0;
|
||||
|
||||
my $regions = $CONFIGS{$config_name}{regions};
|
||||
return "" unless defined $regions;
|
||||
# Drop empty ones, rest is combined
|
||||
@config_names = grep { defined && length } @config_names;
|
||||
return "" unless @config_names;
|
||||
|
||||
return ""
|
||||
unless defined $experiment_dir && -f "$experiment_dir/system.elf";
|
||||
@@ -153,25 +152,30 @@ sub build_filter_clause {
|
||||
my $elf = "$experiment_dir/system.elf";
|
||||
|
||||
my @filters;
|
||||
for my $region (@$regions) {
|
||||
my ( $start, $end, $col );
|
||||
for my $config_name (@config_names) {
|
||||
my $regions = $CONFIGS{$config_name}{regions};
|
||||
next unless defined $regions;
|
||||
|
||||
if ( ref($region) eq 'HASH' ) {
|
||||
for my $region (@$regions) {
|
||||
my ( $start, $end, $col );
|
||||
|
||||
# Single-function form: resolve [start, end) via symbol + size.
|
||||
$col = $region->{col};
|
||||
( $start, $end ) = Util::elf_sym_range( $elf, $region->{func} );
|
||||
if ( ref($region) eq 'HASH' ) {
|
||||
|
||||
# resolve [start, end) via symbol + size
|
||||
$col = $region->{col};
|
||||
( $start, $end ) = Util::elf_sym_range( $elf, $region->{func} );
|
||||
}
|
||||
else {
|
||||
# [start_sym, end_sym, col]
|
||||
my ( $start_sym, $end_sym );
|
||||
( $start_sym, $end_sym, $col ) = @$region;
|
||||
$start = Util::elf_sym_addr( $elf, $start_sym );
|
||||
$end = Util::elf_sym_addr( $elf, $end_sym );
|
||||
}
|
||||
|
||||
next unless defined $start && defined $end && $end > $start;
|
||||
push @filters, "$col NOT BETWEEN $start AND @{[$end - 1]}";
|
||||
}
|
||||
else {
|
||||
# Linker-range form: [start_sym, end_sym, col].
|
||||
my ( $start_sym, $end_sym );
|
||||
( $start_sym, $end_sym, $col ) = @$region;
|
||||
$start = Util::elf_sym_addr( $elf, $start_sym );
|
||||
$end = Util::elf_sym_addr( $elf, $end_sym );
|
||||
}
|
||||
|
||||
next unless defined $start && defined $end && $end > $start;
|
||||
push @filters, "$col NOT BETWEEN $start AND @{[$end - 1]}";
|
||||
}
|
||||
|
||||
return "" unless @filters;
|
||||
|
||||
Reference in New Issue
Block a user