perf hists browser: Allow annotating entries in callchains

Instead of annotating just the top level hist_entry, allow instead
annotating a map_symbol, i.e. the top level hist_entry or one of the
callchains for which there were samples.

Suggested-by: Stephane Eranian <eranian@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: http://lkml.kernel.org/n/tip-k1zxj5564je9jei4yd15ouwn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Arnaldo Carvalho de Melo 2015-03-17 18:27:28 -03:00
parent 4c47f4fcd6
commit d5dbc518cd
3 changed files with 26 additions and 14 deletions

View File

@ -829,10 +829,16 @@ static int annotate_browser__run(struct annotate_browser *browser,
return key; return key;
} }
int map_symbol__tui_annotate(struct map_symbol *ms, struct perf_evsel *evsel,
struct hist_browser_timer *hbt)
{
return symbol__tui_annotate(ms->sym, ms->map, evsel, hbt);
}
int hist_entry__tui_annotate(struct hist_entry *he, struct perf_evsel *evsel, int hist_entry__tui_annotate(struct hist_entry *he, struct perf_evsel *evsel,
struct hist_browser_timer *hbt) struct hist_browser_timer *hbt)
{ {
return symbol__tui_annotate(he->ms.sym, he->ms.map, evsel, hbt); return map_symbol__tui_annotate(&he->ms, evsel, hbt);
} }
static void annotate_browser__mark_jump_targets(struct annotate_browser *browser, static void annotate_browser__mark_jump_targets(struct annotate_browser *browser,

View File

@ -1704,6 +1704,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
if (choice == annotate || choice == annotate_t || choice == annotate_f) { if (choice == annotate || choice == annotate_t || choice == annotate_f) {
struct hist_entry *he; struct hist_entry *he;
struct annotation *notes; struct annotation *notes;
struct map_symbol ms;
int err; int err;
do_annotate: do_annotate:
if (!objdump_path && perf_session_env__lookup_objdump(env)) if (!objdump_path && perf_session_env__lookup_objdump(env))
@ -1713,25 +1714,21 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
if (he == NULL) if (he == NULL)
continue; continue;
/*
* we stash the branch_info symbol + map into the
* the ms so we don't have to rewrite all the annotation
* code to use branch_info.
* in branch mode, the ms struct is not used
*/
if (choice == annotate_f) { if (choice == annotate_f) {
he->ms.sym = he->branch_info->from.sym; ms.map = he->branch_info->from.map;
he->ms.map = he->branch_info->from.map; ms.sym = he->branch_info->from.sym;
} else if (choice == annotate_t) { } else if (choice == annotate_t) {
he->ms.sym = he->branch_info->to.sym; ms.map = he->branch_info->to.map;
he->ms.map = he->branch_info->to.map; ms.sym = he->branch_info->to.sym;
} else {
ms = *browser->selection;
} }
notes = symbol__annotation(he->ms.sym); notes = symbol__annotation(ms.sym);
if (!notes->src) if (!notes->src)
continue; continue;
err = hist_entry__tui_annotate(he, evsel, hbt); err = map_symbol__tui_annotate(&ms, evsel, hbt);
/* /*
* offer option to annotate the other branch source or target * offer option to annotate the other branch source or target
* (if they exists) when returning from annotate * (if they exists) when returning from annotate

View File

@ -303,6 +303,9 @@ struct hist_browser_timer {
#ifdef HAVE_SLANG_SUPPORT #ifdef HAVE_SLANG_SUPPORT
#include "../ui/keysyms.h" #include "../ui/keysyms.h"
int map_symbol__tui_annotate(struct map_symbol *ms, struct perf_evsel *evsel,
struct hist_browser_timer *hbt);
int hist_entry__tui_annotate(struct hist_entry *he, struct perf_evsel *evsel, int hist_entry__tui_annotate(struct hist_entry *he, struct perf_evsel *evsel,
struct hist_browser_timer *hbt); struct hist_browser_timer *hbt);
@ -321,6 +324,12 @@ int perf_evlist__tui_browse_hists(struct perf_evlist *evlist __maybe_unused,
{ {
return 0; return 0;
} }
static inline int map_symbol__tui_annotate(struct map_symbol *ms __maybe_unused,
struct perf_evsel *evsel __maybe_unused,
struct hist_browser_timer *hbt __maybe_unused)
{
return 0;
}
static inline int hist_entry__tui_annotate(struct hist_entry *he __maybe_unused, static inline int hist_entry__tui_annotate(struct hist_entry *he __maybe_unused,
struct perf_evsel *evsel __maybe_unused, struct perf_evsel *evsel __maybe_unused,