package Modules::Filters; use strict; use warnings; use diagnostics; use FindBin; use lib $FindBin::Bin; use Util; my %CONFIGS = ( no_aot => { label => "Exclude WAMR AOT array", regions => [ [ '_wamr_aot_start', '_wamr_aot_end' ] ], }, no_mmap => { label => "Exclude WAMR mmap", regions => [ [ '_wamr_mmap_start', '_wamr_mmap_end' ] ], }, no_runtime_pool => { label => "Exclude WAMR runtime pool", regions => [ [ '_wamr_runtime_pool_start', '_wamr_runtime_pool_end' ] ], }, no_linear_pool => { label => "Exclude WAMR linear pool", regions => [ [ '_wamr_linear_pool_start', '_wamr_linear_pool_end' ] ], }, no_global_heap => { label => "Exclude WAMR global heap", regions => [ [ '_wamr_global_heap_start', '_wamr_global_heap_end' ] ], }, ); # Those will be executed automatically by runner.pl (+ no filter at all) my @DEFAULT_CONFIGS = ('no_aot'); sub get_configs { return \%CONFIGS; } sub get_default_configs { return @DEFAULT_CONFIGS; } sub build_filter_clause { my ( $experiment_dir, $config_name ) = @_; return "" unless defined $config_name && length($config_name) > 0; my $regions = $CONFIGS{$config_name}{regions}; return "" unless defined $regions; return "" unless defined $experiment_dir && -f "$experiment_dir/system.elf"; my @filters; for my $pair (@$regions) { my ( $start_sym, $end_sym ) = @$pair; my $start = Util::elf_sym_addr( "$experiment_dir/system.elf", $start_sym ); my $end = Util::elf_sym_addr( "$experiment_dir/system.elf", $end_sym ); next unless defined $start && defined $end && $end > $start; push @filters, "p.injection_instr_absolute NOT BETWEEN $start AND @{[$end - 1]}"; } return "" unless @filters; return "\nAND " . join( "\nAND ", @filters ); } 1;