Lines Matching full:map
7 #include "map.h"
15 struct map *map; member
18 #define maps__for_each_entry(maps, map) \ argument
19 for (map = maps__first(maps); map; map = map_rb_node__next(map))
21 #define maps__for_each_entry_safe(maps, map, next) \ argument
22 for (map = maps__first(maps), next = map_rb_node__next(map); map; \
23 map = next, next = map_rb_node__next(map))
35 static struct map **maps__maps_by_name(struct maps *maps) in maps__maps_by_name()
64 static struct map_rb_node *maps__find_node(struct maps *maps, struct map *map) in maps__find_node() argument
69 if (rb_node->RC_CHK_ACCESS(map) == RC_CHK_ACCESS(map)) in maps__find_node()
98 static int __maps__insert(struct maps *maps, struct map *map) in __maps__insert() argument
102 const u64 ip = map__start(map); in __maps__insert()
110 new_rb_node->map = map__get(map); in __maps__insert()
115 if (ip < map__start(m->map)) in __maps__insert()
126 int maps__insert(struct maps *maps, struct map *map) in maps__insert() argument
129 const struct dso *dso = map__dso(map); in maps__insert()
132 err = __maps__insert(maps, map); in maps__insert()
139 struct kmap *kmap = map__kmap(map); in maps__insert()
144 pr_err("Internal error: kernel dso with non kernel map\n"); in maps__insert()
150 * inserted map and resort. in maps__insert()
155 struct map **maps_by_name = realloc(maps__maps_by_name(maps), in maps__insert()
156 nr_allocate * sizeof(map)); in maps__insert()
167 maps__maps_by_name(maps)[maps__nr_maps(maps) - 1] = map__get(map); in maps__insert()
178 map__put(rb_node->map); in __maps__remove()
182 void maps__remove(struct maps *maps, struct map *map) in maps__remove() argument
187 if (RC_CHK_ACCESS(maps)->last_search_by_name == map) in maps__remove()
190 rb_node = maps__find_node(maps, map); in maps__remove()
191 assert(rb_node->RC_CHK_ACCESS(map) == RC_CHK_ACCESS(map)); in maps__remove()
208 map__put(pos->map); in __maps__purge()
261 int maps__for_each_map(struct maps *maps, int (*cb)(struct map *map, void *data), void *data) in maps__for_each_map() argument
268 ret = cb(pos->map, data); in maps__for_each_map()
276 void maps__remove_maps(struct maps *maps, bool (*cb)(struct map *map, void *data), void *data) in maps__remove_maps() argument
285 if (cb(pos->map, data)) { in maps__remove_maps()
296 struct symbol *maps__find_symbol(struct maps *maps, u64 addr, struct map **mapp) in maps__find_symbol()
298 struct map *map = maps__find(maps, addr); in maps__find_symbol() local
300 /* Ensure map is loaded before using map->map_ip */ in maps__find_symbol()
301 if (map != NULL && map__load(map) >= 0) { in maps__find_symbol()
303 *mapp = map; in maps__find_symbol()
304 return map__find_symbol(map, map__map_ip(map, addr)); in maps__find_symbol()
311 struct map **mapp;
316 static int maps__find_symbol_by_name_cb(struct map *map, void *data) in maps__find_symbol_by_name_cb() argument
320 args->sym = map__find_symbol_by_name(map, args->name); in maps__find_symbol_by_name_cb()
324 if (!map__contains_symbol(map, args->sym)) { in maps__find_symbol_by_name_cb()
330 *args->mapp = map__get(map); in maps__find_symbol_by_name_cb()
334 struct symbol *maps__find_symbol_by_name(struct maps *maps, const char *name, struct map **mapp) in maps__find_symbol_by_name()
348 if (ams->addr < map__start(ams->ms.map) || ams->addr >= map__end(ams->ms.map)) { in maps__find_ams()
351 ams->ms.map = maps__find(maps, ams->addr); in maps__find_ams()
352 if (ams->ms.map == NULL) in maps__find_ams()
356 ams->al_addr = map__map_ip(ams->ms.map, ams->addr); in maps__find_ams()
357 ams->ms.sym = map__find_symbol(ams->ms.map, ams->al_addr); in maps__find_ams()
367 static int maps__fprintf_cb(struct map *map, void *data) in maps__fprintf_cb() argument
371 args->printed += fprintf(args->fp, "Map:"); in maps__fprintf_cb()
372 args->printed += map__fprintf(map, args->fp); in maps__fprintf_cb()
374 args->printed += dso__fprintf(map__dso(map), args->fp); in maps__fprintf_cb()
393 * Find first map where end > map->start.
396 static struct rb_node *first_ending_after(struct maps *maps, const struct map *map) in first_ending_after() argument
407 if (map__end(pos->map) > map__start(map)) { in first_ending_after()
409 if (map__start(pos->map) <= map__start(map)) in first_ending_after()
422 int maps__fixup_overlap_and_insert(struct maps *maps, struct map *new) in maps__fixup_overlap_and_insert()
437 * Stop if current map starts after map->end. in maps__fixup_overlap_and_insert()
440 if (map__start(pos->map) >= map__end(new)) in maps__fixup_overlap_and_insert()
451 map__fprintf(pos->map, fp); in maps__fixup_overlap_and_insert()
458 * overlapped by the new map: in maps__fixup_overlap_and_insert()
460 if (map__start(new) > map__start(pos->map)) { in maps__fixup_overlap_and_insert()
461 struct map *before = map__clone(pos->map); in maps__fixup_overlap_and_insert()
480 if (map__end(new) < map__end(pos->map)) { in maps__fixup_overlap_and_insert()
481 struct map *after = map__clone(pos->map); in maps__fixup_overlap_and_insert()
489 map__add_pgoff(after, map__end(new) - map__start(pos->map)); in maps__fixup_overlap_and_insert()
490 assert(map__map_ip(pos->map, map__end(new)) == in maps__fixup_overlap_and_insert()
502 map__put(pos->map); in maps__fixup_overlap_and_insert()
505 /* Add the map. */ in maps__fixup_overlap_and_insert()
519 struct map *new = map__clone(rb_node->map); in maps__copy_from()
543 struct map *maps__find(struct maps *maps, u64 ip) in maps__find()
554 if (ip < map__start(m->map)) in maps__find()
556 else if (ip >= map__end(m->map)) in maps__find()
565 return m ? m->map : NULL; in maps__find()
570 const struct map *map_a = *(const struct map **)a; in map__strcmp()
571 const struct map *map_b = *(const struct map **)b; in map__strcmp()
591 const struct dso *dso = map__dso(*(const struct map **)b); in map__strcmp_name()
598 qsort(maps__maps_by_name(maps), maps__nr_maps(maps), sizeof(struct map *), map__strcmp); in __maps__sort_by_name()
604 struct map **maps_by_name = realloc(maps__maps_by_name(maps), in map__groups__sort_by_name_from_rbtree()
605 maps__nr_maps(maps) * sizeof(struct map *)); in map__groups__sort_by_name_from_rbtree()
618 maps_by_name[i++] = map__get(rb_node->map); in map__groups__sort_by_name_from_rbtree()
628 static struct map *__maps__find_by_name(struct maps *maps, const char *name) in __maps__find_by_name()
630 struct map **mapp; in __maps__find_by_name()
643 struct map *maps__find_by_name(struct maps *maps, const char *name) in maps__find_by_name()
646 struct map *map; in maps__find_by_name() local
655 map = RC_CHK_ACCESS(maps)->last_search_by_name; in maps__find_by_name()
664 map = __maps__find_by_name(maps, name); in maps__find_by_name()
665 if (map || maps__maps_by_name(maps) != NULL) in maps__find_by_name()
672 map = rb_node->map; in maps__find_by_name()
673 dso = map__dso(map); in maps__find_by_name()
675 RC_CHK_ACCESS(maps)->last_search_by_name = map; in maps__find_by_name()
679 map = NULL; in maps__find_by_name()
683 return map; in maps__find_by_name()
686 struct map *maps__find_next_entry(struct maps *maps, struct map *map) in maps__find_next_entry() argument
688 struct map_rb_node *rb_node = maps__find_node(maps, map); in maps__find_next_entry()
692 return next->map; in maps__find_next_entry()
704 if (prev && (!map__end(prev->map) || map__end(prev->map) > map__start(curr->map))) in maps__fixup_end()
705 map__set_end(prev->map, map__start(curr->map)); in maps__fixup_end()
712 * last map final address. in maps__fixup_end()
714 if (curr && !map__end(curr->map)) in maps__fixup_end()
715 map__set_end(curr->map, ~0ULL); in maps__fixup_end()
721 * Merges map into maps by splitting the new map within the existing map
724 int maps__merge_in(struct maps *kmaps, struct map *new_map) in maps__merge_in()
735 overlaps = rb_node && map__start(rb_node->map) < map__end(new_map); in maps__merge_in()
742 struct map *old_map = rb_node->map; in maps__merge_in()
772 m->map = map__clone(new_map); in maps__merge_in()
773 if (!m->map) { in maps__merge_in()
779 map__set_end(m->map, map__start(old_map)); in maps__merge_in()
815 err = maps__insert(kmaps, old_node->map); in maps__merge_in()
816 map__put(old_node->map); in maps__merge_in()
836 map__load(first->map); in maps__load_first()