perf annotate: Parse instruction
Commit-ID: 5145418b06fa907883ff1f62301d534a0d26ba18 Gitweb: http://git.kernel.org/tip/5145418b06fa907883ff1f62301d534a0d26ba18 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Sun, 15 Apr 2012 15:52:18 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 16 Apr 2012 12:15:07 -0300
perf annotate: Parse instruction
For lines with instructions find the name and operands, breaking those tokens for consumption by the browser.
Cc David Ahern <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Cc Mike Galbraith <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Paul Mackerras <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Stephane Eranian <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/annotate.c | 65 +++++++++++++++++++++++++++++++++++++++++++- tools/perf/util/annotate.h | 3 ++ 2 files changed, 67 insertions(+), 1 deletions(-)
tools/perf/util/annotate.c +64 -1
@@ -80,16 +80,50 @@ int symbol__inc_addr_samples(struct symbol *sym, struct map *map,static struct disasm_line *disasm_line__new (s64 offset,char *line,size_t privsize) { -struct disasm_line *dl =malloc (sizeof (*dl) + privsize); +struct disasm_line *dl =zalloc (sizeof (*dl) + privsize);if (dl !=NULL ) { dl->offset = offset; dl->line =strdup (line);if (dl->line ==NULL ) goto out_delete; + +if (offset !=-1 ) { +char *name = dl->line, tmp; + +while (isspace (name[0 ])) + ++name; + +if (name[0 ] =='\0' ) + goto out_delete; + + dl->operands = name +1 ; + +while (dl->operands[0 ] !='\0' && + !isspace (dl->operands[0 ])) + ++dl->operands; + + tmp = dl->operands[0 ]; + dl->operands[0 ] ='\0' ; + dl->name =strdup (name); + +if (dl->name ==NULL ) + goto out_free_line; + + dl->operands[0 ] = tmp; + +if (dl->operands[0 ] !='\0' ) { + dl->operands++; +while (isspace (dl->operands[0 ])) + ++dl->operands; + } + } }return dl; + +out_free_line: +free (dl->line); out_delete:free (dl);return NULL ;
@@ -98,6 +132,7 @@ out_delete:void disasm_line__free (struct disasm_line *dl) {free (dl->line); +free (dl->name);free (dl); }
@@ -591,6 +626,34 @@ void disasm__purge(struct list_head *head) } } +static size_t disasm_line__fprintf (struct disasm_line *dl,FILE *fp) +{ +size_t printed; + +if (dl->offset ==-1 ) +return fprintf (fp,"%s\n" , dl->line); + + printed =fprintf (fp,"%#" PRIx64" %s" , dl->offset, dl->name); + +if (dl->operands[0 ] !='\0' ) { + printed +=fprintf (fp,"%.*s %s\n" ,6 - (int )printed," " , + dl->operands); + } + +return printed +fprintf (fp,"\n" ); +} + +size_t disasm__fprintf (struct list_head *head,FILE *fp) +{ +struct disasm_line *pos; +size_t printed =0 ; + +list_for_each_entry (pos, head, node) + printed +=disasm_line__fprintf (pos, fp); + +return printed; +} +int symbol__tty_annotate (struct symbol *sym,struct map *map,int evidx,bool print_lines,bool full_paths,int min_pcnt,int max_lines)
tools/perf/util/annotate.h +3 -0
@@ -11,10 +11,13 @@ struct disasm_line {struct list_head node;s64 offset;char *line; +char *name; +char *operands; };void disasm_line__free (struct disasm_line *dl);struct disasm_line *disasm__get_next_ip_line (struct list_head *head,struct disasm_line *pos); +size_t disasm__fprintf (struct list_head *head,FILE *fp);struct sym_hist {u64 sum;