perf annotate: Move annotate functions to util/
They will be used by perf top, so that we have just one set of routines to do annotation. Rename "struct sym_priv" to "struct annotation", etc, to clarify this code a bit. Rename "struct sym_ext" to "struct source_line", to give it a meaningful name, that clarifies that it is a the result of an addr2line call, that is sorted by percentage one particular source code line appeared in the annotation. And since we're moving things around also rename 'sym_hist->ip' to 'sym_hist->addr' as we want to do data structure annotation at some point. Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Cc: Tom Zanussi <tzanussi@gmail.com> LKML-Reference: <new-submission> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
@ -1,9 +1,11 @@
|
||||
#include "../browser.h"
|
||||
#include "../helpline.h"
|
||||
#include "../libslang.h"
|
||||
#include "../../annotate.h"
|
||||
#include "../../hist.h"
|
||||
#include "../../sort.h"
|
||||
#include "../../symbol.h"
|
||||
#include "../../annotate.h"
|
||||
|
||||
static void ui__error_window(const char *fmt, ...)
|
||||
{
|
||||
@ -66,24 +68,26 @@ static double objdump_line__calc_percent(struct objdump_line *self,
|
||||
if (self->offset != -1) {
|
||||
int len = sym->end - sym->start;
|
||||
unsigned int hits = 0;
|
||||
struct sym_priv *priv = symbol__priv(sym);
|
||||
struct sym_ext *sym_ext = priv->ext;
|
||||
struct sym_hist *h = priv->hist;
|
||||
struct annotation *notes = symbol__annotation(sym);
|
||||
struct source_line *src_line = notes->src_line;
|
||||
struct sym_hist *h = notes->histogram;
|
||||
s64 offset = self->offset;
|
||||
struct objdump_line *next = objdump__get_next_ip_line(head, self);
|
||||
|
||||
|
||||
while (offset < (s64)len &&
|
||||
(next == NULL || offset < next->offset)) {
|
||||
if (sym_ext) {
|
||||
percent += sym_ext[offset].percent;
|
||||
if (src_line) {
|
||||
percent += src_line[offset].percent;
|
||||
} else
|
||||
hits += h->ip[offset];
|
||||
hits += h->addr[offset];
|
||||
|
||||
++offset;
|
||||
}
|
||||
|
||||
if (sym_ext == NULL && h->sum)
|
||||
/*
|
||||
* If the percentage wasn't already calculated in
|
||||
* symbol__get_source_line, do it now:
|
||||
*/
|
||||
if (src_line == NULL && h->sum)
|
||||
percent = 100.0 * hits / h->sum;
|
||||
}
|
||||
|
||||
@ -136,10 +140,10 @@ static void annotate_browser__set_top(struct annotate_browser *self,
|
||||
static int annotate_browser__run(struct annotate_browser *self)
|
||||
{
|
||||
struct rb_node *nd;
|
||||
struct hist_entry *he = self->b.priv;
|
||||
struct symbol *sym = self->b.priv;
|
||||
int key;
|
||||
|
||||
if (ui_browser__show(&self->b, he->ms.sym->name,
|
||||
if (ui_browser__show(&self->b, sym->name,
|
||||
"<-, -> or ESC: exit, TAB/shift+TAB: cycle thru samples") < 0)
|
||||
return -1;
|
||||
/*
|
||||
@ -179,7 +183,12 @@ out:
|
||||
return key;
|
||||
}
|
||||
|
||||
int hist_entry__tui_annotate(struct hist_entry *self)
|
||||
int hist_entry__tui_annotate(struct hist_entry *he)
|
||||
{
|
||||
return symbol__tui_annotate(he->ms.sym, he->ms.map);
|
||||
}
|
||||
|
||||
int symbol__tui_annotate(struct symbol *sym, struct map *map)
|
||||
{
|
||||
struct objdump_line *pos, *n;
|
||||
struct objdump_line_rb_node *rbpos;
|
||||
@ -190,18 +199,18 @@ int hist_entry__tui_annotate(struct hist_entry *self)
|
||||
.refresh = ui_browser__list_head_refresh,
|
||||
.seek = ui_browser__list_head_seek,
|
||||
.write = annotate_browser__write,
|
||||
.priv = self,
|
||||
.priv = sym,
|
||||
},
|
||||
};
|
||||
int ret;
|
||||
|
||||
if (self->ms.sym == NULL)
|
||||
if (sym == NULL)
|
||||
return -1;
|
||||
|
||||
if (self->ms.map->dso->annotate_warned)
|
||||
if (map->dso->annotate_warned)
|
||||
return -1;
|
||||
|
||||
if (hist_entry__annotate(self, &head, sizeof(*rbpos)) < 0) {
|
||||
if (symbol__annotate(sym, map, &head, sizeof(*rbpos)) < 0) {
|
||||
ui__error_window(ui_helpline__last_msg);
|
||||
return -1;
|
||||
}
|
||||
@ -214,7 +223,7 @@ int hist_entry__tui_annotate(struct hist_entry *self)
|
||||
browser.b.width = line_len;
|
||||
rbpos = objdump_line__rb(pos);
|
||||
rbpos->idx = browser.b.nr_entries++;
|
||||
rbpos->percent = objdump_line__calc_percent(pos, &head, self->ms.sym);
|
||||
rbpos->percent = objdump_line__calc_percent(pos, &head, sym);
|
||||
if (rbpos->percent < 0.01)
|
||||
continue;
|
||||
objdump__insert_line(&browser.entries, rbpos);
|
||||
|
Reference in New Issue
Block a user