perf report: Fall-back to function name comparison for -g srcline
When a callchain entry has no srcline available, we ended up comparing the instruction pointer. I consider this to be not too useful. Rather, I think we should group the entries by function name, which this patch adds. For people who want to split the data on the IP boundary, using `-g address` is the correct choice. Before: ~~~~~ 100.00% 38.86% [.] main | |--61.14%--main inlining.cpp:14 | std::norm<double> complex:664 | std::_Norm_helper<true>::_S_do_it<double> complex:654 | std::abs<double> complex:597 | std::__complex_abs complex:589 | | | |--56.03%--hypot | | | | | |--8.45%--__hypot_finite | | | | | |--7.62%--__hypot_finite | | | | | |--2.29%--__hypot_finite | | | | | |--2.24%--__hypot_finite | | | | | |--2.06%--__hypot_finite | | | | | |--1.81%--__hypot_finite ... ~~~~~ After: ~~~~~ 100.00% 38.86% [.] main | |--61.14%--main inlining.cpp:14 | std::norm<double> complex:664 | std::_Norm_helper<true>::_S_do_it<double> complex:654 | std::abs<double> complex:597 | std::__complex_abs complex:589 | | | |--60.29%--hypot | | | | | --56.03%--__hypot_finite | | | --0.85%--cabs ~~~~~ Signed-off-by: Milian Wolff <milian.wolff@kdab.com> Reviewed-by: Jiri Olsa <jolsa@redhat.com> Reviewed-by: Namhyung 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-7-milian.wolff@kdab.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
11ea2515f3
commit
cbe50f6172
|
@ -645,11 +645,9 @@ enum match_result {
|
||||||
MATCH_GT,
|
MATCH_GT,
|
||||||
};
|
};
|
||||||
|
|
||||||
static enum match_result match_chain_srcline(struct callchain_cursor_node *node,
|
static enum match_result match_chain_strings(const char *left,
|
||||||
struct callchain_list *cnode)
|
const char *right)
|
||||||
{
|
{
|
||||||
const char *left = cnode->srcline;
|
|
||||||
const char *right = node->srcline;
|
|
||||||
enum match_result ret = MATCH_EQ;
|
enum match_result ret = MATCH_EQ;
|
||||||
int cmp;
|
int cmp;
|
||||||
|
|
||||||
|
@ -659,10 +657,8 @@ static enum match_result match_chain_srcline(struct callchain_cursor_node *node,
|
||||||
cmp = 1;
|
cmp = 1;
|
||||||
else if (left && !right)
|
else if (left && !right)
|
||||||
cmp = -1;
|
cmp = -1;
|
||||||
else if (cnode->ip == node->ip)
|
|
||||||
cmp = 0;
|
|
||||||
else
|
else
|
||||||
cmp = (cnode->ip < node->ip) ? -1 : 1;
|
return MATCH_ERROR;
|
||||||
|
|
||||||
if (cmp != 0)
|
if (cmp != 0)
|
||||||
ret = cmp < 0 ? MATCH_LT : MATCH_GT;
|
ret = cmp < 0 ? MATCH_LT : MATCH_GT;
|
||||||
|
@ -679,10 +675,18 @@ static enum match_result match_chain(struct callchain_cursor_node *node,
|
||||||
struct dso *right_dso = NULL;
|
struct dso *right_dso = NULL;
|
||||||
|
|
||||||
if (callchain_param.key == CCKEY_SRCLINE) {
|
if (callchain_param.key == CCKEY_SRCLINE) {
|
||||||
enum match_result match = match_chain_srcline(node, cnode);
|
enum match_result match = match_chain_strings(cnode->srcline,
|
||||||
|
node->srcline);
|
||||||
|
|
||||||
|
/* if no srcline is available, fallback to symbol name */
|
||||||
|
if (match == MATCH_ERROR && cnode->ms.sym && node->sym)
|
||||||
|
match = match_chain_strings(cnode->ms.sym->name,
|
||||||
|
node->sym->name);
|
||||||
|
|
||||||
if (match != MATCH_ERROR)
|
if (match != MATCH_ERROR)
|
||||||
return match;
|
return match;
|
||||||
|
|
||||||
|
/* otherwise fall-back to IP-based comparison below */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cnode->ms.sym && sym && callchain_param.key == CCKEY_FUNCTION) {
|
if (cnode->ms.sym && sym && callchain_param.key == CCKEY_FUNCTION) {
|
||||||
|
|
Loading…
Reference in New Issue