Add table data contents to dot output

asm
Hamish Coleman 8 years ago
parent c4e9761b8b
commit bf29cc9f78

@ -214,12 +214,11 @@ sub glom_objects {
my $db = shift; my $db = shift;
my @addrs = $db->{symbols}->all_addrs(); my @addrs = $db->{symbols}->all_addrs();
my @srcs = sort keys(%{$db->{p}{src}});
while (@addrs) { while (@addrs) {
my $addr = shift @addrs; my $addr = shift @addrs;
my $object; my $object;
$object->{addr} = $addr; $object->{addr} = $addr;
$db->{p}{obj}{$addr} = $object;
my $next_addr = $addrs[0]; my $next_addr = $addrs[0];
my $size; my $size;
@ -231,14 +230,18 @@ sub glom_objects {
} }
$object->{size} = $size; $object->{size} = $size;
# ungh, this nested loop is costly my $offset = 0;
for my $src (@srcs) { while ($addr < $next_addr) {
if ($src >= $addr && $src < $next_addr) { if (defined($db->{p}{src}{$addr})) {
$object->{p}{$src} = $db->{p}{src}{$src}; $object->{p}{$offset} = $db->{p}{src}{$addr};
$object->{d}{$offset} = undef;
} else {
$object->{d}{$offset} = unpack("V",memr_read($db,$addr,4));
} }
$addr += 4;
$offset += 4;
} }
$db->{p}{obj}{$addr} = $object;
} }
} }
@ -246,17 +249,33 @@ sub output_dot {
my $db = shift; my $db = shift;
print "digraph structs {\n"; print "digraph structs {\n";
print " rankdir=LR;\n";
print " node [shape=record];\n";
print "\n";
for my $addr (sort keys(%{$db->{p}{obj}})) { for my $addr (sort keys(%{$db->{p}{obj}})) {
my $object = $db->{p}{obj}{$addr}; my $object = $db->{p}{obj}{$addr};
my $name = $db->{symbols}->addr2str($addr); my $name = $db->{symbols}->addr2str($addr);
printf(" %s; // %i\n",$name, $object->{size});
for my $src (sort keys(%{$object->{p}})) { my @ports;
my $port = ($src - $addr)/4; push @ports,"<p>$name:";
my $dst = $object->{p}{$src}; for my $offset (sort {$a <=> $b} keys(%{$object->{d}})) {
my $val = $object->{d}{$offset};
if (!defined($val)) {
# this is a pointer
my $dst = $object->{p}{$offset};
my $dstname = $db->{symbols}->addr2str($dst); my $dstname = $db->{symbols}->addr2str($dst);
printf(" %s:p%i -> %s;\n",$name,$port,$dstname); printf(" %s:p%i -> %s:p;\n",$name,$offset,$dstname);
push @ports, sprintf("<p%i>%s",$offset,$dstname);
} else {
push @ports, sprintf("<p%i>0x%08x",$offset,$val);
} }
}
printf(" %s [label=\"%s\"]; // %i\n",
$name,
join("|",@ports),
$object->{size}
);
printf("\n"); printf("\n");
} }
print "}\n"; print "}\n";

Loading…
Cancel
Save