• David Tolnay's avatar
    perf symbols: Add Rust demangling · cae15db7
    David Tolnay authored
    Rust demangling is another step after bfd demangling. Add a diagnosis to
    identify mangled Rust symbols based on the hash that the Rust mangler appends
    as the last path component, as well as other characteristics.  Add a demangler
    to reconstruct the original symbol.
    
    Committer notes:
    
    How I tested it:
    
    Enabled COPR on Fedora 24 and then installed the 'rust-binary' package,
    with it:
    
      $ cat src/main.rs
      fn main() {
          println!("Hello, world!");
      }
      $ cat Cargo.toml
      [package]
    
      name = "hello_world"
      version = "0.0.1"
      authors = [ "Arnaldo Carvalho de Melo <acme@kernel.org>" ]
    
      $ perf record cargo bench
       Compiling hello_world v0.0.1 (file:///home/acme/projects/hello_world)
         Running target/release/hello_world-d4b9dab4b2a47d75
    
      running 0 tests
    
      test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured
    
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 0.096 MB perf.data (1457 samples) ]
      $
    
    Before this patch:
    
      $ perf report --stdio --dsos librbml-e8edd0fd.so
      # dso: librbml-e8edd0fd.so
      #
      # Total Lost Samples: 0
      #
      # Samples: 1K of event 'cycles:u'
      # Event count (approx.): 979599126
      #
      # Overhead  Command  Symbol
      # ........  .......  .............................................................................................................
      #
           1.78%  rustc    [.] rbml::reader::maybe_get_doc::hb9d387df6024b15b
           1.50%  rustc    [.] _$LT$reader..DocsIterator$LT$$u27$a$GT$$u20$as$u20$std..iter..Iterator$GT$::next::hd9af9e60d79a35c8
           1.20%  rustc    [.] rbml::reader::doc_at::hc88107fba445af31
           0.46%  rustc    [.] _$LT$reader..TaggedDocsIterator$LT$$u27$a$GT$$u20$as$u20$std..iter..Iterator$GT$::next::h0cb40e696e4bb489
           0.35%  rustc    [.] rbml::reader::Decoder::_next_int::h66eef7825a398bc3
           0.29%  rustc    [.] rbml::reader::Decoder::_next_sub::h8e5266005580b836
           0.15%  rustc    [.] rbml::reader::get_doc::h094521c645459139
           0.14%  rustc    [.] _$LT$reader..Decoder$LT$$u27$doc$GT$$u20$as$u20$serialize..Decoder$GT$::read_u32::h0acea2fff9669327
           0.07%  rustc    [.] rbml::reader::Decoder::next_doc::h6714d469c9dfaf91
           0.07%  rustc    [.] _ZN4rbml6reader10doc_as_u6417h930b740aa94f1d3aE@plt
           0.06%  rustc    [.] _fini
      $
    
    After:
    
      $ perf report --stdio --dsos librbml-e8edd0fd.so
      # dso: librbml-e8edd0fd.so
      #
      # Total Lost Samples: 0
      #
      # Samples: 1K of event 'cycles:u'
      # Event count (approx.): 979599126
      #
      # Overhead  Command  Symbol
      # ........  .......  .................................................................
      #
         1.78%  rustc    [.] rbml::reader::maybe_get_doc
         1.50%  rustc    [.] <reader::DocsIterator<'a> as std::iter::Iterator>::next
         1.20%  rustc    [.] rbml::reader::doc_at
         0.46%  rustc    [.] <reader::TaggedDocsIterator<'a> as std::iter::Iterator>::next
         0.35%  rustc    [.] rbml::reader::Decoder::_next_int
         0.29%  rustc    [.] rbml::reader::Decoder::_next_sub
         0.15%  rustc    [.] rbml::reader::get_doc
         0.14%  rustc    [.] <reader::Decoder<'doc> as serialize::Decoder>::read_u32
         0.07%  rustc    [.] rbml::reader::Decoder::next_doc
         0.07%  rustc    [.] _ZN4rbml6reader10doc_as_u6417h930b740aa94f1d3aE@plt
         0.06%  rustc    [.] _fini
      $
    Signed-off-by: default avatarDavid Tolnay <dtolnay@gmail.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/5780B7FA.3030602@gmail.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    cae15db7
symbol-elf.c 46.3 KB