diff options
Diffstat (limited to 'tools/perf/util/annotate.h')
| -rw-r--r-- | tools/perf/util/annotate.h | 115 | 
1 files changed, 112 insertions, 3 deletions
| diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h index ce427445671f..db8d09bea07e 100644 --- a/tools/perf/util/annotate.h +++ b/tools/perf/util/annotate.h @@ -24,9 +24,11 @@ struct ins_operands {  	struct {  		char	*raw;  		char	*name; +		struct symbol *sym;  		u64	addr;  		s64	offset;  		bool	offset_avail; +		bool	outside;  	} target;  	union {  		struct { @@ -45,7 +47,7 @@ struct arch;  struct ins_ops {  	void (*free)(struct ins_operands *ops); -	int (*parse)(struct arch *arch, struct ins_operands *ops, struct map *map); +	int (*parse)(struct arch *arch, struct ins_operands *ops, struct map_symbol *ms);  	int (*scnprintf)(struct ins *ins, char *bf, size_t size,  			 struct ins_operands *ops);  }; @@ -57,6 +59,21 @@ bool ins__is_lock(const struct ins *ins);  int ins__scnprintf(struct ins *ins, char *bf, size_t size, struct ins_operands *ops);  bool ins__is_fused(struct arch *arch, const char *ins1, const char *ins2); +#define ANNOTATION__IPC_WIDTH 6 +#define ANNOTATION__CYCLES_WIDTH 6 + +struct annotation_options { +	bool hide_src_code, +	     use_offset, +	     jump_arrows, +	     show_linenr, +	     show_nr_jumps, +	     show_nr_samples, +	     show_total_period; +}; + +extern struct annotation_options annotation__default_options; +  struct annotation;  struct sym_hist_entry { @@ -76,10 +93,13 @@ struct annotation_line {  	s64			 offset;  	char			*line;  	int			 line_nr; +	int			 jump_sources;  	float			 ipc;  	u64			 cycles;  	size_t			 privsize;  	char			*path; +	u32			 idx; +	int			 idx_asm;  	int			 samples_nr;  	struct annotation_data	 samples[0];  }; @@ -97,14 +117,52 @@ static inline struct disasm_line *disasm_line(struct annotation_line *al)  	return al ? container_of(al, struct disasm_line, al) : NULL;  } -static inline bool disasm_line__has_offset(const struct disasm_line *dl) +/* + * Is this offset in the same function as the line it is used? + * asm functions jump to other functions, for instance. + */ +static inline bool disasm_line__has_local_offset(const struct disasm_line *dl)  { -	return dl->ops.target.offset_avail; +	return dl->ops.target.offset_avail && !dl->ops.target.outside;  } +/* + * Can we draw an arrow from the jump to its target, for instance? I.e. + * is the jump and its target in the same function? + */ +bool disasm_line__is_valid_local_jump(struct disasm_line *dl, struct symbol *sym); +  void disasm_line__free(struct disasm_line *dl);  struct annotation_line *  annotation_line__next(struct annotation_line *pos, struct list_head *head); + +struct annotation_write_ops { +	bool first_line, current_entry, change_color; +	int  width; +	void *obj; +	int  (*set_color)(void *obj, int color); +	void (*set_percent_color)(void *obj, double percent, bool current); +	int  (*set_jumps_percent_color)(void *obj, int nr, bool current); +	void (*printf)(void *obj, const char *fmt, ...); +	void (*write_graph)(void *obj, int graph); +}; + +double annotation_line__max_percent(struct annotation_line *al, struct annotation *notes); +void annotation_line__write(struct annotation_line *al, struct annotation *notes, +			    struct annotation_write_ops *ops); + +int __annotation__scnprintf_samples_period(struct annotation *notes, +					   char *bf, size_t size, +					   struct perf_evsel *evsel, +					   bool show_freq); + +static inline int annotation__scnprintf_samples_period(struct annotation *notes, +						       char *bf, size_t size, +						       struct perf_evsel *evsel) +{ +	return __annotation__scnprintf_samples_period(notes, bf, size, evsel, true); +} +  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);  void symbol__calc_percent(struct symbol *sym, struct perf_evsel *evsel); @@ -150,9 +208,47 @@ struct annotated_source {  struct annotation {  	pthread_mutex_t		lock;  	u64			max_coverage; +	u64			start; +	struct annotation_options *options; +	struct annotation_line	**offsets; +	int			nr_events; +	int			nr_jumps; +	int			max_jump_sources; +	int			nr_entries; +	int			nr_asm_entries; +	u16			max_line_len; +	struct { +		u8		addr; +		u8		jumps; +		u8		target; +		u8		min_addr; +		u8		max_addr; +	} widths; +	bool			have_cycles;  	struct annotated_source *src;  }; +static inline int annotation__cycles_width(struct annotation *notes) +{ +	return notes->have_cycles ? ANNOTATION__IPC_WIDTH + ANNOTATION__CYCLES_WIDTH : 0; +} + +static inline int annotation__pcnt_width(struct annotation *notes) +{ +	return (notes->options->show_total_period ? 12 : 7) * notes->nr_events; +} + +static inline bool annotation_line__filter(struct annotation_line *al, struct annotation *notes) +{ +	return notes->options->hide_src_code && al->offset == -1; +} + +void annotation__set_offsets(struct annotation *notes, s64 size); +void annotation__compute_ipc(struct annotation *notes, size_t size); +void annotation__mark_jump_targets(struct annotation *notes, struct symbol *sym); +void annotation__update_column_widths(struct annotation *notes); +void annotation__init_column_widths(struct annotation *notes, struct symbol *sym); +  static inline struct sym_hist *annotation__histogram(struct annotation *notes, int idx)  {  	return (((void *)¬es->src->histograms) + @@ -180,6 +276,10 @@ void symbol__annotate_zero_histograms(struct symbol *sym);  int symbol__annotate(struct symbol *sym, struct map *map,  		     struct perf_evsel *evsel, size_t privsize,  		     struct arch **parch); +int symbol__annotate2(struct symbol *sym, struct map *map, +		      struct perf_evsel *evsel, +		      struct annotation_options *options, +		      struct arch **parch);  enum symbol_disassemble_errno {  	SYMBOL_ANNOTATE_ERRNO__SUCCESS		= 0, @@ -204,16 +304,23 @@ int symbol__strerror_disassemble(struct symbol *sym, struct map *map,  int symbol__annotate_printf(struct symbol *sym, struct map *map,  			    struct perf_evsel *evsel, bool full_paths,  			    int min_pcnt, int max_lines, int context); +int symbol__annotate_fprintf2(struct symbol *sym, FILE *fp);  void symbol__annotate_zero_histogram(struct symbol *sym, int evidx);  void symbol__annotate_decay_histogram(struct symbol *sym, int evidx);  void annotated_source__purge(struct annotated_source *as); +int map_symbol__annotation_dump(struct map_symbol *ms, struct perf_evsel *evsel); +  bool ui__has_annotation(void);  int symbol__tty_annotate(struct symbol *sym, struct map *map,  			 struct perf_evsel *evsel, bool print_lines,  			 bool full_paths, int min_pcnt, int max_lines); +int symbol__tty_annotate2(struct symbol *sym, struct map *map, +			  struct perf_evsel *evsel, bool print_lines, +			  bool full_paths); +  #ifdef HAVE_SLANG_SUPPORT  int symbol__tui_annotate(struct symbol *sym, struct map *map,  			 struct perf_evsel *evsel, @@ -231,4 +338,6 @@ static inline int symbol__tui_annotate(struct symbol *sym __maybe_unused,  extern const char	*disassembler_style; +void annotation_config__init(void); +  #endif	/* __PERF_ANNOTATE_H */ |