diff options
Diffstat (limited to 'tools/perf/util/annotate.h')
| -rw-r--r-- | tools/perf/util/annotate.h | 67 | 
1 files changed, 58 insertions, 9 deletions
diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h index efa5dc82bfa..78a5692dd71 100644 --- a/tools/perf/util/annotate.h +++ b/tools/perf/util/annotate.h @@ -2,20 +2,69 @@  #define __PERF_ANNOTATE_H  #include <stdbool.h> +#include <stdint.h>  #include "types.h"  #include "symbol.h"  #include <linux/list.h>  #include <linux/rbtree.h> -struct objdump_line { -	struct list_head node; -	s64		 offset; -	char		 *line; +struct ins; + +struct ins_operands { +	char	*raw; +	struct { +		char	*raw; +		char	*name; +		u64	addr; +		u64	offset; +	} target; +	union { +		struct { +			char	*raw; +			char	*name; +			u64	addr; +		} source; +		struct { +			struct ins *ins; +			struct ins_operands *ops; +		} locked; +	}; +}; + +struct ins_ops { +	void (*free)(struct ins_operands *ops); +	int (*parse)(struct ins_operands *ops); +	int (*scnprintf)(struct ins *ins, char *bf, size_t size, +			 struct ins_operands *ops);  }; -void objdump_line__free(struct objdump_line *self); -struct objdump_line *objdump__get_next_ip_line(struct list_head *head, -					       struct objdump_line *pos); +struct ins { +	const char     *name; +	struct ins_ops *ops; +}; + +bool ins__is_jump(const struct ins *ins); +bool ins__is_call(const struct ins *ins); +int ins__scnprintf(struct ins *ins, char *bf, size_t size, struct ins_operands *ops); + +struct disasm_line { +	struct list_head    node; +	s64		    offset; +	char		    *line; +	char		    *name; +	struct ins	    *ins; +	struct ins_operands ops; +}; + +static inline bool disasm_line__has_offset(const struct disasm_line *dl) +{ +	return dl->ops.target.offset != UINT64_MAX; +} + +void disasm_line__free(struct disasm_line *dl); +struct disasm_line *disasm__get_next_ip_line(struct list_head *head, struct disasm_line *pos); +int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool raw); +size_t disasm__fprintf(struct list_head *head, FILE *fp);  struct sym_hist {  	u64		sum; @@ -32,7 +81,7 @@ struct source_line {   *   * @histogram: Array of addr hit histograms per event being monitored   * @lines: If 'print_lines' is specified, per source code line percentages - * @source: source parsed from objdump -dS + * @source: source parsed from a disassembler like objdump -dS   *   * lines is allocated, percentages calculated and all sorted by percentage   * when the annotation is about to be presented, so the percentages are for @@ -82,7 +131,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map, int evidx,  			    int context);  void symbol__annotate_zero_histogram(struct symbol *sym, int evidx);  void symbol__annotate_decay_histogram(struct symbol *sym, int evidx); -void objdump_line_list__purge(struct list_head *head); +void disasm__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,  |