Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751895AbbHLV7a (ORCPT ); Wed, 12 Aug 2015 17:59:30 -0400 Received: from mail9.hitachi.co.jp ([133.145.228.44]:41985 "EHLO mail9.hitachi.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751129AbbHLV72 (ORCPT ); Wed, 12 Aug 2015 17:59:28 -0400 From: =?utf-8?B?5bmz5p2+6ZuF5bezIC8gSElSQU1BVFXvvIxNQVNBTUk=?= To: =?utf-8?B?5bmz5p2+6ZuF5bezIC8gSElSQU1BVFXvvIxNQVNBTUk=?= , Arnaldo Carvalho de Melo CC: Namhyung Kim , Jiri Olsa , "Linux Kernel Mailing List" , David Ahern Subject: RE: [BUGFIX PATCH perf/core v2] perf-probe: Fix to show lines of sys_ functions correctly Thread-Topic: [BUGFIX PATCH perf/core v2] perf-probe: Fix to show lines of sys_ functions correctly Thread-Index: AQHQ1UePQOgc2yA6CUiBs+22TgRpc54I6WeA Date: Wed, 12 Aug 2015 21:59:25 +0000 Message-ID: <50399556C9727B4D88A595C8584AAB37524B7F3B@GSjpTKYDCembx32.service.hitachi.net> References: <20150812213608.8185.44360.stgit@localhost.localdomain> In-Reply-To: <20150812213608.8185.44360.stgit@localhost.localdomain> Accept-Language: ja-JP, en-US Content-Language: ja-JP X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.198.219.34] Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by mail.home.local id t7CLxZjo021240 Content-Length: 3043 Lines: 99 Sorry, please ignore this. the original one already merged. I'll send diff patch. Thanks! > From: Masami Hiramatsu [mailto:masami.hiramatsu.pt@hitachi.com] > > "perf probe --lines sys_poll" shows only the first line of > sys_poll, because the SYSCALL_DEFINE macro > ---- > 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 > --- > Changes in v2 > - Fix to add a brace to if statement. > --- > tools/perf/util/dwarf-aux.c | 21 +++++++++++++++------ > 1 file changed, 15 insertions(+), 6 deletions(-) > > diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c > index 57f3ef4..a509aa84 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"); > @@ -767,15 +770,21 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data) > continue; > } > /* Filter lines based on address */ > - if (rt_die != cu_die) > + if (rt_die != cu_die) { > /* > * Address filtering > * 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); > ????{.n?+???????+%?????ݶ??w??{.n?+????{??G?????{ay?ʇڙ?,j??f???h?????????z_??(?階?ݢj"???m??????G????????????&???~???iO???z??v?^?m???? ????????I?