perf script: Fix symoff printing in callchains
authorAdrian Hunter <adrian.hunter@intel.com>
Fri, 6 Dec 2013 07:42:56 +0000 (09:42 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 9 Dec 2013 14:13:50 +0000 (11:13 -0300)
The address being used to calculate the offset was the memory address
but the address needed is the address mapped to the dso. i.e. the 'addr'
member of 'struct addr_location'

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: David Ahern <dsahern@gmail.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1386315778-11633-2-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/session.c

index 8a7da6f4a569b3eb726b862c9ff3ea7ba86b73bb..c236b38ed02b4b285117aff6dbdca24e46340f67 100644 (file)
@@ -1515,6 +1515,8 @@ void perf_evsel__print_ip(struct perf_evsel *evsel, struct perf_sample *sample,
                        node_al = *al;
 
                while (stack_depth) {
+                       u64 addr = 0;
+
                        node = callchain_cursor_current(&callchain_cursor);
                        if (!node)
                                break;
@@ -1525,10 +1527,13 @@ void perf_evsel__print_ip(struct perf_evsel *evsel, struct perf_sample *sample,
                        if (print_ip)
                                printf("%c%16" PRIx64, s, node->ip);
 
+                       if (node->map)
+                               addr = node->map->map_ip(node->map, node->ip);
+
                        if (print_sym) {
                                printf(" ");
                                if (print_symoffset) {
-                                       node_al.addr = node->ip;
+                                       node_al.addr = addr;
                                        node_al.map  = node->map;
                                        symbol__fprintf_symname_offs(node->sym, &node_al, stdout);
                                } else