Re: [PATCH 03/10] perf, tools: Use al.addr to set up call chain

From: Jiri Olsa
Date: Thu Dec 11 2014 - 16:46:49 EST


On Thu, Nov 13, 2014 at 04:16:33PM -0300, Arnaldo Carvalho de Melo wrote:
> Em Wed, Nov 12, 2014 at 06:05:21PM -0800, Andi Kleen escreveu:
> > From: Andi Kleen <ak@xxxxxxxxxxxxxxx>
> >
> > Use the relative address, this makes get_srcline work correctly
> > in the end.
>
> Applied.
>
> > Signed-off-by: Andi Kleen <ak@xxxxxxxxxxxxxxx>
> > ---
> > tools/perf/util/machine.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
> > index 2e16d69..066e963 100644
> > --- a/tools/perf/util/machine.c
> > +++ b/tools/perf/util/machine.c
> > @@ -1411,7 +1411,7 @@ static int add_callchain_ip(struct thread *thread,
> > }
> > }
> >
> > - return callchain_cursor_append(&callchain_cursor, ip, al.map, al.sym);
> > + return callchain_cursor_append(&callchain_cursor, al.addr, al.map, al.sym);
> > }
> >
> > struct branch_info *sample__resolve_bstack(struct perf_sample *sample,
> > --
> > 1.9.3

hi,
this patch also changed the output of callchain entries
with 'map' but with no symbol, like in following diff:

---
---get_next_seq
|
- |--70.16%-- 0x40e1cf
+ |--70.16%-- 0xe1cf
| 0x841f0f
|
- |--25.83%-- 0x40e153
+ |--25.83%-- 0xe153
| 0x841f0f
|
- --4.00%-- 0x40e27f
+ --4.00%-- 0xe27f
--

I'm guessing this change was unintentional..? in case we have a map
but no symbol seeing full address is more clear than relative at
least for binary, not sure about DSOs..

thoughts?

thanks,
jirka


---
diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
index 64b377e591e4..a4fb25fb26f5 100644
--- a/tools/perf/util/callchain.c
+++ b/tools/perf/util/callchain.c
@@ -816,22 +816,30 @@ out:
char *callchain_list__sym_name(struct callchain_list *cl,
char *bf, size_t bfsize, bool show_dso)
{
+ struct map *map = cl->ms.map;
int printed;

if (cl->ms.sym) {
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),
+ map && !cl->srcline) {
+ cl->srcline = get_srcline(map->dso,
+ map__rip_2objdump(map, cl->ip),
cl->ms.sym, false);
+ }
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);
+ } else {
+ /*
+ * The cl->ip value is unbased ip (applied map->map_ip).
+ * Display the unmap ip in case we have no symbol.
+ */
+ u64 addr = map ? map->unmap_ip(map, cl->ip) : cl->ip;
+
+ printed = scnprintf(bf, bfsize, "%#" PRIx64, addr);
+ }

if (show_dso)
scnprintf(bf + printed, bfsize - printed, " %s",

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/