linux/tools/perf/util/annotate.h
<<
>>
Prefs
   1#ifndef __PERF_ANNOTATE_H
   2#define __PERF_ANNOTATE_H
   3
   4#include <stdbool.h>
   5#include <stdint.h>
   6#include "types.h"
   7#include "symbol.h"
   8#include <linux/list.h>
   9#include <linux/rbtree.h>
  10
  11struct ins;
  12
  13struct ins_operands {
  14        char    *raw;
  15        struct {
  16                char    *raw;
  17                char    *name;
  18                u64     addr;
  19                u64     offset;
  20        } target;
  21        union {
  22                struct {
  23                        char    *raw;
  24                        char    *name;
  25                        u64     addr;
  26                } source;
  27                struct {
  28                        struct ins *ins;
  29                        struct ins_operands *ops;
  30                } locked;
  31        };
  32};
  33
  34struct ins_ops {
  35        void (*free)(struct ins_operands *ops);
  36        int (*parse)(struct ins_operands *ops);
  37        int (*scnprintf)(struct ins *ins, char *bf, size_t size,
  38                         struct ins_operands *ops);
  39};
  40
  41struct ins {
  42        const char     *name;
  43        struct ins_ops *ops;
  44};
  45
  46bool ins__is_jump(const struct ins *ins);
  47bool ins__is_call(const struct ins *ins);
  48int ins__scnprintf(struct ins *ins, char *bf, size_t size, struct ins_operands *ops);
  49
  50struct disasm_line {
  51        struct list_head    node;
  52        s64                 offset;
  53        char                *line;
  54        char                *name;
  55        struct ins          *ins;
  56        struct ins_operands ops;
  57};
  58
  59static inline bool disasm_line__has_offset(const struct disasm_line *dl)
  60{
  61        return dl->ops.target.offset != UINT64_MAX;
  62}
  63
  64void disasm_line__free(struct disasm_line *dl);
  65struct disasm_line *disasm__get_next_ip_line(struct list_head *head, struct disasm_line *pos);
  66int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool raw);
  67size_t disasm__fprintf(struct list_head *head, FILE *fp);
  68
  69struct sym_hist {
  70        u64             sum;
  71        u64             addr[0];
  72};
  73
  74struct source_line {
  75        struct rb_node  node;
  76        double          percent;
  77        char            *path;
  78};
  79
  80/** struct annotated_source - symbols with hits have this attached as in sannotation
  81 *
  82 * @histogram: Array of addr hit histograms per event being monitored
  83 * @lines: If 'print_lines' is specified, per source code line percentages
  84 * @source: source parsed from a disassembler like objdump -dS
  85 *
  86 * lines is allocated, percentages calculated and all sorted by percentage
  87 * when the annotation is about to be presented, so the percentages are for
  88 * one of the entries in the histogram array, i.e. for the event/counter being
  89 * presented. It is deallocated right after symbol__{tui,tty,etc}_annotate
  90 * returns.
  91 */
  92struct annotated_source {
  93        struct list_head   source;
  94        struct source_line *lines;
  95        int                nr_histograms;
  96        int                sizeof_sym_hist;
  97        struct sym_hist    histograms[0];
  98};
  99
 100struct annotation {
 101        pthread_mutex_t         lock;
 102        struct annotated_source *src;
 103};
 104
 105struct sannotation {
 106        struct annotation annotation;
 107        struct symbol     symbol;
 108};
 109
 110static inline struct sym_hist *annotation__histogram(struct annotation *notes, int idx)
 111{
 112        return (((void *)&notes->src->histograms) +
 113                (notes->src->sizeof_sym_hist * idx));
 114}
 115
 116static inline struct annotation *symbol__annotation(struct symbol *sym)
 117{
 118        struct sannotation *a = container_of(sym, struct sannotation, symbol);
 119        return &a->annotation;
 120}
 121
 122int symbol__inc_addr_samples(struct symbol *sym, struct map *map,
 123                             int evidx, u64 addr);
 124int symbol__alloc_hist(struct symbol *sym);
 125void symbol__annotate_zero_histograms(struct symbol *sym);
 126
 127int symbol__annotate(struct symbol *sym, struct map *map, size_t privsize);
 128int symbol__annotate_init(struct map *map __used, struct symbol *sym);
 129int symbol__annotate_printf(struct symbol *sym, struct map *map, int evidx,
 130                            bool full_paths, int min_pcnt, int max_lines,
 131                            int context);
 132void symbol__annotate_zero_histogram(struct symbol *sym, int evidx);
 133void symbol__annotate_decay_histogram(struct symbol *sym, int evidx);
 134void disasm__purge(struct list_head *head);
 135
 136int symbol__tty_annotate(struct symbol *sym, struct map *map, int evidx,
 137                         bool print_lines, bool full_paths, int min_pcnt,
 138                         int max_lines);
 139
 140#ifdef NO_NEWT_SUPPORT
 141static inline int symbol__tui_annotate(struct symbol *sym __used,
 142                                       struct map *map __used,
 143                                       int evidx __used,
 144                                       void(*timer)(void *arg) __used,
 145                                       void *arg __used, int delay_secs __used)
 146{
 147        return 0;
 148}
 149#else
 150int symbol__tui_annotate(struct symbol *sym, struct map *map, int evidx,
 151                         void(*timer)(void *arg), void *arg, int delay_secs);
 152#endif
 153
 154extern const char       *disassembler_style;
 155
 156#endif  /* __PERF_ANNOTATE_H */
 157