diff --git a/scripts/Util.pm b/scripts/Util.pm index 108c372..09f2442 100644 --- a/scripts/Util.pm +++ b/scripts/Util.pm @@ -139,4 +139,52 @@ sub execute_query { return $result; } +sub format_number_sep { + my ($number) = @_; + 1 while $number =~ s/^(-?\d+)(\d{3})/$1.$2/; + return $number; +} + +sub elf_read_sections { + my ($elffile) = @_; + + my $readelf_out = qx{readelf -S $elffile}; + my @lines = split "\n", $readelf_out; + + my @sections; + foreach my $line (@lines) { + +# [ 1] .text PROGBITS 00100000 001000 0000f0 00 AX 0 0 4 + next + unless $line =~ +/^\s*\[\s*\d+\]\s+(\..+?)\s+([A-Z]+)\s+([0-9a-f]+)\s+([0-9a-f]+)\s+([0-9a-f]+)\s+.*$/; + + push @sections, { + name => $1, + type => $2, + address => $3, # Memory location + offset => $4, # File location + size => $5, + }; + } + + return @sections; +} + +sub get_section_name { + my ( $address, @sections ) = @_; + + my $name; + my $last_address = 0; + foreach my $section (@sections) { + my $cur_address = hex( $section->{address} ); + if ( hex($address) >= $cur_address && $cur_address > $last_address ) { + $name = $section->{name}; + $last_address = $cur_address; + } + } + + return $name; +} + 1; diff --git a/scripts/explore.pl b/scripts/explore.pl index 28f1ccd..a30d1bb 100644 --- a/scripts/explore.pl +++ b/scripts/explore.pl @@ -75,7 +75,6 @@ my %index_of_markers; my $selected_threshold = 0; -# TODO: Display the segment the addresses belong to sub load_faults_csv { @marker_values = (); %marker_labels = (); @@ -86,11 +85,8 @@ sub load_faults_csv { headers => 'auto' ); - sub format_number_sep { - my ($number) = @_; - 1 while $number =~ s/^(-?\d+)(\d{3})/$1.$2/; - return $number; - } + my @sections = Util::elf_read_sections( + "$local_archive_dir/$selected_experiment/system.elf"); # Result: # [ { benchmark => "ip", resulttype => "OK_MARKER", @@ -101,9 +97,12 @@ sub load_faults_csv { %marker_labels = map { $_ => sprintf( - "%5s %10s %20s %15sx", - $_->{benchmark}, $_->{fault_address}, - $_->{resulttype}, format_number_sep( $_->{faults} ), + "%5s %10s %10s %20s %15sx", + $_->{benchmark}, + $_->{fault_address}, + Util::get_section_name( $_->{fault_address}, @sections ), + $_->{resulttype}, + Util::format_number_sep( $_->{faults} ), ); } @marker_values; } @@ -379,8 +378,8 @@ sub layout_resize { my $w = $win->width(); my $h = $win->height(); - my $w1 = int( $w * 0.2 ); - my $w2 = int( $w * 0.4 ); + my $w1 = int( $w * 0.3 ); + my $w2 = int( $w * 0.3 ); my $w3 = int( $w - $w1 - $w2 ); set_geometry( $left, 0, 1, $w1, $h - 2 ); diff --git a/scripts/menu.pl b/scripts/menu.pl index 049dfaf..15fdbad 100644 --- a/scripts/menu.pl +++ b/scripts/menu.pl @@ -275,13 +275,6 @@ my %handlers = ( } } - # TODO: To util function - sub format_number_sep { - my ($number) = @_; - 1 while $number =~ s/^(-?\d+)(\d{3})/$1.$2/; - return $number; - } - my @benchs = ( 'ip', 'mem', 'regs' ); my @markers = ( 'OK_MARKER', 'FAIL_MARKER', @@ -305,7 +298,7 @@ my %handlers = ( { $entry .= sprintf( "%50s ", - format_number_sep( + Util::format_number_sep( $all_results{$experiment}{$benchmark}{$marker} ) );