From: Andi Kleen <[email protected]>

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 <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Link: 
http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
 tools/perf/util/callchain.c | 11 ++++++++++-
 tools/perf/util/callchain.h |  1 +
 tools/perf/util/srcline.c   |  6 ++++--
 3 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
index 38da69c8c1ff..b6624aeaaca9 100644
--- a/tools/perf/util/callchain.c
+++ b/tools/perf/util/callchain.c
@@ -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);
 
diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h
index 3e1ed15d11f1..3f158474c892 100644
--- a/tools/perf/util/callchain.h
+++ b/tools/perf/util/callchain.h
@@ -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;
 };
 
diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c
index 77c180637138..ac877f96fed7 100644
--- a/tools/perf/util/srcline.c
+++ b/tools/perf/util/srcline.c
@@ -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)
-- 
1.9.3

--
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