OSDN Git Service

perf probe: Support DW_AT_const_value constant value
authorMasami Hiramatsu <mhiramat@kernel.org>
Mon, 18 Nov 2019 08:12:40 +0000 (17:12 +0900)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 18 Nov 2019 22:08:02 +0000 (19:08 -0300)
Support DW_AT_const_value for variable assignment instead of location.
Note that this requires ftrace supporting immediate value.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
Cc: Tom Zanussi <tom.zanussi@linux.intel.com>
Link: http://lore.kernel.org/lkml/157406476012.24476.16096289871757175775.stgit@devnote2
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/probe-file.c
tools/perf/util/probe-file.h
tools/perf/util/probe-finder.c

index a63f1a1..5003ba4 100644 (file)
@@ -1008,6 +1008,7 @@ enum ftrace_readme {
        FTRACE_README_UPROBE_REF_CTR,
        FTRACE_README_USER_ACCESS,
        FTRACE_README_MULTIPROBE_EVENT,
+       FTRACE_README_IMMEDIATE_VALUE,
        FTRACE_README_END,
 };
 
@@ -1022,6 +1023,7 @@ static struct {
        DEFINE_TYPE(FTRACE_README_UPROBE_REF_CTR, "*ref_ctr_offset*"),
        DEFINE_TYPE(FTRACE_README_USER_ACCESS, "*[u]<offset>*"),
        DEFINE_TYPE(FTRACE_README_MULTIPROBE_EVENT, "*Create/append/*"),
+       DEFINE_TYPE(FTRACE_README_IMMEDIATE_VALUE, "*\\imm-value,*"),
 };
 
 static bool scan_ftrace_readme(enum ftrace_readme type)
@@ -1092,3 +1094,8 @@ bool multiprobe_event_is_supported(void)
 {
        return scan_ftrace_readme(FTRACE_README_MULTIPROBE_EVENT);
 }
+
+bool immediate_value_is_supported(void)
+{
+       return scan_ftrace_readme(FTRACE_README_IMMEDIATE_VALUE);
+}
index 850d1b5..0dba88c 100644 (file)
@@ -72,6 +72,7 @@ bool kretprobe_offset_is_supported(void);
 bool uprobe_ref_ctr_is_supported(void);
 bool user_access_is_supported(void);
 bool multiprobe_event_is_supported(void);
+bool immediate_value_is_supported(void);
 #else  /* ! HAVE_LIBELF_SUPPORT */
 static inline struct probe_cache *probe_cache__new(const char *tgt __maybe_unused, struct nsinfo *nsi __maybe_unused)
 {
index f12ad50..33e9005 100644 (file)
@@ -177,6 +177,17 @@ static int convert_variable_location(Dwarf_Die *vr_die, Dwarf_Addr addr,
        if (dwarf_attr(vr_die, DW_AT_external, &attr) != NULL)
                goto static_var;
 
+       /* Constant value */
+       if (dwarf_attr(vr_die, DW_AT_const_value, &attr) &&
+           immediate_value_is_supported()) {
+               Dwarf_Sword snum;
+
+               dwarf_formsdata(&attr, &snum);
+               ret = asprintf(&tvar->value, "\\%ld", (long)snum);
+
+               return ret < 0 ? -ENOMEM : 0;
+       }
+
        /* TODO: handle more than 1 exprs */
        if (dwarf_attr(vr_die, DW_AT_location, &attr) == NULL)
                return -EINVAL; /* Broken DIE ? */