diff --git a/scripts/Modules/Filters.pm b/scripts/Modules/Filters.pm index 17ae6f5..9fd3193 100644 --- a/scripts/Modules/Filters.pm +++ b/scripts/Modules/Filters.pm @@ -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;