Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753635AbbGALzG (ORCPT ); Wed, 1 Jul 2015 07:55:06 -0400 Received: from szxga02-in.huawei.com ([119.145.14.65]:46262 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750869AbbGALyb (ORCPT ); Wed, 1 Jul 2015 07:54:31 -0400 From: He Kuang To: , , , , , CC: , , , Subject: [PATCH v2 1/2] perf probe: Enable --range option according to libdw version Date: Wed, 1 Jul 2015 11:53:23 +0000 Message-ID: <1435751604-145643-1-git-send-email-hekuang@huawei.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <5593C843.6000200@hitachi.com> References: <5593C843.6000200@hitachi.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.107.197.210] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3001 Lines: 78 The option --range uses function dwarf_getlocations() which was first introduced to libdw in elfutils version 0.157. Without this API, there's no easy way to get locations ranges by the givin attribute. This patch check if elfutils version meets the requirements before enable this feature, so that perf can be built with old libdw. Reported-by: Alexei Starovoitov Signed-off-by: He Kuang --- tools/perf/builtin-probe.c | 2 ++ tools/perf/util/dwarf-aux.c | 2 ++ tools/perf/util/dwarf-aux.h | 13 ++++++++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c index 1272559..2760c06 100644 --- a/tools/perf/builtin-probe.c +++ b/tools/perf/builtin-probe.c @@ -372,8 +372,10 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) "Show accessible variables on PROBEDEF", opt_show_vars), OPT_BOOLEAN('\0', "externs", &probe_conf.show_ext_vars, "Show external variables too (with --vars only)"), +#if _ELFUTILS_PREREQ(0, 157) OPT_BOOLEAN('\0', "range", &probe_conf.show_location_range, "Show variables location range in scope (with --vars only)"), +#endif OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name, "file", "vmlinux pathname"), OPT_STRING('s', "source", &symbol_conf.source_prefix, diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c index 57f3ef4..2cb4c82 100644 --- a/tools/perf/util/dwarf-aux.c +++ b/tools/perf/util/dwarf-aux.c @@ -950,6 +950,7 @@ int die_get_varname(Dwarf_Die *vr_die, struct strbuf *buf) return 0; } +#if _ELFUTILS_PREREQ(0, 157) /** * die_get_var_innermost_scope - Get innermost scope range of given variable DIE * @sp_die: a subprogram DIE @@ -1071,3 +1072,4 @@ int die_get_var_range(Dwarf_Die *sp_die, Dwarf_Die *vr_die, struct strbuf *buf) return ret; } +#endif /* _ELFUTILS_PREREQ(0, 157) */ diff --git a/tools/perf/util/dwarf-aux.h b/tools/perf/util/dwarf-aux.h index c42ec36..ade0c50 100644 --- a/tools/perf/util/dwarf-aux.h +++ b/tools/perf/util/dwarf-aux.h @@ -125,6 +125,17 @@ extern int die_get_typename(Dwarf_Die *vr_die, struct strbuf *buf); /* Get the name and type of given variable DIE, stored as "type\tname" */ extern int die_get_varname(Dwarf_Die *vr_die, struct strbuf *buf); +#if _ELFUTILS_PREREQ(0, 157) extern int die_get_var_range(Dwarf_Die *sp_die, Dwarf_Die *vr_die, - struct strbuf *buf); + struct strbuf *buf); +#else +static inline +int die_get_var_range(Dwarf_Die *sp_die __maybe_unused, + Dwarf_Die *vr_die __maybe_unused, + struct strbuf *buf __maybe_unused) +{ + return -ENOTSUP; +} + +#endif /* _ELFUTILS_PREREQ(0, 157) */ #endif -- 1.8.5.2 -- 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/