DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (5b81998bb7ab)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
#!/usr/bin/perl -w
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

use strict;

#
# A wrapper for nm that produces output listing symbol size.
#
my($prev_addr) = 0;
my($prev_module) = "";
my($prev_kind) = "";
my($prev_symbol) = "";

open(NM_OUTPUT, "nm -fnol $ARGV[0] | c++filt |") or die "nm failed to run on $ARGV[0]\n";
while (<NM_OUTPUT>)
{
  my($line) = $_;
  chomp($line);
  
  if ($line =~ /^([^:]+):\s*([0-9a-f]{8}) (\w) (.+)$/)
  {
    my($module) = $1;
    my($addr)   = $2;
    my($kind)   = $3;
    my($symbol) = $4;

    #Skip absolute addresses, there should be only a few
    if ('a' eq lc $kind) {
        if ('trampoline_size' ne $symbol) {
            warn "Encountered unknown absolutely addressed symbol '$symbol' in $module";
        }
        next;
    }

    # we expect the input to have been piped through c++filt to
    # demangle symbols. For some reason, it doesn't always demangle
    # all of them, so push still-mangled symbols back through c++filt again.
    if ($symbol =~ /^(_[_Z].+)/)
    {
      # warn "Trying again to unmangle $1\n";
      $symbol = `c++filt '$1'`;
      chomp($symbol);
      # warn "Unmangling again to $symbol\n";
    }

    my($prev_size) = hex($addr) - hex($prev_addr);
    # print "Outputting line $line\n";

    # always print one behind, because only now do we know its size
    if ($prev_module ne "") {
      printf "%s:%08x %s %s\n", $prev_module, $prev_size, $prev_kind, $prev_symbol;
    }
      
    $prev_addr   = $addr;
    $prev_module = $module;
    $prev_kind   = $kind;
    $prev_symbol = $symbol;
  }
  else
  {
    # warn "   Discaring line $line\n";
  }
}

# we don't know how big the last symbol is, so always show 4.
if ($prev_module ne "") {
  printf "%s:%08x %s %s\n", $prev_module, 4, $prev_kind, $prev_symbol;
}