package Queries::FaultsFiltered; use strict; use warnings; use diagnostics; use FindBin; use lib "$FindBin::Bin/../Modules"; use Util; use feature 'say'; # Those regions from linker.ld will be excluded my @EXCLUDE_REGIONS = ( [ '_wamr_aot_start', '_wamr_aot_end' ], # [ '_wamr_mmap_start', '_wamr_mmap_end' ], # [ '_wamr_global_heap_start', '_wamr_global_heap_end' ], # [ '_wamr_runtime_pool_start', '_wamr_runtime_pool_end' ], # [ '_wamr_linear_pool_start', '_wamr_linear_pool_end' ], ); sub query { my ( $experiment, $experiment_dir ) = @_; my @filters; if ( defined $experiment_dir && -f "$experiment_dir/system.elf" ) { for my $pair (@EXCLUDE_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]}"; } } my $extra = @filters ? "\nAND " . join( "\nAND ", @filters ) : ""; my $querystring = "SELECT benchmark, resulttype, SUM(t.time2 - t.time1 + 1) AS faults, CONCAT('0x', HEX(p.injection_instr_absolute)) AS fault_address FROM variant v JOIN trace t ON v.id = t.variant_id JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_physical_address = t.data_physical_address JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id JOIN fsppilot p ON r.pilot_id = p.id WHERE v.variant = '$experiment'$extra GROUP BY benchmark, resulttype, p.injection_instr_absolute ORDER BY benchmark, resulttype, SUM(t.time2 - t.time1 + 1) DESC;"; say $querystring; return $querystring; } sub args { return "--batch --raw"; } sub filename { return "faults_filtered.csv"; } sub postprocess { $_[0] =~ s/\t/,/g; } 1;