blob: 9cee9c788dbf5db1c97cded80d9795d6d8b81179 [file] [log] [blame]
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -02001#ifndef __PERF_MAP_H
2#define __PERF_MAP_H
3
4#include <linux/compiler.h>
5#include <linux/list.h>
6#include <linux/rbtree.h>
7#include <linux/types.h>
8
9enum map_type {
10 MAP__FUNCTION = 0,
11 MAP__VARIABLE,
12};
13
14#define MAP__NR_TYPES (MAP__VARIABLE + 1)
15
16struct dso;
Arnaldo Carvalho de Melo9de89fe2010-02-03 16:52:00 -020017struct ref_reloc_sym;
18struct map_groups;
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -020019
20struct map {
21 union {
22 struct rb_node rb_node;
23 struct list_head node;
24 };
25 u64 start;
26 u64 end;
27 enum map_type type;
28 u64 pgoff;
Kirill Smelkov7a2b6202010-02-03 16:52:07 -020029
30 /* ip -> dso rip */
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -020031 u64 (*map_ip)(struct map *, u64);
Kirill Smelkov7a2b6202010-02-03 16:52:07 -020032 /* dso rip -> ip */
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -020033 u64 (*unmap_ip)(struct map *, u64);
Kirill Smelkov7a2b6202010-02-03 16:52:07 -020034
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -020035 struct dso *dso;
36};
37
Arnaldo Carvalho de Melo9de89fe2010-02-03 16:52:00 -020038struct kmap {
39 struct ref_reloc_sym *ref_reloc_sym;
40 struct map_groups *kmaps;
41};
42
43static inline struct kmap *map__kmap(struct map *self)
44{
45 return (struct kmap *)(self + 1);
46}
47
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -020048static inline u64 map__map_ip(struct map *map, u64 ip)
49{
50 return ip - map->start + map->pgoff;
51}
52
53static inline u64 map__unmap_ip(struct map *map, u64 ip)
54{
55 return ip + map->start - map->pgoff;
56}
57
58static inline u64 identity__map_ip(struct map *map __used, u64 ip)
59{
60 return ip;
61}
62
Kirill Smelkov7a2b6202010-02-03 16:52:07 -020063
64/* rip -> addr suitable for passing to `objdump --start-address=` */
65u64 map__rip_2objdump(struct map *map, u64 rip);
66
67
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -020068struct symbol;
69struct mmap_event;
70
71typedef int (*symbol_filter_t)(struct map *map, struct symbol *sym);
72
73void map__init(struct map *self, enum map_type type,
74 u64 start, u64 end, u64 pgoff, struct dso *dso);
75struct map *map__new(struct mmap_event *event, enum map_type,
76 char *cwd, int cwdlen);
77void map__delete(struct map *self);
78struct map *map__clone(struct map *self);
79int map__overlap(struct map *l, struct map *r);
80size_t map__fprintf(struct map *self, FILE *fp);
81
Arnaldo Carvalho de Melo9de89fe2010-02-03 16:52:00 -020082int map__load(struct map *self, symbol_filter_t filter);
83struct symbol *map__find_symbol(struct map *self,
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -020084 u64 addr, symbol_filter_t filter);
85struct symbol *map__find_symbol_by_name(struct map *self, const char *name,
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -020086 symbol_filter_t filter);
87void map__fixup_start(struct map *self);
88void map__fixup_end(struct map *self);
89
Arnaldo Carvalho de Melo9de89fe2010-02-03 16:52:00 -020090void map__reloc_vmlinux(struct map *self);
91
Arnaldo Carvalho de Melo4a58e612009-12-27 21:37:00 -020092#endif /* __PERF_MAP_H */