Skip to content

Commit

Permalink
perf annotate: Separate objdump parsing from actual screen rendering
Browse files Browse the repository at this point in the history
Because in 'perf top' we'll need to parse just once and then, as samples
come, render multiple times with evolving counter values.

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>
  • Loading branch information
Arnaldo Carvalho de Melo committed Feb 6, 2011
1 parent d040bd3 commit f1e2701
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 19 deletions.
62 changes: 43 additions & 19 deletions tools/perf/util/annotate.c
Original file line number Diff line number Diff line change
Expand Up @@ -421,50 +421,74 @@ static void symbol__annotate_hits(struct symbol *sym, int evidx)
printf("%*s: %" PRIu64 "\n", BITS_PER_LONG / 2, "h->sum", h->sum);
}

int symbol__tty_annotate(struct symbol *sym, struct map *map, int evidx,
bool print_lines, bool full_paths, int min_pcnt,
int max_lines)
void symbol__annotate_printf(struct symbol *sym, struct map *map,
struct list_head *head, int evidx, bool full_paths,
int min_pcnt, int max_lines)
{
struct dso *dso = map->dso;
const char *filename = dso->long_name, *d_filename;
struct rb_root source_line = RB_ROOT;
struct objdump_line *pos, *n;
LIST_HEAD(head);
struct objdump_line *pos;
int printed = 2;
u64 len;

if (symbol__annotate(sym, map, &head, 0) < 0)
return -1;

if (full_paths)
d_filename = filename;
else
d_filename = basename(filename);

len = sym->end - sym->start;

if (print_lines) {
symbol__get_source_line(sym, map, evidx, &source_line,
len, filename);
print_summary(&source_line, filename);
}

printf(" Percent | Source code & Disassembly of %s\n", d_filename);
printf("------------------------------------------------\n");

if (verbose)
symbol__annotate_hits(sym, evidx);

list_for_each_entry_safe(pos, n, &head, node) {
objdump_line__print(pos, &head, sym, evidx, len, min_pcnt);
list_del(&pos->node);
objdump_line__free(pos);
list_for_each_entry(pos, head, node) {
objdump_line__print(pos, head, sym, evidx, len, min_pcnt);
if (max_lines && ++printed >= max_lines)
break;

}
}

void objdump_line_list__purge(struct list_head *head)
{
struct objdump_line *pos, *n;

list_for_each_entry_safe(pos, n, head, node) {
list_del(&pos->node);
objdump_line__free(pos);
}
}

int symbol__tty_annotate(struct symbol *sym, struct map *map, int evidx,
bool print_lines, bool full_paths, int min_pcnt,
int max_lines)
{
struct dso *dso = map->dso;
const char *filename = dso->long_name;
struct rb_root source_line = RB_ROOT;
LIST_HEAD(head);
u64 len;

if (symbol__annotate(sym, map, &head, 0) < 0)
return -1;

len = sym->end - sym->start;

if (print_lines) {
symbol__get_source_line(sym, map, evidx, &source_line,
len, filename);
print_summary(&source_line, filename);
}

symbol__annotate_printf(sym, map, &head, evidx, full_paths,
min_pcnt, max_lines);
if (print_lines)
symbol__free_source_line(sym, len);

objdump_line_list__purge(&head);

return 0;
}
4 changes: 4 additions & 0 deletions tools/perf/util/annotate.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ int symbol__alloc_hist(struct symbol *sym, int nevents);

int symbol__annotate(struct symbol *sym, struct map *map,
struct list_head *head, size_t privsize);
void symbol__annotate_printf(struct symbol *sym, struct map *map,
struct list_head *head, int evidx, bool full_paths,
int min_pcnt, int max_lines);
void objdump_line_list__purge(struct list_head *head);

int symbol__tty_annotate(struct symbol *sym, struct map *map, int evidx,
bool print_lines, bool full_paths, int min_pcnt,
Expand Down

0 comments on commit f1e2701

Please sign in to comment.