package Mnemonics; use strict; use warnings; use diagnostics; use FindBin; use lib "$FindBin::Bin/../Modules"; use Filters; use feature 'say'; sub query { my ( $experiment, $experiment_dir, @filter_config_names ) = @_; my $filters = Filters::build_filter_clause( $experiment_dir, @filter_config_names ); # The fspgroup/fsppilot joins are only needed for the filters my $filter_joins = ""; if ( $filters =~ /\b(?:g|p)\./ ) { $filter_joins .= "\nLEFT JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_physical_address = t.data_physical_address"; } if ( $filters =~ /\bp\./ ) { $filter_joins .= "\nLEFT JOIN fsppilot p ON p.id = g.pilot_id"; } my $querystring = "SELECT CASE WHEN o.disassemble IS NOT NULL AND SUBSTRING_INDEX(TRIM(o.disassemble), ' ', 1) REGEXP '^[a-zA-Z][a-zA-Z0-9 ]*\$' THEN SUBSTRING_INDEX(TRIM(o.disassemble), ' ', 1) ELSE NULL END AS mnemonic, COUNT(DISTINCT t.instr2, t.data_physical_address) AS count FROM variant v JOIN trace t ON v.id = t.variant_id$filter_joins JOIN objdump o ON o.variant_id = v.id AND o.instr_address = t.instr2_absolute WHERE t.accesstype = 'R' AND v.variant = '$experiment'$filters GROUP BY mnemonic ORDER BY count DESC;"; say $querystring; return $querystring; } sub args { return "--batch --raw"; } sub filename { my @filter_config_names = grep { defined && length } @_; my $suffix = @filter_config_names ? "_" . join( "+", sort @filter_config_names ) : ""; return "mnemonics${suffix}.csv"; } sub postprocess { $_[0] =~ s/\t/,/g; } 1;