perf probe: Improve error message when %return is on inlined function
[firefly-linux-kernel-4.4.55.git] / tools / perf / util / probe-finder.c
index f0708ffd5e07f28c0c17723ba82673cf7d6f9601..bd8f03de5e408293a642478a795c6436143edbcf 100644 (file)
@@ -594,6 +594,7 @@ static int find_variable(Dwarf_Die *sc_die, struct probe_finder *pf)
 /* Convert subprogram DIE to trace point */
 static int convert_to_trace_point(Dwarf_Die *sp_die, Dwfl_Module *mod,
                                  Dwarf_Addr paddr, bool retprobe,
+                                 const char *function,
                                  struct probe_trace_point *tp)
 {
        Dwarf_Addr eaddr, highaddr;
@@ -637,8 +638,10 @@ static int convert_to_trace_point(Dwarf_Die *sp_die, Dwfl_Module *mod,
        /* Return probe must be on the head of a subprogram */
        if (retprobe) {
                if (eaddr != paddr) {
-                       pr_warning("Return probe must be on the head of"
-                                  " a real function.\n");
+                       pr_warning("Failed to find \"%s%%return\",\n"
+                                  " because %s is an inlined function and"
+                                  " has no return point.\n", function,
+                                  function);
                        return -EINVAL;
                }
                tp->retprobe = true;
@@ -1178,6 +1181,7 @@ static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf)
 {
        struct trace_event_finder *tf =
                        container_of(pf, struct trace_event_finder, pf);
+       struct perf_probe_point *pp = &pf->pev->point;
        struct probe_trace_event *tev;
        struct perf_probe_arg *args;
        int ret, i;
@@ -1192,7 +1196,7 @@ static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf)
 
        /* Trace point should be converted from subprogram DIE */
        ret = convert_to_trace_point(&pf->sp_die, tf->mod, pf->addr,
-                                    pf->pev->point.retprobe, &tev->point);
+                                    pp->retprobe, pp->function, &tev->point);
        if (ret < 0)
                return ret;
 
@@ -1322,6 +1326,7 @@ static int add_available_vars(Dwarf_Die *sc_die, struct probe_finder *pf)
 {
        struct available_var_finder *af =
                        container_of(pf, struct available_var_finder, pf);
+       struct perf_probe_point *pp = &pf->pev->point;
        struct variable_list *vl;
        Dwarf_Die die_mem;
        int ret;
@@ -1335,7 +1340,7 @@ static int add_available_vars(Dwarf_Die *sc_die, struct probe_finder *pf)
 
        /* Trace point should be converted from subprogram DIE */
        ret = convert_to_trace_point(&pf->sp_die, af->mod, pf->addr,
-                                    pf->pev->point.retprobe, &vl->point);
+                                    pp->retprobe, pp->function, &vl->point);
        if (ret < 0)
                return ret;