Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
annotate.h
Go to the documentation of this file.
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 #include <pthread.h>
11 
12 struct ins;
13 
14 struct ins_operands {
15  char *raw;
16  struct {
17  char *raw;
18  char *name;
21  } target;
22  union {
23  struct {
24  char *raw;
25  char *name;
26  u64 addr;
27  } source;
28  struct {
29  struct ins *ins;
30  struct ins_operands *ops;
31  } locked;
32  };
33 };
34 
35 struct ins_ops {
36  void (*free)(struct ins_operands *ops);
37  int (*parse)(struct ins_operands *ops);
38  int (*scnprintf)(struct ins *ins, char *bf, size_t size,
39  struct ins_operands *ops);
40 };
41 
42 struct ins {
43  const char *name;
44  struct ins_ops *ops;
45 };
46 
47 bool ins__is_jump(const struct ins *ins);
48 bool ins__is_call(const struct ins *ins);
49 int ins__scnprintf(struct ins *ins, char *bf, size_t size, struct ins_operands *ops);
50 
51 struct disasm_line {
52  struct list_head node;
54  char *line;
55  char *name;
56  struct ins *ins;
57  struct ins_operands ops;
58 };
59 
60 static inline bool disasm_line__has_offset(const struct disasm_line *dl)
61 {
62  return dl->ops.target.offset != UINT64_MAX;
63 }
64 
65 void disasm_line__free(struct disasm_line *dl);
67 int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool raw);
68 size_t disasm__fprintf(struct list_head *head, FILE *fp);
69 
70 struct sym_hist {
72  u64 addr[0];
73 };
74 
75 struct source_line {
76  struct rb_node node;
77  double percent;
78  char *path;
79 };
80 
94  struct list_head source;
95  struct source_line *lines;
98  struct sym_hist histograms[0];
99 };
100 
101 struct annotation {
102  pthread_mutex_t lock;
104 };
105 
106 struct sannotation {
108  struct symbol symbol;
109 };
110 
111 static inline struct sym_hist *annotation__histogram(struct annotation *notes, int idx)
112 {
113  return (((void *)&notes->src->histograms) +
114  (notes->src->sizeof_sym_hist * idx));
115 }
116 
117 static inline struct annotation *symbol__annotation(struct symbol *sym)
118 {
119  struct sannotation *a = container_of(sym, struct sannotation, symbol);
120  return &a->annotation;
121 }
122 
123 int symbol__inc_addr_samples(struct symbol *sym, struct map *map,
124  int evidx, u64 addr);
125 int symbol__alloc_hist(struct symbol *sym);
126 void symbol__annotate_zero_histograms(struct symbol *sym);
127 
128 int symbol__annotate(struct symbol *sym, struct map *map, size_t privsize);
129 int symbol__annotate_init(struct map *map __maybe_unused, struct symbol *sym);
130 int symbol__annotate_printf(struct symbol *sym, struct map *map, int evidx,
131  bool full_paths, int min_pcnt, int max_lines,
132  int context);
133 void symbol__annotate_zero_histogram(struct symbol *sym, int evidx);
134 void symbol__annotate_decay_histogram(struct symbol *sym, int evidx);
135 void disasm__purge(struct list_head *head);
136 
137 int symbol__tty_annotate(struct symbol *sym, struct map *map, int evidx,
138  bool print_lines, bool full_paths, int min_pcnt,
139  int max_lines);
140 
141 #ifdef NEWT_SUPPORT
142 int symbol__tui_annotate(struct symbol *sym, struct map *map, int evidx,
143  void(*timer)(void *arg), void *arg, int delay_secs);
144 #else
145 static inline int symbol__tui_annotate(struct symbol *sym __maybe_unused,
146  struct map *map __maybe_unused,
147  int evidx __maybe_unused,
148  void(*timer)(void *arg) __maybe_unused,
149  void *arg __maybe_unused,
150  int delay_secs __maybe_unused)
151 {
152  return 0;
153 }
154 #endif
155 
156 extern const char *disassembler_style;
157 extern const char *objdump_path;
158 
159 #endif /* __PERF_ANNOTATE_H */