• Milian Wolff's avatar
    perf callchain: Compare symbol name for inlined frames when matching · 9856240a
    Milian Wolff authored
    The fake symbols we create for inlined frames will represent different
    functions but can use the symbol start address. This leads to issues
    when different inline branches all lead to the same function.
    
    Before:
    ~~~~~
    $ perf report -s sym -i perf.inlining.data --inline --stdio -g function
    ...
                 --38.86%--_start
                           __libc_start_main
                           main
                           |
                            --37.57%--std::norm<double> (inlined)
                                      std::_Norm_helper<true>::_S_do_it<double> (inlined)
                                      |
                                       --36.36%--std::abs<double> (inlined)
                                                 std::__complex_abs (inlined)
                                                 |
                                                  --12.24%--std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul>::operator() (inlined)
                                                            std::__detail::__mod<unsigned long, 2147483647ul, 16807ul, 0ul> (inlined)
                                                            std::__detail::_Mod<unsigned long, 2147483647ul, 16807ul, 0ul, true, true>::__calc (inlined)
    ~~~~~
    
    Note that this backtrace representation is completely bogus.
    Complex abs does not call the linear congruential engine! It
    is just a side-effect of a longer inlined stack being appended
    to a shorter, different inlined stack, both of which originate
    in the same function (main).
    
    This patch fixes the issue:
    
    ~~~~~
    $ perf report -s sym -i perf.inlining.data --inline --stdio -g function
    ...
                 --38.86%--_start
                           __libc_start_main
                           main
                           |
                           |--35.59%--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> > (inlined)
                           |          |
                           |           --34.37%--std::__detail::_Adaptor<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul>, double>::operator() (inlined)
                           |                     std::generate_canonical<double, 53ul, std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> > (inlined)
                           |                     |
                           |                      --12.24%--std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul>::operator() (inlined)
                           |                                std::__detail::__mod<unsigned long, 2147483647ul, 16807ul, 0ul> (inlined)
                           |                                std::__detail::_Mod<unsigned long, 2147483647ul, 16807ul, 0ul, true, true>::__calc (inlined)
                           |
                            --1.99%--std::norm<double> (inlined)
                                      std::_Norm_helper<true>::_S_do_it<double> (inlined)
                                      std::abs<double> (inlined)
                                      std::__complex_abs (inlined)
    ~~~~~
    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: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com>
    Cc: Yao Jin <yao.jin@linux.intel.com>
    Link: http://lkml.kernel.org/r/20171009203310.17362-10-milian.wolff@kdab.com
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    [ Fix up conflict with c1fbc0cf ("perf callchain: Compare dsos (as well) for CCKEY_FUNCTION"), remove unneeded hunk ]
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    9856240a
callchain.c 35.2 KB