forked from Minki/linux
9de89fe7c5
I noticed while writing the first test in 'perf regtest' that to just test the symbol handling routines one needs to create a perf session, that is a layer centered on a perf.data file, events, etc, so I untied these layers. This reduces the complexity for the users as the number of parameters to most of the symbols and session APIs now was reduced while not adding more state to all the map instances by only having data that is needed to split the kernel (kallsyms and ELF symtab sections) maps and do vmlinux relocation on the main kernel map. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Frédéric Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Paul Mackerras <paulus@samba.org> LKML-Reference: <1265223128-11786-1-git-send-email-acme@infradead.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
84 lines
1.8 KiB
C
84 lines
1.8 KiB
C
#ifndef __PERF_MAP_H
|
|
#define __PERF_MAP_H
|
|
|
|
#include <linux/compiler.h>
|
|
#include <linux/list.h>
|
|
#include <linux/rbtree.h>
|
|
#include <linux/types.h>
|
|
|
|
enum map_type {
|
|
MAP__FUNCTION = 0,
|
|
MAP__VARIABLE,
|
|
};
|
|
|
|
#define MAP__NR_TYPES (MAP__VARIABLE + 1)
|
|
|
|
struct dso;
|
|
struct ref_reloc_sym;
|
|
struct map_groups;
|
|
|
|
struct map {
|
|
union {
|
|
struct rb_node rb_node;
|
|
struct list_head node;
|
|
};
|
|
u64 start;
|
|
u64 end;
|
|
enum map_type type;
|
|
u64 pgoff;
|
|
u64 (*map_ip)(struct map *, u64);
|
|
u64 (*unmap_ip)(struct map *, u64);
|
|
struct dso *dso;
|
|
};
|
|
|
|
struct kmap {
|
|
struct ref_reloc_sym *ref_reloc_sym;
|
|
struct map_groups *kmaps;
|
|
};
|
|
|
|
static inline struct kmap *map__kmap(struct map *self)
|
|
{
|
|
return (struct kmap *)(self + 1);
|
|
}
|
|
|
|
static inline u64 map__map_ip(struct map *map, u64 ip)
|
|
{
|
|
return ip - map->start + map->pgoff;
|
|
}
|
|
|
|
static inline u64 map__unmap_ip(struct map *map, u64 ip)
|
|
{
|
|
return ip + map->start - map->pgoff;
|
|
}
|
|
|
|
static inline u64 identity__map_ip(struct map *map __used, u64 ip)
|
|
{
|
|
return ip;
|
|
}
|
|
|
|
struct symbol;
|
|
struct mmap_event;
|
|
|
|
typedef int (*symbol_filter_t)(struct map *map, struct symbol *sym);
|
|
|
|
void map__init(struct map *self, enum map_type type,
|
|
u64 start, u64 end, u64 pgoff, struct dso *dso);
|
|
struct map *map__new(struct mmap_event *event, enum map_type,
|
|
char *cwd, int cwdlen);
|
|
void map__delete(struct map *self);
|
|
struct map *map__clone(struct map *self);
|
|
int map__overlap(struct map *l, struct map *r);
|
|
size_t map__fprintf(struct map *self, FILE *fp);
|
|
|
|
int map__load(struct map *self, symbol_filter_t filter);
|
|
struct symbol *map__find_symbol(struct map *self,
|
|
u64 addr, symbol_filter_t filter);
|
|
struct symbol *map__find_symbol_by_name(struct map *self, const char *name,
|
|
symbol_filter_t filter);
|
|
void map__fixup_start(struct map *self);
|
|
void map__fixup_end(struct map *self);
|
|
|
|
void map__reloc_vmlinux(struct map *self);
|
|
|
|
#endif /* __PERF_MAP_H */
|