• Milian Wolff's avatar
    perf report: Use srcline from callchain for hist entries · 1fb7d06a
    Milian Wolff authored
    This also removes the symbol name from the srcline column, more on this
    below.
    
    This ensures we use the correct srcline, which could originate from a
    potentially inlined function. The hist entries used to query for the
    srcline based purely on the IP, which leads to wrong results for inlined
    entries.
    
    Before:
    
    ~~~~~
      perf report --inline -s srcline -g none --stdio
      ...
      # Children      Self  Source:Line
      # ........  ........  ..................................................................................................................................
      #
          94.23%     0.00%  __libc_start_main+18446603487898210537
          94.23%     0.00%  _start+41
          44.58%     0.00%  main+100
          44.58%     0.00%  std::_Norm_helper<true>::_S_do_it<double>+100
          44.58%     0.00%  std::__complex_abs+100
          44.58%     0.00%  std::abs<double>+100
          44.58%     0.00%  std::norm<double>+100
          36.01%     0.00%  hypot+18446603487892193300
          25.81%     0.00%  main+41
          25.81%     0.00%  std::__detail::_Adaptor<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul>, double>::operator()+41
          25.81%     0.00%  std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> >+41
          25.75%    25.75%  random.h:143
          18.39%     0.00%  main+57
          18.39%     0.00%  std::__detail::_Adaptor<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul>, double>::operator()+57
          18.39%     0.00%  std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> >+57
          13.80%    13.80%  random.tcc:3330
           5.64%     0.00%  ??:0
           4.13%     4.13%  __hypot_finite+163
           4.13%     0.00%  __hypot_finite+18446603487892193443
    ...
    ~~~~~
    
    After:
    
    ~~~~~
      perf report --inline -s srcline -g none --stdio
      ...
      # Children      Self  Source:Line
      # ........  ........  ...........................................
      #
          94.30%     1.19%  main.cpp:39
          94.23%     0.00%  __libc_start_main+18446603487898210537
          94.23%     0.00%  _start+41
          48.44%     1.70%  random.h:1823
          48.44%     0.00%  random.h:1814
          46.74%     2.53%  random.h:185
          44.68%     0.10%  complex:589
          44.68%     0.00%  complex:597
          44.68%     0.00%  complex:654
          44.68%     0.00%  complex:664
          40.61%    13.80%  random.tcc:3330
          36.01%     0.00%  hypot+18446603487892193300
          26.81%     0.00%  random.h:151
          26.81%     0.00%  random.h:332
          25.75%    25.75%  random.h:143
           5.64%     0.00%  ??:0
           4.13%     4.13%  __hypot_finite+163
           4.13%     0.00%  __hypot_finite+18446603487892193443
    ...
    ~~~~~
    
    Note that this change removes the symbol from the source:line hist
    column. If this information is desired, users should explicitly query
    for it if needed. I.e. run this command instead:
    
    ~~~~~
      perf report --inline -s sym,srcline -g none --stdio
      ...
      # To display the perf.data header info, please use --header/--header-only options.
      #
      #
      # Total Lost Samples: 0
      #
      # Samples: 1K of event 'cycles:uppp'
      # Event count (approx.): 1381229476
      #
      # Children      Self  Symbol                                                                                                                               Source:Line
      # ........  ........  ...................................................................................................................................  ...........................................
      #
          94.30%     1.19%  [.] main                                                                                                                             main.cpp:39
          94.23%     0.00%  [.] __libc_start_main                                                                                                                __libc_start_main+18446603487898210537
          94.23%     0.00%  [.] _start                                                                                                                           _start+41
          48.44%     0.00%  [.] std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> > (inlined)  random.h:1814
          48.44%     0.00%  [.] std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> > (inlined)  random.h:1823
          46.74%     0.00%  [.] std::__detail::_Adaptor<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul>, double>::operator() (inlined)  random.h:185
          44.68%     0.00%  [.] std::_Norm_helper<true>::_S_do_it<double> (inlined)                                                                              complex:654
          44.68%     0.00%  [.] std::__complex_abs (inlined)                                                                                                     complex:589
          44.68%     0.00%  [.] std::abs<double> (inlined)                                                                                                       complex:597
          44.68%     0.00%  [.] std::norm<double> (inlined)                                                                                                      complex:664
          39.80%    13.59%  [.] std::generate_canonical<double, 53ul, std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> >               random.tcc:3330
          36.01%     0.00%  [.] hypot                                                                                                                            hypot+18446603487892193300
          26.81%     0.00%  [.] std::__detail::__mod<unsigned long, 2147483647ul, 16807ul, 0ul> (inlined)                                                        random.h:151
          26.81%     0.00%  [.] std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul>::operator() (inlined)                                 random.h:332
          25.75%     0.00%  [.] std::__detail::_Mod<unsigned long, 2147483647ul, 16807ul, 0ul, true, true>::__calc (inlined)                                     random.h:143
          25.19%    25.19%  [.] std::generate_canonical<double, 53ul, std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> >               random.h:143
           4.13%     4.13%  [.] __hypot_finite                                                                                                                   __hypot_finite+163
           4.13%     0.00%  [.] __hypot_finite                                                                                                                   __hypot_finite+18446603487892193443
    ...
    ~~~~~
    
    Compared to the old behavior, this reduces duplication in the output.
    Before we used to print the symbol name in the srcline column even
    when the sym column was explicitly requested. I.e. the output was:
    
    ~~~~~
      perf report --inline -s sym,srcline -g none --stdio
      ...
      # To display the perf.data header info, please use --header/--header-only options.
      #
      #
      # Total Lost Samples: 0
      #
      # Samples: 1K of event 'cycles:uppp'
      # Event count (approx.): 1381229476
      #
      # Children      Self  Symbol                                                                                                                               Source:Line
      # ........  ........  ...................................................................................................................................  ..................................................................................................................................
      #
          94.23%     0.00%  [.] __libc_start_main                                                                                                                __libc_start_main+18446603487898210537
          94.23%     0.00%  [.] _start                                                                                                                           _start+41
          44.58%     0.00%  [.] main                                                                                                                             main+100
          44.58%     0.00%  [.] std::_Norm_helper<true>::_S_do_it<double> (inlined)                                                                              std::_Norm_helper<true>::_S_do_it<double>+100
          44.58%     0.00%  [.] std::__complex_abs (inlined)                                                                                                     std::__complex_abs+100
          44.58%     0.00%  [.] std::abs<double> (inlined)                                                                                                       std::abs<double>+100
          44.58%     0.00%  [.] std::norm<double> (inlined)                                                                                                      std::norm<double>+100
          36.01%     0.00%  [.] hypot                                                                                                                            hypot+18446603487892193300
          25.81%     0.00%  [.] main                                                                                                                             main+41
          25.81%     0.00%  [.] std::__detail::_Adaptor<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul>, double>::operator() (inlined)  std::__detail::_Adaptor<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul>, double>::operator()+41
          25.81%     0.00%  [.] std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> > (inlined)  std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> >+41
          25.69%    25.69%  [.] std::generate_canonical<double, 53ul, std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> >               random.h:143
          18.39%     0.00%  [.] main                                                                                                                             main+57
          18.39%     0.00%  [.] std::__detail::_Adaptor<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul>, double>::operator() (inlined)  std::__detail::_Adaptor<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul>, double>::operator()+57
          18.39%     0.00%  [.] std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> > (inlined)  std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> >+57
          13.80%    13.80%  [.] std::generate_canonical<double, 53ul, std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> >               random.tcc:3330
           4.13%     4.13%  [.] __hypot_finite                                                                                                                   __hypot_finite+163
           4.13%     0.00%  [.] __hypot_finite                                                                                                                   __hypot_finite+18446603487892193443
    ...
    ~~~~~
    Signed-off-by: default avatarMilian Wolff <milian.wolff@kdab.com>
    Reviewed-by: default avatarAndi Kleen <ak@linux.intel.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Jin Yao <yao.jin@linux.intel.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/20171019113836.5548-5-milian.wolff@kdab.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    1fb7d06a
hist.c 59.3 KB