• Milian Wolff's avatar
    perf report: Compare symbol name for inlined frames when sorting · aa441895
    Milian Wolff authored
    Similar to the callstack frame matching, we also have to compare the
    symbol name when sorting hist entries. The reason is twofold: On one
    hand, multiple inlined functions will use the same symbol start/end
    values of the parent, non-inlined symbol.
    
    As such, all of these symbols often end up missing from top-level
    report, as they get merged with the non-inlined frame. On the other
    hand, multiple different functions may end up inlining the same
    function, and we need to aggregate these values properly.
    
    Before:
    
    ~~~~~
      perf report --stdio --inline -g none
      # Children     Self  Command       Shared Object Symbol
      # ........ ........  ............  ............. ...................................
      #
         100.00%   39.69%  cpp-inlining  cpp-inlining  [.] main
         100.00%    0.00%  cpp-inlining  cpp-inlining  [.] _start
         100.00%    0.00%  cpp-inlining  libc-2.25.so  [.] __libc_start_main
          97.03%    0.00%  cpp-inlining  cpp-inlining  [.] std::norm<double> (inlined)
          59.53%    4.26%  cpp-inlining  libm-2.25.so  [.] hypot
          55.21%   55.08%  cpp-inlining  libm-2.25.so  [.] __hypot_finite
           0.52%    0.52%  cpp-inlining  libm-2.25.so  [.] cabs
    ~~~~~
    
    After:
    
    ~~~~~
      perf report --stdio --inline -g none
      # Children     Self  Command       Shared Object Symbol
      # ........ ........  ............  ............. ...................................................................................................................................
      #
         100.00%   39.69%  cpp-inlining  cpp-inlining  [.] main
         100.00%    0.00%  cpp-inlining  cpp-inlining  [.] _start
         100.00%    0.00%  cpp-inlining  libc-2.25.so  [.] __libc_start_main
          62.57%    0.00%  cpp-inlining  cpp-inlining  [.] std::_Norm_helper<true>::_S_do_it<double> (inlined)
          62.57%    0.00%  cpp-inlining  cpp-inlining  [.] std::__complex_abs (inlined)
          62.57%    0.00%  cpp-inlining  cpp-inlining  [.] std::abs<double> (inlined)
          62.57%    0.00%  cpp-inlining  cpp-inlining  [.] std::norm<double> (inlined)
          59.53%    4.26%  cpp-inlining  libm-2.25.so  [.] hypot
          55.21%   55.08%  cpp-inlining  libm-2.25.so  [.] __hypot_finite
          34.46%    0.00%  cpp-inlining  cpp-inlining  [.] std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> > (inlined)
          32.39%    0.00%  cpp-inlining  cpp-inlining  [.] std::__detail::_Adaptor<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul>, double>::operator() (inlined)
          32.39%    0.00%  cpp-inlining  cpp-inlining  [.] std::generate_canonical<double, 53ul, std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> > (inlined)
          12.29%    0.00%  cpp-inlining  cpp-inlining  [.] std::__detail::_Mod<unsigned long, 2147483647ul, 16807ul, 0ul, true, true>::__calc (inlined)
          12.29%    0.00%  cpp-inlining  cpp-inlining  [.] std::__detail::__mod<unsigned long, 2147483647ul, 16807ul, 0ul> (inlined)
          12.29%    0.00%  cpp-inlining  cpp-inlining  [.] std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul>::operator() (inlined)
           0.52%    0.52%  cpp-inlining  libm-2.25.so  [.] cabs
    ~~~~~
    Signed-off-by: default avatarMilian Wolff <milian.wolff@kdab.com>
    Reviewed-by: default avatarJiri Olsa <jolsa@redhat.com>
    Reviewed-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Yao Jin <yao.jin@linux.intel.com>
    Link: http://lkml.kernel.org/r/20171009203310.17362-11-milian.wolff@kdab.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    aa441895
sort.c 70.3 KB