From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752574AbbHMIGn (ORCPT ); Thu, 13 Aug 2015 04:06:43 -0400 Received: from terminus.zytor.com ([198.137.202.10]:51204 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751964AbbHMIGh (ORCPT ); Thu, 13 Aug 2015 04:06:37 -0400 Date: Thu, 13 Aug 2015 01:06:21 -0700 From: tip-bot for Masami Hiramatsu Message-ID: Cc: hpa@zytor.com, masami.hiramatsu.pt@hitachi.com, jolsa@redhat.com, dsahern@gmail.com, tglx@linutronix.de, acme@kernel.org, linux-kernel@vger.kernel.org, acme@redhat.com, mingo@kernel.org, namhyung@kernel.org Reply-To: hpa@zytor.com, jolsa@redhat.com, masami.hiramatsu.pt@hitachi.com, dsahern@gmail.com, tglx@linutronix.de, acme@kernel.org, linux-kernel@vger.kernel.org, mingo@kernel.org, acme@redhat.com, namhyung@kernel.org In-Reply-To: <20150812012406.11811.94691.stgit@localhost.localdomain> References: <20150812012406.11811.94691.stgit@localhost.localdomain> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf probe: Fix to show lines of sys_ functions correctly Git-Commit-ID: 75186a9b09e47072f442f43e292cd47180b67b5c X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 75186a9b09e47072f442f43e292cd47180b67b5c Gitweb: http://git.kernel.org/tip/75186a9b09e47072f442f43e292cd47180b67b5c Author: Masami Hiramatsu AuthorDate: Wed, 12 Aug 2015 10:24:07 +0900 Committer: Arnaldo Carvalho de Melo CommitDate: Wed, 12 Aug 2015 13:20:27 -0300 perf probe: Fix to show lines of sys_ functions correctly "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 Tested-by: Arnaldo Carvalho de Melo Cc: David Ahern Cc: Jiri Olsa Cc: Namhyung Kim Link: http://lkml.kernel.org/r/20150812012406.11811.94691.stgit@localhost.localdomain Signed-off-by: Arnaldo Carvalho de Melo --- 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);