diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2011-08-19 13:01:53 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2011-08-19 13:10:58 -0500 |
commit | 02991f3ecb7356dc989148710e7ca40df0f7437c (patch) | |
tree | b27380d2000c62f0f664e71d59e5c351bccc61a3 /src/build | |
parent | 3c7f390fcee9b9f154567d047dd29cc9d74cfba2 (diff) | |
download | talos-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-x | src/build/tools/genlist | 70 | ||||
-rwxr-xr-x | src/build/tools/gensyms | 18 |
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; } |