forked from luck/tmp_suning_uos_patched
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:
parent
4c47f4fcd6
commit
d5dbc518cd
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user