perf tools: Factorize the map helpers
Factorize the dso mapping helpers into a single purpose common file "util/map.c" Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Mike Galbraith <efault@gmx.de> Cc: Brice Goglin <Brice.Goglin@inria.fr>
This commit is contained in:
@@ -51,83 +51,6 @@ struct sym_ext {
|
||||
char *path;
|
||||
};
|
||||
|
||||
struct map {
|
||||
struct list_head node;
|
||||
u64 start;
|
||||
u64 end;
|
||||
u64 pgoff;
|
||||
u64 (*map_ip)(struct map *, u64);
|
||||
struct dso *dso;
|
||||
};
|
||||
|
||||
static u64 map__map_ip(struct map *map, u64 ip)
|
||||
{
|
||||
return ip - map->start + map->pgoff;
|
||||
}
|
||||
|
||||
static u64 vdso__map_ip(struct map *map __used, u64 ip)
|
||||
{
|
||||
return ip;
|
||||
}
|
||||
|
||||
static struct map *map__new(struct mmap_event *event)
|
||||
{
|
||||
struct map *self = malloc(sizeof(*self));
|
||||
|
||||
if (self != NULL) {
|
||||
const char *filename = event->filename;
|
||||
|
||||
self->start = event->start;
|
||||
self->end = event->start + event->len;
|
||||
self->pgoff = event->pgoff;
|
||||
|
||||
self->dso = dsos__findnew(filename);
|
||||
if (self->dso == NULL)
|
||||
goto out_delete;
|
||||
|
||||
if (self->dso == vdso)
|
||||
self->map_ip = vdso__map_ip;
|
||||
else
|
||||
self->map_ip = map__map_ip;
|
||||
}
|
||||
return self;
|
||||
out_delete:
|
||||
free(self);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct map *map__clone(struct map *self)
|
||||
{
|
||||
struct map *map = malloc(sizeof(*self));
|
||||
|
||||
if (!map)
|
||||
return NULL;
|
||||
|
||||
memcpy(map, self, sizeof(*self));
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
static int map__overlap(struct map *l, struct map *r)
|
||||
{
|
||||
if (l->start > r->start) {
|
||||
struct map *t = l;
|
||||
l = r;
|
||||
r = t;
|
||||
}
|
||||
|
||||
if (l->end > r->start)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static size_t map__fprintf(struct map *self, FILE *fp)
|
||||
{
|
||||
return fprintf(fp, " %Lx-%Lx %Lx %s\n",
|
||||
self->start, self->end, self->pgoff, self->dso->name);
|
||||
}
|
||||
|
||||
|
||||
struct thread {
|
||||
struct rb_node rb_node;
|
||||
@@ -797,7 +720,7 @@ static int
|
||||
process_mmap_event(event_t *event, unsigned long offset, unsigned long head)
|
||||
{
|
||||
struct thread *thread = threads__findnew(event->mmap.pid);
|
||||
struct map *map = map__new(&event->mmap);
|
||||
struct map *map = map__new(&event->mmap, NULL, 0);
|
||||
|
||||
dprintf("%p [%p]: PERF_EVENT_MMAP %d: [%p(%p) @ %p]: %s\n",
|
||||
(void *)(offset + head),
|
||||
|
Reference in New Issue
Block a user