linux/tools/perf/util/annotate.h
<<
>>
Prefs
   1#ifndef __PERF_ANNOTATE_H
   2#define __PERF_ANNOTATE_H
   3
   4#include <stdbool.h>
   5#include "types.h"
   6#include "symbol.h"
   7#include <linux/list.h>
   8#include <linux/rbtree.h>
   9
  10struct objdump_line {
  11        struct list_head node;
  12        s64              offset;
  13        char             *line;
  14};
  15
  16void objdump_line__free(struct objdump_line *self);
  17struct objdump_line *objdump__get_next_ip_line(struct list_head *head,
  18                                               struct objdump_line *pos);
  19
  20struct sym_hist {
  21        u64             sum;
  22        u64             addr[0];
  23};
  24
  25struct source_line {
  26        struct rb_node  node;
  27        double          percent;
  28        char            *path;
  29};
  30
  31/** struct annotated_source - symbols with hits have this attached as in sannotation
  32 *
  33 * @histogram: Array of addr hit histograms per event being monitored
  34 * @lines: If 'print_lines' is specified, per source code line percentages
  35 * @source: source parsed from objdump -dS
  36 *
  37 * lines is allocated, percentages calculated and all sorted by percentage
  38 * when the annotation is about to be presented, so the percentages are for
  39 * one of the entries in the histogram array, i.e. for the event/counter being
  40 * presented. It is deallocated right after symbol__{tui,tty,etc}_annotate
  41 * returns.
  42 */
  43struct annotated_source {
  44        struct list_head   source;
  45        struct source_line *lines;
  46        int                nr_histograms;
  47        int                sizeof_sym_hist;
  48        struct sym_hist    histograms[0];
  49};
  50
  51struct annotation {
  52        pthread_mutex_t         lock;
  53        struct annotated_source *src;
  54};
  55
  56struct sannotation {
  57        struct annotation annotation;
  58        struct symbol     symbol;
  59};
  60
  61static inline struct sym_hist *annotation__histogram(struct annotation *notes, int idx)
  62{
  63        return (((void *)&notes->src->histograms) +
  64                (notes->src->sizeof_sym_hist * idx));
  65}
  66
  67static inline struct annotation *symbol__annotation(struct symbol *sym)
  68{
  69        struct sannotation *a = container_of(sym, struct sannotation, symbol);
  70        return &a->annotation;
  71}
  72
  73int symbol__inc_addr_samples(struct symbol *sym, struct map *map,
  74                             int evidx, u64 addr);
  75int symbol__alloc_hist(struct symbol *sym, int nevents);
  76void symbol__annotate_zero_histograms(struct symbol *sym);
  77
  78int symbol__annotate(struct symbol *sym, struct map *map, size_t privsize);
  79int symbol__annotate_init(struct map *map __used, struct symbol *sym);
  80int symbol__annotate_printf(struct symbol *sym, struct map *map, int evidx,
  81                            bool full_paths, int min_pcnt, int max_lines,
  82                            int context);
  83void symbol__annotate_zero_histogram(struct symbol *sym, int evidx);
  84void symbol__annotate_decay_histogram(struct symbol *sym, int evidx);
  85void objdump_line_list__purge(struct list_head *head);
  86
  87int symbol__tty_annotate(struct symbol *sym, struct map *map, int evidx,
  88                         bool print_lines, bool full_paths, int min_pcnt,
  89                         int max_lines);
  90
  91#ifdef NO_NEWT_SUPPORT
  92static inline int symbol__tui_annotate(struct symbol *sym __used,
  93                                       struct map *map __used,
  94                                       int evidx __used, int refresh __used)
  95{
  96        return 0;
  97}
  98#else
  99int symbol__tui_annotate(struct symbol *sym, struct map *map, int evidx,
 100                         int refresh);
 101#endif
 102
 103#endif  /* __PERF_ANNOTATE_H */
 104