Generate query and results and charts in separate directory

This commit is contained in:
2026-09-15 17:38:52 +02:00
parent 428d36e529
commit c5ec776d87
4 changed files with 88 additions and 48 deletions
+55 -33
View File
@@ -27,7 +27,9 @@ my $local_wamr = "$local_root/wamr";
my $local_scripts_dir = "$local_root/scripts";
my $local_builds_dir = "$local_root/builds";
my $local_archive_dir = "$local_root/injections";
my $local_queries_dir = "$local_root/queries";
my $local_charts_dir = "$local_root/scripts/charts";
my $local_charts_out_dir = "$local_root/charts";
my $local_ghidra_projects = "$local_root/ghidra";
my $local_ghidra_scripts = "$local_root/scripts/ghidra";
my $local_dump_dir = "$local_root/dumps";
@@ -154,9 +156,12 @@ my %handlers = (
? " (" . join( "+", @filter_configs ) . ")"
: "";
say "Running $query$config_label on $db...";
Util::execute_query( $experiment,
$query, $local_db_conf, $local_archive_dir, 0,
@filter_configs );
Util::execute_query(
$experiment, $query,
$local_db_conf, "$local_archive_dir/$experiment",
$local_queries_dir, "${experiment}_",
0, @filter_configs
);
}
}
},
@@ -195,6 +200,12 @@ my %handlers = (
foreach (@selected_dirs) {
my $experiment = $_ =~ s/(.*?)\s+\(.+\)$/$1/r;
my $faults_csv = "$local_queries_dir/${experiment}_faults.csv";
unless ( -f $faults_csv ) {
say "Skipping $experiment: $faults_csv does not exist";
next;
}
say "Creating Ghidra project for $experiment...";
system(
'ghidra-analyzeHeadless',
@@ -205,7 +216,7 @@ my %handlers = (
'-postScript', 'DWARFLineInfoSourceMapScript',
'-postScript', 'DWARFLineInfoCommentScript',
'-postScript', 'ImportMarkersAsBookmarks',
"$local_archive_dir/$experiment/faults.csv"
$faults_csv
);
}
},
@@ -238,19 +249,17 @@ my %handlers = (
);
# Insert results
if (
-f "$local_archive_dir/$experiment/results_no_native_call_data+no_native_call_instr.txt"
)
{
open( my $fhandle, '<',
"$local_archive_dir/$experiment/results_no_native_call_data+no_native_call_instr.txt"
) or return;
my $results_txt =
"$local_queries_dir/${experiment}_results_no_native_call_data+no_native_call_instr.txt";
if ( -f $results_txt ) {
open( my $fhandle, '<', $results_txt ) or return;
my $results = join "", <$fhandle>;
close($fhandle);
# Append link to results file
system( 'obsidian', 'append', "file=zettel/$experiment",
"content=## Results\n\n[Results File](file://$local_archive_dir/$experiment/results_no_native_call_data+no_native_call_instr.txt)\n\n"
"content=## Results\n\n[Results File](file://$results_txt)\n\n"
);
# Append results as markdown block
@@ -260,8 +269,7 @@ my %handlers = (
);
}
else {
say
"$local_archive_dir/$experiment/results_no_native_call_data+no_native_call_instr.txt does not exist";
say "$results_txt does not exist";
}
# Insert charts
@@ -273,9 +281,15 @@ my %handlers = (
my $attach_image = sub {
my ($name) = @_;
my $image = "$local_charts_out_dir/${experiment}_$name.svg";
unless ( -f $image ) {
say "$image does not exist";
return;
}
system( 'obsidian', 'append', "file=zettel/$experiment",
"content=![$name](file://$local_archive_dir/$experiment/$name.svg)\n"
);
"content=![$name](file://$image)\n" );
};
$attach_image->(
"single_result_no_native_call_data+no_native_call_instr");
@@ -292,8 +306,7 @@ my %handlers = (
# TODO: Fails silently if not every selected experiment has this datafile
my $resultsdata_csv =
Util::pick_data_file( "$local_archive_dir/$selected_experiments[0]",
"resultsdata" );
Util::pick_query_file( $selected_experiments[0], "resultsdata" );
# Read results
my %all_results;
@@ -301,7 +314,7 @@ my %handlers = (
# Schema: benchmark, resulttype, faults
my $data = Text::CSV_XS::csv(
in => "$local_archive_dir/$experiment/$resultsdata_csv",
in => "$local_queries_dir/${experiment}_$resultsdata_csv",
headers => 'auto'
);
@@ -365,13 +378,13 @@ my %handlers = (
#
# # TODO: Fails silently if not every selected experiment has this datafile
# my $resultsdata_csv =
# Util::pick_data_file( "$local_archive_dir/$baseline", "resultsdata" );
# Util::pick_query_file( $baseline, "resultsdata" );
#
# my %all_results;
# foreach my $experiment ( $baseline, @selected_experiments ) {
#
# my $data = Text::CSV_XS::csv(
# in => "$local_archive_dir/$experiment/$resultsdata_csv",
# in => "$local_queries_dir/${experiment}_$resultsdata_csv",
# headers => 'auto'
# );
#
@@ -728,29 +741,35 @@ my %handlers = (
# Select if faults.csv or a filtered variant should be used
my $faults_csv;
if (@faults_charts) {
$faults_csv = Util::pick_data_file(
"$local_archive_dir/$selected_experiments[0]", "faults" );
$faults_csv =
Util::pick_query_file( $selected_experiments[0], "faults" );
}
# Select if resultsdata.csv or a filtered variant should be used
my $resultsdata_csv;
if (@resultsdata_charts) {
$resultsdata_csv = Util::pick_data_file(
"$local_archive_dir/$selected_experiments[0]",
"resultsdata" );
$resultsdata_csv =
Util::pick_query_file( $selected_experiments[0], "resultsdata" );
}
# Chart SVGs are written into a separate output directory
system( 'mkdir', '-p', $local_charts_out_dir );
# Plot single-experiment charts
# Args: <experiment> <queries_dir> <charts_dir> [<archive_dir>]
# [datafile]
my @single_charts = grep { /single/ } @selected_charts;
foreach my $experiment (@selected_experiments) {
foreach my $chart (@single_charts) {
say " - Generating plot $chart for $experiment...";
my @r_args = (
'Rscript',
"$local_charts_dir/$chart.r",
"$local_archive_dir/$experiment"
'Rscript', "$local_charts_dir/$chart.r", $experiment,
$local_queries_dir, $local_charts_out_dir
);
# single_heatmap also needs the experiment's system.elf
push @r_args, $local_archive_dir if $chart eq 'single_heatmap';
# If the chart is marked in @faults_charts,
# append the $faults_csv to the args
push @r_args, $faults_csv
@@ -766,15 +785,18 @@ my %handlers = (
}
}
# Plot combined charts
# Args: <experiment1> ... <experimentN> <queries_dir> <charts_dir>
# [datafile]
my @combined_charts =
grep { /combined/ } @selected_charts;
my $print_experiments = join " ", @selected_experiments;
my @path_experiments =
map { "$local_archive_dir/$_" } @selected_experiments;
foreach my $chart (@combined_charts) {
say " - Generating plot $chart for ($print_experiments)...";
my @r_args =
( 'Rscript', "$local_charts_dir/$chart.r", @path_experiments );
my @r_args = (
'Rscript', "$local_charts_dir/$chart.r", @selected_experiments,
$local_queries_dir, $local_charts_out_dir
);
# If the chart is marked in @faults_charts,
# append the $faults_csv to the args