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 <[email protected]>
Signed-off-by: He Kuang <[email protected]>
---
 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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to