Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753988AbbHLNYB (ORCPT ); Wed, 12 Aug 2015 09:24:01 -0400 Received: from mail.kernel.org ([198.145.29.136]:50916 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752029AbbHLNX6 (ORCPT ); Wed, 12 Aug 2015 09:23:58 -0400 Date: Wed, 12 Aug 2015 10:23:55 -0300 From: Arnaldo Carvalho de Melo To: Masami Hiramatsu Cc: Namhyung Kim , Jiri Olsa , Linux Kernel Mailing List , David Ahern Subject: Re: [BUGFIX PATCH perf/core ] perf-probe: Fix to show lines of sys_ functions correctly Message-ID: <20150812132355.GD31059@kernel.org> References: <50399556C9727B4D88A595C8584AAB37524B434C@GSjpTKYDCembx32.service.hitachi.net> <20150812012406.11811.94691.stgit@localhost.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150812012406.11811.94691.stgit@localhost.localdomain> X-Url: http://acmel.wordpress.com User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2982 Lines: 95 Em Wed, Aug 12, 2015 at 10:24:07AM +0900, Masami Hiramatsu escreveu: > "perf probe --lines sys_poll" shows only the first line of > sys_poll, because the SYSCALL_DEFINE macro > ---- Thanks! Just try prefixing those ---- lines one space so that git-am works on your messages :-) Now to build and test, will report here the results. Thanks again, - Arnaldo > SYSCALL_DEFINE*(foo,...) > { > body; > } > ---- > is expanded as below (on debuginfo) > > ---- > static inline int SYSC_foo(...) > { > body; > } > int SyS_foo(...) <- is an alias of sys_foo. > { > return SYSC_foo(...); > } > ---- > > So, "perf probe --lines sys_foo" decodes SyS_foo function and > it also skips inlined functions(SYSC_foo) inside the target > function because those functions are usually defined somewhere > else. > > To fix this issue, this fix checks whether the inlined function > is defined at the same point of the target function, and if so, > it doesn't skip the inline function. > > Reported-by: Arnaldo Carvalho de Melo > Signed-off-by: Masami Hiramatsu > --- > tools/perf/util/dwarf-aux.c | 18 +++++++++++++----- > 1 file changed, 13 insertions(+), 5 deletions(-) > > diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c > index 57f3ef4..445f455 100644 > --- a/tools/perf/util/dwarf-aux.c > +++ b/tools/perf/util/dwarf-aux.c > @@ -734,15 +734,18 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data) > Dwarf_Lines *lines; > Dwarf_Line *line; > Dwarf_Addr addr; > - const char *fname; > + const char *fname, *decf = NULL; > int lineno, ret = 0; > + int decl = 0, inl; > Dwarf_Die die_mem, *cu_die; > size_t nlines, i; > > /* Get the CU die */ > - if (dwarf_tag(rt_die) != DW_TAG_compile_unit) > + if (dwarf_tag(rt_die) != DW_TAG_compile_unit) { > cu_die = dwarf_diecu(rt_die, &die_mem, NULL, NULL); > - else > + dwarf_decl_line(rt_die, &decl); > + decf = dwarf_decl_file(rt_die); > + } else > cu_die = rt_die; > if (!cu_die) { > pr_debug2("Failed to get CU from given DIE.\n"); > @@ -773,9 +776,14 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data) > * The line is included in given function, and > * no inline block includes it. > */ > - if (!dwarf_haspc(rt_die, addr) || > - die_find_inlinefunc(rt_die, addr, &die_mem)) > + if (!dwarf_haspc(rt_die, addr)) > continue; > + if (die_find_inlinefunc(rt_die, addr, &die_mem)) { > + dwarf_decl_line(&die_mem, &inl); > + if (inl != decl || > + decf != dwarf_decl_file(&die_mem)) > + continue; > + } > /* Get source line */ > fname = dwarf_linesrc(line, NULL, NULL); > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/