Lines Matching refs:map

19 static void __maps__insert(struct maps *maps, struct map *map);
127 void map__init(struct map *map, enum map_type type, in map__init() argument
130 map->type = type; in map__init()
131 map->start = start; in map__init()
132 map->end = end; in map__init()
133 map->pgoff = pgoff; in map__init()
134 map->reloc = 0; in map__init()
135 map->dso = dso__get(dso); in map__init()
136 map->map_ip = map__map_ip; in map__init()
137 map->unmap_ip = map__unmap_ip; in map__init()
138 RB_CLEAR_NODE(&map->rb_node); in map__init()
139 map->groups = NULL; in map__init()
140 map->erange_warned = false; in map__init()
141 atomic_set(&map->refcnt, 1); in map__init()
144 struct map *map__new(struct machine *machine, u64 start, u64 len, in map__new()
149 struct map *map = malloc(sizeof(*map)); in map__new() local
151 if (map != NULL) { in map__new()
161 map->maj = d_maj; in map__new()
162 map->min = d_min; in map__new()
163 map->ino = ino; in map__new()
164 map->ino_generation = ino_gen; in map__new()
165 map->prot = prot; in map__new()
166 map->flags = flags; in map__new()
187 map__init(map, type, start, start + len, pgoff, dso); in map__new()
190 map->map_ip = map->unmap_ip = identity__map_ip; in map__new()
198 dso__set_loaded(dso, map->type); in map__new()
202 return map; in map__new()
204 free(map); in map__new()
213 struct map *map__new2(u64 start, struct dso *dso, enum map_type type) in map__new2()
215 struct map *map = calloc(1, (sizeof(*map) + in map__new2() local
217 if (map != NULL) { in map__new2()
221 map__init(map, type, start, 0, 0, dso); in map__new2()
224 return map; in map__new2()
236 bool __map__is_kernel(const struct map *map) in __map__is_kernel() argument
238 return __machine__kernel_map(map->groups->machine, map->type) == map; in __map__is_kernel()
241 static void map__exit(struct map *map) in map__exit() argument
243 BUG_ON(!RB_EMPTY_NODE(&map->rb_node)); in map__exit()
244 dso__zput(map->dso); in map__exit()
247 void map__delete(struct map *map) in map__delete() argument
249 map__exit(map); in map__delete()
250 free(map); in map__delete()
253 void map__put(struct map *map) in map__put() argument
255 if (map && atomic_dec_and_test(&map->refcnt)) in map__put()
256 map__delete(map); in map__put()
259 void map__fixup_start(struct map *map) in map__fixup_start() argument
261 struct rb_root *symbols = &map->dso->symbols[map->type]; in map__fixup_start()
265 map->start = sym->start; in map__fixup_start()
269 void map__fixup_end(struct map *map) in map__fixup_end() argument
271 struct rb_root *symbols = &map->dso->symbols[map->type]; in map__fixup_end()
275 map->end = sym->end; in map__fixup_end()
281 int map__load(struct map *map, symbol_filter_t filter) in map__load() argument
283 const char *name = map->dso->long_name; in map__load()
286 if (dso__loaded(map->dso, map->type)) in map__load()
289 nr = dso__load(map->dso, map, filter); in map__load()
291 if (map->dso->has_build_id) { in map__load()
294 build_id__sprintf(map->dso->build_id, in map__load()
295 sizeof(map->dso->build_id), in map__load()
330 struct symbol *map__find_symbol(struct map *map, u64 addr, in map__find_symbol() argument
333 if (map__load(map, filter) < 0) in map__find_symbol()
336 return dso__find_symbol(map->dso, map->type, addr); in map__find_symbol()
339 struct symbol *map__find_symbol_by_name(struct map *map, const char *name, in map__find_symbol_by_name() argument
342 if (map__load(map, filter) < 0) in map__find_symbol_by_name()
345 if (!dso__sorted_by_name(map->dso, map->type)) in map__find_symbol_by_name()
346 dso__sort_by_name(map->dso, map->type); in map__find_symbol_by_name()
348 return dso__find_symbol_by_name(map->dso, map->type, name); in map__find_symbol_by_name()
351 struct map *map__clone(struct map *from) in map__clone()
353 struct map *map = memdup(from, sizeof(*map)); in map__clone() local
355 if (map != NULL) { in map__clone()
356 atomic_set(&map->refcnt, 1); in map__clone()
357 RB_CLEAR_NODE(&map->rb_node); in map__clone()
358 dso__get(map->dso); in map__clone()
359 map->groups = NULL; in map__clone()
362 return map; in map__clone()
365 int map__overlap(struct map *l, struct map *r) in map__overlap()
368 struct map *t = l; in map__overlap()
379 size_t map__fprintf(struct map *map, FILE *fp) in map__fprintf() argument
382 map->start, map->end, map->pgoff, map->dso->name); in map__fprintf()
385 size_t map__fprintf_dsoname(struct map *map, FILE *fp) in map__fprintf_dsoname() argument
389 if (map && map->dso && (map->dso->name || map->dso->long_name)) { in map__fprintf_dsoname()
390 if (symbol_conf.show_kernel_path && map->dso->long_name) in map__fprintf_dsoname()
391 dsoname = map->dso->long_name; in map__fprintf_dsoname()
392 else if (map->dso->name) in map__fprintf_dsoname()
393 dsoname = map->dso->name; in map__fprintf_dsoname()
399 int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix, in map__fprintf_srcline() argument
405 if (map && map->dso) { in map__fprintf_srcline()
406 srcline = get_srcline(map->dso, in map__fprintf_srcline()
407 map__rip_2objdump(map, addr), NULL, true); in map__fprintf_srcline()
426 u64 map__rip_2objdump(struct map *map, u64 rip) in map__rip_2objdump() argument
428 if (!map->dso->adjust_symbols) in map__rip_2objdump()
431 if (map->dso->rel) in map__rip_2objdump()
432 return rip - map->pgoff; in map__rip_2objdump()
434 return map->unmap_ip(map, rip) - map->reloc; in map__rip_2objdump()
449 u64 map__objdump_2mem(struct map *map, u64 ip) in map__objdump_2mem() argument
451 if (!map->dso->adjust_symbols) in map__objdump_2mem()
452 return map->unmap_ip(map, ip); in map__objdump_2mem()
454 if (map->dso->rel) in map__objdump_2mem()
455 return map->unmap_ip(map, ip + map->pgoff); in map__objdump_2mem()
457 return ip + map->reloc; in map__objdump_2mem()
482 struct map *pos = rb_entry(next, struct map, rb_node); in __maps__purge()
541 struct map **mapp, in map_groups__find_symbol()
544 struct map *map = map_groups__find(mg, type, addr); in map_groups__find_symbol() local
547 if (map != NULL && map__load(map, filter) >= 0) { in map_groups__find_symbol()
549 *mapp = map; in map_groups__find_symbol()
550 return map__find_symbol(map, map->map_ip(map, addr), filter); in map_groups__find_symbol()
557 struct map **mapp, symbol_filter_t filter) in maps__find_symbol_by_name()
565 struct map *pos = rb_entry(nd, struct map, rb_node); in maps__find_symbol_by_name()
585 struct map **mapp, in map_groups__find_symbol_by_name()
595 if (ams->addr < ams->map->start || ams->addr >= ams->map->end) { in map_groups__find_ams()
596 if (ams->map->groups == NULL) in map_groups__find_ams()
598 ams->map = map_groups__find(ams->map->groups, ams->map->type, in map_groups__find_ams()
600 if (ams->map == NULL) in map_groups__find_ams()
604 ams->al_addr = ams->map->map_ip(ams->map, ams->addr); in map_groups__find_ams()
605 ams->sym = map__find_symbol(ams->map, ams->al_addr, filter); in map_groups__find_ams()
618 struct map *pos = rb_entry(nd, struct map, rb_node); in maps__fprintf()
647 static void __map_groups__insert(struct map_groups *mg, struct map *map) in __map_groups__insert() argument
649 __maps__insert(&mg->maps[map->type], map); in __map_groups__insert()
650 map->groups = mg; in __map_groups__insert()
653 static int maps__fixup_overlappings(struct maps *maps, struct map *map, FILE *fp) in maps__fixup_overlappings() argument
665 struct map *pos = rb_entry(next, struct map, rb_node); in maps__fixup_overlappings()
668 if (!map__overlap(pos, map)) in maps__fixup_overlappings()
673 map__fprintf(map, fp); in maps__fixup_overlappings()
682 if (map->start > pos->start) { in maps__fixup_overlappings()
683 struct map *before = map__clone(pos); in maps__fixup_overlappings()
690 before->end = map->start; in maps__fixup_overlappings()
696 if (map->end < pos->end) { in maps__fixup_overlappings()
697 struct map *after = map__clone(pos); in maps__fixup_overlappings()
704 after->start = map->end; in maps__fixup_overlappings()
722 int map_groups__fixup_overlappings(struct map_groups *mg, struct map *map, in map_groups__fixup_overlappings() argument
725 return maps__fixup_overlappings(&mg->maps[map->type], map, fp); in map_groups__fixup_overlappings()
735 struct map *map; in map_groups__clone() local
740 for (map = maps__first(maps); map; map = map__next(map)) { in map_groups__clone()
741 struct map *new = map__clone(map); in map_groups__clone()
753 static void __maps__insert(struct maps *maps, struct map *map) in __maps__insert() argument
757 const u64 ip = map->start; in __maps__insert()
758 struct map *m; in __maps__insert()
762 m = rb_entry(parent, struct map, rb_node); in __maps__insert()
769 rb_link_node(&map->rb_node, parent, p); in __maps__insert()
770 rb_insert_color(&map->rb_node, &maps->entries); in __maps__insert()
771 map__get(map); in __maps__insert()
774 void maps__insert(struct maps *maps, struct map *map) in maps__insert() argument
777 __maps__insert(maps, map); in maps__insert()
781 static void __maps__remove(struct maps *maps, struct map *map) in __maps__remove() argument
783 rb_erase_init(&map->rb_node, &maps->entries); in __maps__remove()
784 map__put(map); in __maps__remove()
787 void maps__remove(struct maps *maps, struct map *map) in maps__remove() argument
790 __maps__remove(maps, map); in maps__remove()
794 struct map *maps__find(struct maps *maps, u64 ip) in maps__find()
797 struct map *m; in maps__find()
804 m = rb_entry(parent, struct map, rb_node); in maps__find()
819 struct map *maps__first(struct maps *maps) in maps__first()
824 return rb_entry(first, struct map, rb_node); in maps__first()
828 struct map *map__next(struct map *map) in map__next() argument
830 struct rb_node *next = rb_next(&map->rb_node); in map__next()
833 return rb_entry(next, struct map, rb_node); in map__next()
837 struct kmap *map__kmap(struct map *map) in map__kmap() argument
839 if (!map->dso || !map->dso->kernel) { in map__kmap()
843 return (struct kmap *)(map + 1); in map__kmap()
846 struct map_groups *map__kmaps(struct map *map) in map__kmaps() argument
848 struct kmap *kmap = map__kmap(map); in map__kmaps()