]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
perf callchain: Enable printing the srcline in the history
authorAndi Kleen <ak@linux.intel.com>
Thu, 13 Nov 2014 02:05:24 +0000 (18:05 -0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 24 Nov 2014 21:03:46 +0000 (18:03 -0300)
For lbr-as-callgraph we need to see the line number in the history,
because many LBR entries can be in a single function, and just
showing the same function name many times is not useful.

When the history code is configured to sort by address, also try to
resolve the address to a file:srcline and display this in the browser.
If that doesn't work still display the address.

This can be also useful without LBRs for understanding which call in a large
function (or in which inlined function) called something else.

Contains fixes from Namhyung Kim

v2: Refactor code into common function
v3: Fix GTK build
v4: Rebase

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: http://lkml.kernel.org/r/1415844328-4884-7-git-send-email-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/callchain.c
tools/perf/util/callchain.h
tools/perf/util/srcline.c

index 38da69c8c1ffd2e19d4be0103f7414e93cf374dd..b6624aeaaca9b5b865606e231620a1e4c6ba62fc 100644 (file)
@@ -815,7 +815,16 @@ char *callchain_list__sym_name(struct callchain_list *cl,
        int printed;
 
        if (cl->ms.sym) {
-               printed = scnprintf(bf, bfsize, "%s", cl->ms.sym->name);
+               if (callchain_param.key == CCKEY_ADDRESS &&
+                   cl->ms.map && !cl->srcline)
+                       cl->srcline = get_srcline(cl->ms.map->dso,
+                                                 map__rip_2objdump(cl->ms.map,
+                                                                   cl->ip));
+               if (cl->srcline)
+                       printed = scnprintf(bf, bfsize, "%s %s",
+                                       cl->ms.sym->name, cl->srcline);
+               else
+                       printed = scnprintf(bf, bfsize, "%s", cl->ms.sym->name);
        } else
                printed = scnprintf(bf, bfsize, "%#" PRIx64, cl->ip);
 
index 3e1ed15d11f114c90349bf48859e42a726e5f634..3f158474c8927339ba66e653459637be3eccb971 100644 (file)
@@ -70,6 +70,7 @@ extern struct callchain_param callchain_param;
 struct callchain_list {
        u64                     ip;
        struct map_symbol       ms;
+       char                   *srcline;
        struct list_head        list;
 };
 
index 77c180637138b6c00703e7bd5bcf2600d501adda..ac877f96fed7d23a5c074615391ed186a1f3c909 100644 (file)
@@ -258,7 +258,7 @@ char *get_srcline(struct dso *dso, unsigned long addr)
        const char *dso_name;
 
        if (!dso->has_srcline)
-               return SRCLINE_UNKNOWN;
+               goto out;
 
        if (dso->symsrc_filename)
                dso_name = dso->symsrc_filename;
@@ -289,7 +289,9 @@ out:
                dso->has_srcline = 0;
                dso__free_a2l(dso);
        }
-       return SRCLINE_UNKNOWN;
+       if (asprintf(&srcline, "%s[%lx]", dso->short_name, addr) < 0)
+               return SRCLINE_UNKNOWN;
+       return srcline;
 }
 
 void free_srcline(char *srcline)