summaryrefslogtreecommitdiffstats
path: root/src/build
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2011-08-19 13:01:53 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2011-08-19 13:10:58 -0500
commit02991f3ecb7356dc989148710e7ca40df0f7437c (patch)
treeb27380d2000c62f0f664e71d59e5c351bccc61a3 /src/build
parent3c7f390fcee9b9f154567d047dd29cc9d74cfba2 (diff)
downloadtalos-hostboot-02991f3ecb7356dc989148710e7ca40df0f7437c.tar.gz
talos-hostboot-02991f3ecb7356dc989148710e7ca40df0f7437c.zip
Gensyms / Genlist performance improvement.
Change-Id: Id53ece646a5fbf35a13bf00f5f8cf93e2c0781ea Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/266 Tested-by: Jenkins Server Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/build')
-rwxr-xr-xsrc/build/tools/genlist70
-rwxr-xr-xsrc/build/tools/gensyms18
2 files changed, 61 insertions, 27 deletions
diff --git a/src/build/tools/genlist b/src/build/tools/genlist
index a77082fe3..281dc6114 100755
--- a/src/build/tools/genlist
+++ b/src/build/tools/genlist
@@ -4,17 +4,15 @@ use strict;
sub add_image_subdir
{
- my $image = shift;
+ my ($image) = @_;
if (!($image =~ m/\/img/)) { $image = "./img/".$image };
return $image;
}
sub find_symbol_name
{
- my $offset = shift;
- my $require_function = shift;
- my $symbol_addrs = shift;
- my $symbol_funcs = shift;
+ my ($offset, $require_function, $symbol_addrs,
+ $symbol_sorted_addrs, $symbol_funcs) = @_;
if (defined $symbol_addrs->{$offset})
{
@@ -35,15 +33,38 @@ sub find_symbol_name
{
return 0;
}
-
- my $prevoffset = 0;
- foreach my $off (keys %$symbol_addrs)
+
+ my $prevoffset = -1;
+ my $search_first = 0;
+ my $search_last = $#$symbol_sorted_addrs;
+ while ($search_first != $search_last)
{
- if (($off > $prevoffset) and ($off <= $offset))
- {
- $prevoffset = $off;
- }
+ my $search_mid = int ($search_first + $search_last) / 2;
+ if ($search_mid == $search_first)
+ {
+ if (@$symbol_sorted_addrs[$search_last] <= $offset)
+ {
+ $search_first = $search_last;
+ }
+ else
+ {
+ $search_last = $search_first;
+ }
+ }
+ elsif (@$symbol_sorted_addrs[$search_mid] <= $offset)
+ {
+ $search_first = $search_mid;
+ }
+ else
+ {
+ $search_last = $search_mid;
+ }
+ }
+ if (@$symbol_sorted_addrs[$search_first] <= $offset)
+ {
+ $prevoffset = @$symbol_sorted_addrs[$search_first];
}
+
if (defined $symbol_addrs->{$prevoffset})
{
for my $sym (@{$symbol_addrs->{$prevoffset}})
@@ -101,12 +122,9 @@ while (my $modline = <MODINFO>)
my %symbol_address = ();
my %symbol_isfunc = ();
-my $cmd = "$Bin/gensyms ".$image;
-foreach my $module (@modules)
-{
- $cmd = $cmd." ".$module;
-}
-open GENSYMS, $cmd."|";
+my $gensyms = $image;
+$gensyms =~ s/\.bin/\.syms/;
+open GENSYMS, "<".$gensyms;
while (my $line = <GENSYMS>)
{
chomp $line;
@@ -124,20 +142,28 @@ while (my $line = <GENSYMS>)
push @{$symbol_address{$addr}}, $function;
$symbol_isfunc{$function} = $is_func;
}
+my @symbol_sorted_addrs = sort { $a <=> $b} keys %symbol_address;
foreach my $module (@modules)
{
print "BEGIN MODULE ---- ".$module." ----\n";
my $enabled = 0;
+ my $sections = 0;
open OBJDUMP, ("ppc64-mcp6-objdump -DCS ".add_image_subdir($module)."|");
while (my $line = <OBJDUMP>)
{
- if ($line =~ m/Disassembly of section/)
+ if (!$enabled && ($sections >= 2))
+ {
+ close OBJDUMP;
+ }
+
+ if (($line =~ m/Disassembly/) && ($line =~ m/Disassembly of section/))
{
if (($line =~ m/.text/) || ($line =~ m/.data/))
{
$enabled = 1;
+ $sections = $sections + 1;
}
else
{
@@ -153,7 +179,8 @@ foreach my $module (@modules)
my $format = sprintf "%x\t%08x", $value, $offset;
$line =~ s/__HEXVALUE__/$format/;
- my $symname = find_symbol_name($offset, 1, \%symbol_address,
+ my $symname = find_symbol_name($offset, 1, \%symbol_address,
+ \@symbol_sorted_addrs,
\%symbol_isfunc);
if ($symname)
{
@@ -168,7 +195,8 @@ foreach my $module (@modules)
$line =~ s/__HEXVALUE__/$format/;
my $refname = find_symbol_name($offset, 0,
- \%symbol_address, \%symbol_isfunc);
+ \%symbol_address, \@symbol_sorted_addrs,
+ \%symbol_isfunc);
$line =~ s/__FUNCREF__/$refname/
}
}
diff --git a/src/build/tools/gensyms b/src/build/tools/gensyms
index f69e64d37..75242c15b 100755
--- a/src/build/tools/gensyms
+++ b/src/build/tools/gensyms
@@ -2,6 +2,8 @@
use strict;
+use IO::Seekable;
+
sub add_image_subdir
{
my $image = shift;
@@ -31,6 +33,8 @@ else
}
$image = add_image_subdir($ARGV[0]);
+open IMAGE, "< $image";
+binmode(IMAGE);
my %module_offsets = ();
open MODINFO, "< $image.modinfo";
@@ -46,7 +50,7 @@ while (my $modline = <MODINFO>)
}
}
-my %output = ();
+my @output = ();
foreach my $module (@modules)
{
open OBJDUMP, ("ppc64-mcp6-objdump --syms -C ".add_image_subdir($module)."|");
@@ -74,21 +78,23 @@ foreach my $module (@modules)
my $code_loc = 0;
if ($is_function)
{
- open XXD, ("/usr/bin/xxd -p -s ".($address - $image_offset)." -l 8 -g 8 ".add_image_subdir($image)."|");
- $code_loc = (hex <XXD>) + $image_offset;
- close XXD;
+ seek IMAGE, ($address - $image_offset), SEEK_SET;
+ read IMAGE, $code_loc, 8;
+ $code_loc = unpack("Q>", $code_loc) + $image_offset;
my $tmp = $code_loc; $code_loc = $address; $address = $tmp;
}
my $outstring = "";
$outstring = sprintf "%s,%08x,%08x,%08x,%s\n", ($is_function?"F":"V"),$address,$code_loc,$size,$name;
- $output{$outstring} = $outstring;
+ push @output, $outstring;
}
close OBJDUMP;
}
-foreach my $outstring (sort { substr($a,2,8) cmp substr($b,2,8) } keys %output)
+close IMAGE;
+
+foreach my $outstring (sort { substr($a,2) cmp substr($b,2) } @output)
{
print $outstring;
}
OpenPOWER on IntegriCloud