Lines Matching refs:map
28 static void __maps__insert(struct maps *maps, struct map *map);
29 static void __maps__insert_name(struct maps *maps, struct map *map);
133 void map__init(struct map *map, u64 start, u64 end, u64 pgoff, struct dso *dso) in map__init() argument
135 map->start = start; in map__init()
136 map->end = end; in map__init()
137 map->pgoff = pgoff; in map__init()
138 map->reloc = 0; in map__init()
139 map->dso = dso__get(dso); in map__init()
140 map->map_ip = map__map_ip; in map__init()
141 map->unmap_ip = map__unmap_ip; in map__init()
142 RB_CLEAR_NODE(&map->rb_node); in map__init()
143 map->groups = NULL; in map__init()
144 map->erange_warned = false; in map__init()
145 refcount_set(&map->refcnt, 1); in map__init()
148 struct map *map__new(struct machine *machine, u64 start, u64 len, in map__new()
153 struct map *map = malloc(sizeof(*map)); in map__new() local
157 if (map != NULL) { in map__new()
167 map->maj = d_maj; in map__new()
168 map->min = d_min; in map__new()
169 map->ino = ino; in map__new()
170 map->ino_generation = ino_gen; in map__new()
171 map->prot = prot; in map__new()
172 map->flags = flags; in map__new()
205 map__init(map, start, start + len, pgoff, dso); in map__new()
208 map->map_ip = map->unmap_ip = identity__map_ip; in map__new()
221 return map; in map__new()
224 free(map); in map__new()
233 struct map *map__new2(u64 start, struct dso *dso) in map__new2()
235 struct map *map = calloc(1, (sizeof(*map) + in map__new2() local
237 if (map != NULL) { in map__new2()
241 map__init(map, start, 0, 0, dso); in map__new2()
244 return map; in map__new2()
256 bool __map__is_kernel(const struct map *map) in __map__is_kernel() argument
258 return machine__kernel_map(map->groups->machine) == map; in __map__is_kernel()
261 bool __map__is_extra_kernel_map(const struct map *map) in __map__is_extra_kernel_map() argument
263 struct kmap *kmap = __map__kmap((struct map *)map); in __map__is_extra_kernel_map()
268 bool __map__is_bpf_prog(const struct map *map) in __map__is_bpf_prog() argument
272 if (map->dso->binary_type == DSO_BINARY_TYPE__BPF_PROG_INFO) in __map__is_bpf_prog()
280 name = map->dso->short_name; in __map__is_bpf_prog()
284 bool map__has_symbols(const struct map *map) in map__has_symbols() argument
286 return dso__has_symbols(map->dso); in map__has_symbols()
289 static void map__exit(struct map *map) in map__exit() argument
291 BUG_ON(!RB_EMPTY_NODE(&map->rb_node)); in map__exit()
292 dso__zput(map->dso); in map__exit()
295 void map__delete(struct map *map) in map__delete() argument
297 map__exit(map); in map__delete()
298 free(map); in map__delete()
301 void map__put(struct map *map) in map__put() argument
303 if (map && refcount_dec_and_test(&map->refcnt)) in map__put()
304 map__delete(map); in map__put()
307 void map__fixup_start(struct map *map) in map__fixup_start() argument
309 struct rb_root_cached *symbols = &map->dso->symbols; in map__fixup_start()
313 map->start = sym->start; in map__fixup_start()
317 void map__fixup_end(struct map *map) in map__fixup_end() argument
319 struct rb_root_cached *symbols = &map->dso->symbols; in map__fixup_end()
323 map->end = sym->end; in map__fixup_end()
329 int map__load(struct map *map) in map__load() argument
331 const char *name = map->dso->long_name; in map__load()
334 if (dso__loaded(map->dso)) in map__load()
337 nr = dso__load(map->dso, map); in map__load()
339 if (map->dso->has_build_id) { in map__load()
342 build_id__sprintf(map->dso->build_id, in map__load()
343 sizeof(map->dso->build_id), in map__load()
371 struct symbol *map__find_symbol(struct map *map, u64 addr) in map__find_symbol() argument
373 if (map__load(map) < 0) in map__find_symbol()
376 return dso__find_symbol(map->dso, addr); in map__find_symbol()
379 struct symbol *map__find_symbol_by_name(struct map *map, const char *name) in map__find_symbol_by_name() argument
381 if (map__load(map) < 0) in map__find_symbol_by_name()
384 if (!dso__sorted_by_name(map->dso)) in map__find_symbol_by_name()
385 dso__sort_by_name(map->dso); in map__find_symbol_by_name()
387 return dso__find_symbol_by_name(map->dso, name); in map__find_symbol_by_name()
390 struct map *map__clone(struct map *from) in map__clone()
392 struct map *map = memdup(from, sizeof(*map)); in map__clone() local
394 if (map != NULL) { in map__clone()
395 refcount_set(&map->refcnt, 1); in map__clone()
396 RB_CLEAR_NODE(&map->rb_node); in map__clone()
397 dso__get(map->dso); in map__clone()
398 map->groups = NULL; in map__clone()
401 return map; in map__clone()
404 size_t map__fprintf(struct map *map, FILE *fp) in map__fprintf() argument
407 map->start, map->end, map->pgoff, map->dso->name); in map__fprintf()
410 size_t map__fprintf_dsoname(struct map *map, FILE *fp) in map__fprintf_dsoname() argument
415 if (map && map->dso) { in map__fprintf_dsoname()
416 if (symbol_conf.show_kernel_path && map->dso->long_name) in map__fprintf_dsoname()
417 dsoname = map->dso->long_name; in map__fprintf_dsoname()
419 dsoname = map->dso->name; in map__fprintf_dsoname()
430 char *map__srcline(struct map *map, u64 addr, struct symbol *sym) in map__srcline() argument
432 if (map == NULL) in map__srcline()
434 return get_srcline(map->dso, map__rip_2objdump(map, addr), sym, true, true, addr); in map__srcline()
437 int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix, in map__fprintf_srcline() argument
442 if (map && map->dso) { in map__fprintf_srcline()
443 char *srcline = map__srcline(map, addr, NULL); in map__fprintf_srcline()
451 int map__fprintf_srccode(struct map *map, u64 addr, in map__fprintf_srccode() argument
461 if (!map || !map->dso) in map__fprintf_srccode()
463 srcfile = get_srcline_split(map->dso, in map__fprintf_srccode()
464 map__rip_2objdump(map, addr), in map__fprintf_srccode()
513 u64 map__rip_2objdump(struct map *map, u64 rip) in map__rip_2objdump() argument
515 struct kmap *kmap = __map__kmap(map); in map__rip_2objdump()
523 struct map *kernel_map = machine__kernel_map(kmap->kmaps->machine); in map__rip_2objdump()
526 map = kernel_map; in map__rip_2objdump()
529 if (!map->dso->adjust_symbols) in map__rip_2objdump()
532 if (map->dso->rel) in map__rip_2objdump()
533 return rip - map->pgoff; in map__rip_2objdump()
539 if (map->dso->kernel == DSO_TYPE_USER) in map__rip_2objdump()
540 return rip + map->dso->text_offset; in map__rip_2objdump()
542 return map->unmap_ip(map, rip) - map->reloc; in map__rip_2objdump()
557 u64 map__objdump_2mem(struct map *map, u64 ip) in map__objdump_2mem() argument
559 if (!map->dso->adjust_symbols) in map__objdump_2mem()
560 return map->unmap_ip(map, ip); in map__objdump_2mem()
562 if (map->dso->rel) in map__objdump_2mem()
563 return map->unmap_ip(map, ip + map->pgoff); in map__objdump_2mem()
569 if (map->dso->kernel == DSO_TYPE_USER) in map__objdump_2mem()
570 return map->unmap_ip(map, ip - map->dso->text_offset); in map__objdump_2mem()
572 return ip + map->reloc; in map__objdump_2mem()
589 void map_groups__insert(struct map_groups *mg, struct map *map) in map_groups__insert() argument
591 maps__insert(&mg->maps, map); in map_groups__insert()
592 map->groups = mg; in map_groups__insert()
601 struct map *pos = rb_entry(next, struct map, rb_node); in __maps__purge()
615 struct map *pos = rb_entry(next, struct map, rb_node_name); in __maps__purge_names()
665 u64 addr, struct map **mapp) in map_groups__find_symbol()
667 struct map *map = map_groups__find(mg, addr); in map_groups__find_symbol() local
670 if (map != NULL && map__load(map) >= 0) { in map_groups__find_symbol()
672 *mapp = map; in map_groups__find_symbol()
673 return map__find_symbol(map, map->map_ip(map, addr)); in map_groups__find_symbol()
679 static bool map__contains_symbol(struct map *map, struct symbol *sym) in map__contains_symbol() argument
681 u64 ip = map->unmap_ip(map, sym->start); in map__contains_symbol()
683 return ip >= map->start && ip < map->end; in map__contains_symbol()
687 struct map **mapp) in maps__find_symbol_by_name()
695 struct map *pos = rb_entry(nd, struct map, rb_node); in maps__find_symbol_by_name()
718 struct map **mapp) in map_groups__find_symbol_by_name()
725 if (ams->addr < ams->map->start || ams->addr >= ams->map->end) { in map_groups__find_ams()
726 if (ams->map->groups == NULL) in map_groups__find_ams()
728 ams->map = map_groups__find(ams->map->groups, ams->addr); in map_groups__find_ams()
729 if (ams->map == NULL) in map_groups__find_ams()
733 ams->al_addr = ams->map->map_ip(ams->map, ams->addr); in map_groups__find_ams()
734 ams->sym = map__find_symbol(ams->map, ams->al_addr); in map_groups__find_ams()
747 struct map *pos = rb_entry(nd, struct map, rb_node); in maps__fprintf()
766 static void __map_groups__insert(struct map_groups *mg, struct map *map) in __map_groups__insert() argument
768 __maps__insert(&mg->maps, map); in __map_groups__insert()
769 __maps__insert_name(&mg->maps, map); in __map_groups__insert()
770 map->groups = mg; in __map_groups__insert()
773 static int maps__fixup_overlappings(struct maps *maps, struct map *map, FILE *fp) in maps__fixup_overlappings() argument
790 struct map *pos = rb_entry(next, struct map, rb_node); in maps__fixup_overlappings()
792 if (pos->end > map->start) { in maps__fixup_overlappings()
794 if (pos->start <= map->start) in maps__fixup_overlappings()
803 struct map *pos = rb_entry(next, struct map, rb_node); in maps__fixup_overlappings()
810 if (pos->start >= map->end) in maps__fixup_overlappings()
817 map->dso->name); in maps__fixup_overlappings()
820 map__fprintf(map, fp); in maps__fixup_overlappings()
830 if (map->start > pos->start) { in maps__fixup_overlappings()
831 struct map *before = map__clone(pos); in maps__fixup_overlappings()
838 before->end = map->start; in maps__fixup_overlappings()
845 if (map->end < pos->end) { in maps__fixup_overlappings()
846 struct map *after = map__clone(pos); in maps__fixup_overlappings()
853 after->start = map->end; in maps__fixup_overlappings()
854 after->pgoff += map->end - pos->start; in maps__fixup_overlappings()
855 assert(pos->map_ip(pos, map->end) == after->map_ip(after, map->end)); in maps__fixup_overlappings()
874 int map_groups__fixup_overlappings(struct map_groups *mg, struct map *map, in map_groups__fixup_overlappings() argument
877 return maps__fixup_overlappings(&mg->maps, map, fp); in map_groups__fixup_overlappings()
887 struct map *map; in map_groups__clone() local
892 for (map = maps__first(maps); map; map = map__next(map)) { in map_groups__clone()
893 struct map *new = map__clone(map); in map_groups__clone()
911 static void __maps__insert(struct maps *maps, struct map *map) in __maps__insert() argument
915 const u64 ip = map->start; in __maps__insert()
916 struct map *m; in __maps__insert()
920 m = rb_entry(parent, struct map, rb_node); in __maps__insert()
927 rb_link_node(&map->rb_node, parent, p); in __maps__insert()
928 rb_insert_color(&map->rb_node, &maps->entries); in __maps__insert()
929 map__get(map); in __maps__insert()
932 static void __maps__insert_name(struct maps *maps, struct map *map) in __maps__insert_name() argument
936 struct map *m; in __maps__insert_name()
941 m = rb_entry(parent, struct map, rb_node_name); in __maps__insert_name()
942 rc = strcmp(m->dso->short_name, map->dso->short_name); in __maps__insert_name()
948 rb_link_node(&map->rb_node_name, parent, p); in __maps__insert_name()
949 rb_insert_color(&map->rb_node_name, &maps->names); in __maps__insert_name()
950 map__get(map); in __maps__insert_name()
953 void maps__insert(struct maps *maps, struct map *map) in maps__insert() argument
956 __maps__insert(maps, map); in maps__insert()
957 __maps__insert_name(maps, map); in maps__insert()
961 static void __maps__remove(struct maps *maps, struct map *map) in __maps__remove() argument
963 rb_erase_init(&map->rb_node, &maps->entries); in __maps__remove()
964 map__put(map); in __maps__remove()
966 rb_erase_init(&map->rb_node_name, &maps->names); in __maps__remove()
967 map__put(map); in __maps__remove()
970 void maps__remove(struct maps *maps, struct map *map) in maps__remove() argument
973 __maps__remove(maps, map); in maps__remove()
977 struct map *maps__find(struct maps *maps, u64 ip) in maps__find()
980 struct map *m; in maps__find()
986 m = rb_entry(p, struct map, rb_node); in maps__find()
1001 struct map *maps__first(struct maps *maps) in maps__first()
1006 return rb_entry(first, struct map, rb_node); in maps__first()
1010 struct map *map__next(struct map *map) in map__next() argument
1012 struct rb_node *next = rb_next(&map->rb_node); in map__next()
1015 return rb_entry(next, struct map, rb_node); in map__next()
1019 struct kmap *__map__kmap(struct map *map) in __map__kmap() argument
1021 if (!map->dso || !map->dso->kernel) in __map__kmap()
1023 return (struct kmap *)(map + 1); in __map__kmap()
1026 struct kmap *map__kmap(struct map *map) in map__kmap() argument
1028 struct kmap *kmap = __map__kmap(map); in map__kmap()
1035 struct map_groups *map__kmaps(struct map *map) in map__kmaps() argument
1037 struct kmap *kmap = map__kmap(map); in map__kmaps()