Lines Matching refs:maps

26 DECLARE_RC_STRUCT(maps) {  in DECLARE_RC_STRUCT()  argument
67 static void check_invariants(const struct maps *maps __maybe_unused) in check_invariants()
70 assert(RC_CHK_ACCESS(maps)->nr_maps <= RC_CHK_ACCESS(maps)->nr_maps_allocated); in check_invariants()
71 for (unsigned int i = 0; i < RC_CHK_ACCESS(maps)->nr_maps; i++) { in check_invariants()
72 struct map *map = RC_CHK_ACCESS(maps)->maps_by_address[i]; in check_invariants()
80 assert(RC_CHK_EQUAL(map__kmap(map)->kmaps, maps)); in check_invariants()
83 struct map *prev = RC_CHK_ACCESS(maps)->maps_by_address[i - 1]; in check_invariants()
86 if (RC_CHK_ACCESS(maps)->maps_by_address_sorted) { in check_invariants()
94 if (!RC_CHK_ACCESS(maps)->ends_broken) { in check_invariants()
102 if (RC_CHK_ACCESS(maps)->maps_by_name) { in check_invariants()
103 for (unsigned int i = 0; i < RC_CHK_ACCESS(maps)->nr_maps; i++) { in check_invariants()
104 struct map *map = RC_CHK_ACCESS(maps)->maps_by_name[i]; in check_invariants()
116 static struct map **maps__maps_by_address(const struct maps *maps) in maps__maps_by_address() argument
118 return RC_CHK_ACCESS(maps)->maps_by_address; in maps__maps_by_address()
121 static void maps__set_maps_by_address(struct maps *maps, struct map **new) in maps__set_maps_by_address() argument
123 RC_CHK_ACCESS(maps)->maps_by_address = new; in maps__set_maps_by_address()
127 static void maps__set_nr_maps_allocated(struct maps *maps, unsigned int nr_maps_allocated) in maps__set_nr_maps_allocated() argument
129 RC_CHK_ACCESS(maps)->nr_maps_allocated = nr_maps_allocated; in maps__set_nr_maps_allocated()
132 static void maps__set_nr_maps(struct maps *maps, unsigned int nr_maps) in maps__set_nr_maps() argument
134 RC_CHK_ACCESS(maps)->nr_maps = nr_maps; in maps__set_nr_maps()
138 static struct map **maps__maps_by_name(const struct maps *maps) in maps__maps_by_name() argument
140 return RC_CHK_ACCESS(maps)->maps_by_name; in maps__maps_by_name()
144 static void maps__set_maps_by_name(struct maps *maps, struct map **new) in maps__set_maps_by_name() argument
146 RC_CHK_ACCESS(maps)->maps_by_name = new; in maps__set_maps_by_name()
150 static bool maps__maps_by_address_sorted(const struct maps *maps) in maps__maps_by_address_sorted() argument
152 return RC_CHK_ACCESS(maps)->maps_by_address_sorted; in maps__maps_by_address_sorted()
155 static void maps__set_maps_by_address_sorted(struct maps *maps, bool value) in maps__set_maps_by_address_sorted() argument
157 RC_CHK_ACCESS(maps)->maps_by_address_sorted = value; in maps__set_maps_by_address_sorted()
160 static bool maps__maps_by_name_sorted(const struct maps *maps) in maps__maps_by_name_sorted() argument
162 return RC_CHK_ACCESS(maps)->maps_by_name_sorted; in maps__maps_by_name_sorted()
165 static void maps__set_maps_by_name_sorted(struct maps *maps, bool value) in maps__set_maps_by_name_sorted() argument
167 RC_CHK_ACCESS(maps)->maps_by_name_sorted = value; in maps__set_maps_by_name_sorted()
170 struct machine *maps__machine(const struct maps *maps) in maps__machine() argument
172 return RC_CHK_ACCESS(maps)->machine; in maps__machine()
175 unsigned int maps__nr_maps(const struct maps *maps) in maps__nr_maps() argument
177 return RC_CHK_ACCESS(maps)->nr_maps; in maps__nr_maps()
180 refcount_t *maps__refcnt(struct maps *maps) in maps__refcnt() argument
182 return &RC_CHK_ACCESS(maps)->refcnt; in maps__refcnt()
186 void *maps__addr_space(const struct maps *maps) in maps__addr_space() argument
188 return RC_CHK_ACCESS(maps)->addr_space; in maps__addr_space()
191 void maps__set_addr_space(struct maps *maps, void *addr_space) in maps__set_addr_space() argument
193 RC_CHK_ACCESS(maps)->addr_space = addr_space; in maps__set_addr_space()
196 const struct unwind_libunwind_ops *maps__unwind_libunwind_ops(const struct maps *maps) in maps__unwind_libunwind_ops() argument
198 return RC_CHK_ACCESS(maps)->unwind_libunwind_ops; in maps__unwind_libunwind_ops()
201 void maps__set_unwind_libunwind_ops(struct maps *maps, const struct unwind_libunwind_ops *ops) in maps__set_unwind_libunwind_ops() argument
203 RC_CHK_ACCESS(maps)->unwind_libunwind_ops = ops; in maps__set_unwind_libunwind_ops()
207 static struct rw_semaphore *maps__lock(struct maps *maps) in maps__lock() argument
209 return &RC_CHK_ACCESS(maps)->lock; in maps__lock()
212 static void maps__init(struct maps *maps, struct machine *machine) in maps__init() argument
214 init_rwsem(maps__lock(maps)); in maps__init()
215 RC_CHK_ACCESS(maps)->maps_by_address = NULL; in maps__init()
216 RC_CHK_ACCESS(maps)->maps_by_name = NULL; in maps__init()
217 RC_CHK_ACCESS(maps)->machine = machine; in maps__init()
219 RC_CHK_ACCESS(maps)->addr_space = NULL; in maps__init()
220 RC_CHK_ACCESS(maps)->unwind_libunwind_ops = NULL; in maps__init()
222 refcount_set(maps__refcnt(maps), 1); in maps__init()
223 RC_CHK_ACCESS(maps)->nr_maps = 0; in maps__init()
224 RC_CHK_ACCESS(maps)->nr_maps_allocated = 0; in maps__init()
225 RC_CHK_ACCESS(maps)->last_search_by_name_idx = 0; in maps__init()
226 RC_CHK_ACCESS(maps)->maps_by_address_sorted = true; in maps__init()
227 RC_CHK_ACCESS(maps)->maps_by_name_sorted = false; in maps__init()
230 static void maps__exit(struct maps *maps) in maps__exit() argument
232 struct map **maps_by_address = maps__maps_by_address(maps); in maps__exit()
233 struct map **maps_by_name = maps__maps_by_name(maps); in maps__exit()
235 for (unsigned int i = 0; i < maps__nr_maps(maps); i++) { in maps__exit()
242 unwind__finish_access(maps); in maps__exit()
245 struct maps *maps__new(struct machine *machine) in maps__new()
247 struct maps *result; in maps__new()
248 RC_STRUCT(maps) *maps = zalloc(sizeof(*maps)); in maps__new()
250 if (ADD_RC_CHK(result, maps)) in maps__new()
256 static void maps__delete(struct maps *maps) in maps__delete() argument
258 maps__exit(maps); in maps__delete()
259 RC_CHK_FREE(maps); in maps__delete()
262 struct maps *maps__get(struct maps *maps) in maps__get() argument
264 struct maps *result; in maps__get()
266 if (RC_CHK_GET(result, maps)) in maps__get()
267 refcount_inc(maps__refcnt(maps)); in maps__get()
272 void maps__put(struct maps *maps) in maps__put() argument
274 if (maps && refcount_dec_and_test(maps__refcnt(maps))) in maps__put()
275 maps__delete(maps); in maps__put()
277 RC_CHK_PUT(maps); in maps__put()
280 static void __maps__free_maps_by_name(struct maps *maps) in __maps__free_maps_by_name() argument
282 if (!maps__maps_by_name(maps)) in __maps__free_maps_by_name()
288 for (unsigned int i = 0; i < maps__nr_maps(maps); i++) in __maps__free_maps_by_name()
289 map__put(maps__maps_by_name(maps)[i]); in __maps__free_maps_by_name()
291 zfree(&RC_CHK_ACCESS(maps)->maps_by_name); in __maps__free_maps_by_name()
294 maps__set_maps_by_name_sorted(maps, false); in __maps__free_maps_by_name()
320 static void __maps__sort_by_address(struct maps *maps) in __maps__sort_by_address() argument
322 if (maps__maps_by_address_sorted(maps)) in __maps__sort_by_address()
325 qsort(maps__maps_by_address(maps), in __maps__sort_by_address()
326 maps__nr_maps(maps), in __maps__sort_by_address()
329 maps__set_maps_by_address_sorted(maps, true); in __maps__sort_by_address()
332 static void maps__sort_by_address(struct maps *maps) in maps__sort_by_address() argument
334 down_write(maps__lock(maps)); in maps__sort_by_address()
335 __maps__sort_by_address(maps); in maps__sort_by_address()
336 up_write(maps__lock(maps)); in maps__sort_by_address()
354 static int maps__sort_by_name(struct maps *maps) in maps__sort_by_name() argument
358 down_write(maps__lock(maps)); in maps__sort_by_name()
359 if (!maps__maps_by_name_sorted(maps)) { in maps__sort_by_name()
360 struct map **maps_by_name = maps__maps_by_name(maps); in maps__sort_by_name()
363 maps_by_name = malloc(RC_CHK_ACCESS(maps)->nr_maps_allocated * in maps__sort_by_name()
368 struct map **maps_by_address = maps__maps_by_address(maps); in maps__sort_by_name()
369 unsigned int n = maps__nr_maps(maps); in maps__sort_by_name()
371 maps__set_maps_by_name(maps, maps_by_name); in maps__sort_by_name()
378 maps__nr_maps(maps), in maps__sort_by_name()
381 maps__set_maps_by_name_sorted(maps, true); in maps__sort_by_name()
384 check_invariants(maps); in maps__sort_by_name()
385 up_write(maps__lock(maps)); in maps__sort_by_name()
389 static unsigned int maps__by_address_index(const struct maps *maps, const struct map *map) in maps__by_address_index() argument
391 struct map **maps_by_address = maps__maps_by_address(maps); in maps__by_address_index()
393 if (maps__maps_by_address_sorted(maps)) { in maps__by_address_index()
395 bsearch(&map, maps__maps_by_address(maps), maps__nr_maps(maps), in maps__by_address_index()
401 for (unsigned int i = 0; i < maps__nr_maps(maps); i++) { in maps__by_address_index()
410 static unsigned int maps__by_name_index(const struct maps *maps, const struct map *map) in maps__by_name_index() argument
412 struct map **maps_by_name = maps__maps_by_name(maps); in maps__by_name_index()
414 if (maps__maps_by_name_sorted(maps)) { in maps__by_name_index()
416 bsearch(&map, maps_by_name, maps__nr_maps(maps), in maps__by_name_index()
422 for (unsigned int i = 0; i < maps__nr_maps(maps); i++) { in maps__by_name_index()
431 static void map__set_kmap_maps(struct map *map, struct maps *maps) in map__set_kmap_maps() argument
444 kmap->kmaps = maps; in map__set_kmap_maps()
450 static int __maps__insert(struct maps *maps, struct map *new) in __maps__insert() argument
452 struct map **maps_by_address = maps__maps_by_address(maps); in __maps__insert()
453 struct map **maps_by_name = maps__maps_by_name(maps); in __maps__insert()
454 unsigned int nr_maps = maps__nr_maps(maps); in __maps__insert()
455 unsigned int nr_allocate = RC_CHK_ACCESS(maps)->nr_maps_allocated; in __maps__insert()
464 maps__set_maps_by_address(maps, maps_by_address); in __maps__insert()
472 __maps__free_maps_by_name(maps); in __maps__insert()
474 maps__set_maps_by_name(maps, maps_by_name); in __maps__insert()
476 RC_CHK_ACCESS(maps)->nr_maps_allocated = nr_allocate; in __maps__insert()
480 map__set_kmap_maps(new, maps); in __maps__insert()
485 RC_CHK_ACCESS(maps)->nr_maps = nr_maps; in __maps__insert()
494 maps__set_maps_by_address_sorted(maps, true); in __maps__insert()
495 maps__set_maps_by_name_sorted(maps, maps_by_name != NULL); in __maps__insert()
498 maps__set_maps_by_address_sorted(maps, in __maps__insert()
499 maps__maps_by_address_sorted(maps) && in __maps__insert()
501 maps__set_maps_by_name_sorted(maps, false); in __maps__insert()
504 RC_CHK_ACCESS(maps)->ends_broken = true; in __maps__insert()
509 int maps__insert(struct maps *maps, struct map *map) in maps__insert() argument
513 down_write(maps__lock(maps)); in maps__insert()
514 ret = __maps__insert(maps, map); in maps__insert()
515 check_invariants(maps); in maps__insert()
516 up_write(maps__lock(maps)); in maps__insert()
520 static void __maps__remove(struct maps *maps, struct map *map) in __maps__remove() argument
522 struct map **maps_by_address = maps__maps_by_address(maps); in __maps__remove()
523 struct map **maps_by_name = maps__maps_by_name(maps); in __maps__remove()
524 unsigned int nr_maps = maps__nr_maps(maps); in __maps__remove()
528 address_idx = maps__by_address_index(maps, map); in __maps__remove()
535 unsigned int name_idx = maps__by_name_index(maps, map); in __maps__remove()
543 --RC_CHK_ACCESS(maps)->nr_maps; in __maps__remove()
546 void maps__remove(struct maps *maps, struct map *map) in maps__remove() argument
548 down_write(maps__lock(maps)); in maps__remove()
549 __maps__remove(maps, map); in maps__remove()
550 check_invariants(maps); in maps__remove()
551 up_write(maps__lock(maps)); in maps__remove()
554 bool maps__empty(struct maps *maps) in maps__empty() argument
558 down_read(maps__lock(maps)); in maps__empty()
559 res = maps__nr_maps(maps) == 0; in maps__empty()
560 up_read(maps__lock(maps)); in maps__empty()
565 bool maps__equal(struct maps *a, struct maps *b) in maps__equal()
570 int maps__for_each_map(struct maps *maps, int (*cb)(struct map *map, void *data), void *data) in maps__for_each_map() argument
577 down_read(maps__lock(maps)); in maps__for_each_map()
578 if (maps__maps_by_address_sorted(maps)) { in maps__for_each_map()
587 for (unsigned int i = 0; i < maps__nr_maps(maps); i++) { in maps__for_each_map()
588 struct map **maps_by_address = maps__maps_by_address(maps); in maps__for_each_map()
597 up_read(maps__lock(maps)); in maps__for_each_map()
599 maps__sort_by_address(maps); in maps__for_each_map()
604 void maps__remove_maps(struct maps *maps, bool (*cb)(struct map *map, void *data), void *data) in maps__remove_maps() argument
608 down_write(maps__lock(maps)); in maps__remove_maps()
610 maps_by_address = maps__maps_by_address(maps); in maps__remove_maps()
611 for (unsigned int i = 0; i < maps__nr_maps(maps);) { in maps__remove_maps()
613 __maps__remove(maps, maps_by_address[i]); in maps__remove_maps()
617 check_invariants(maps); in maps__remove_maps()
618 up_write(maps__lock(maps)); in maps__remove_maps()
621 struct symbol *maps__find_symbol(struct maps *maps, u64 addr, struct map **mapp) in maps__find_symbol() argument
623 struct map *map = maps__find(maps, addr); in maps__find_symbol()
662 struct symbol *maps__find_symbol_by_name(struct maps *maps, const char *name, struct map **mapp) in maps__find_symbol_by_name() argument
670 maps__for_each_map(maps, maps__find_symbol_by_name_cb, &args); in maps__find_symbol_by_name()
674 int maps__find_ams(struct maps *maps, struct addr_map_symbol *ams) in maps__find_ams() argument
677 if (maps == NULL) in maps__find_ams()
679 ams->ms.map = maps__find(maps, ams->addr); in maps__find_ams()
708 size_t maps__fprintf(struct maps *maps, FILE *fp) in maps__fprintf() argument
715 maps__for_each_map(maps, maps__fprintf_cb, &args); in maps__fprintf()
724 static unsigned int first_ending_after(struct maps *maps, const struct map *map) in first_ending_after() argument
726 struct map **maps_by_address = maps__maps_by_address(maps); in first_ending_after()
727 int low = 0, high = (int)maps__nr_maps(maps) - 1, first = high + 1; in first_ending_after()
729 assert(maps__maps_by_address_sorted(maps)); in first_ending_after()
750 static int __maps__insert_sorted(struct maps *maps, unsigned int first_after_index, in __maps__insert_sorted() argument
753 struct map **maps_by_address = maps__maps_by_address(maps); in __maps__insert_sorted()
754 struct map **maps_by_name = maps__maps_by_name(maps); in __maps__insert_sorted()
755 unsigned int nr_maps = maps__nr_maps(maps); in __maps__insert_sorted()
756 unsigned int nr_allocate = RC_CHK_ACCESS(maps)->nr_maps_allocated; in __maps__insert_sorted()
759 assert(maps__maps_by_address_sorted(maps)); in __maps__insert_sorted()
773 maps__set_maps_by_address(maps, maps_by_address); in __maps__insert_sorted()
781 __maps__free_maps_by_name(maps); in __maps__insert_sorted()
783 maps__set_maps_by_name(maps, maps_by_name); in __maps__insert_sorted()
785 RC_CHK_ACCESS(maps)->nr_maps_allocated = nr_allocate; in __maps__insert_sorted()
798 RC_CHK_ACCESS(maps)->nr_maps = nr_maps + to_add; in __maps__insert_sorted()
799 maps__set_maps_by_name_sorted(maps, false); in __maps__insert_sorted()
800 map__set_kmap_maps(new1, maps); in __maps__insert_sorted()
801 map__set_kmap_maps(new2, maps); in __maps__insert_sorted()
803 check_invariants(maps); in __maps__insert_sorted()
811 static int __maps__fixup_overlap_and_insert(struct maps *maps, struct map *new) in __maps__fixup_overlap_and_insert() argument
817 if (!maps__maps_by_address_sorted(maps)) in __maps__fixup_overlap_and_insert()
818 __maps__sort_by_address(maps); in __maps__fixup_overlap_and_insert()
824 for (i = first_ending_after(maps, new); i < maps__nr_maps(maps); ) { in __maps__fixup_overlap_and_insert()
825 struct map **maps_by_address = maps__maps_by_address(maps); in __maps__fixup_overlap_and_insert()
826 struct map **maps_by_name = maps__maps_by_name(maps); in __maps__fixup_overlap_and_insert()
847 ni = maps__by_name_index(maps, pos); in __maps__fixup_overlap_and_insert()
893 map__set_kmap_maps(before, maps); in __maps__fixup_overlap_and_insert()
908 err = __maps__insert_sorted(maps, i, new, after); in __maps__fixup_overlap_and_insert()
910 check_invariants(maps); in __maps__fixup_overlap_and_insert()
913 check_invariants(maps); in __maps__fixup_overlap_and_insert()
921 map__set_kmap_maps(new, maps); in __maps__fixup_overlap_and_insert()
928 err = __maps__insert_sorted(maps, i + 1, after, NULL); in __maps__fixup_overlap_and_insert()
930 check_invariants(maps); in __maps__fixup_overlap_and_insert()
934 unsigned int nr_maps = maps__nr_maps(maps); in __maps__fixup_overlap_and_insert()
947 map__set_kmap_maps(new, maps); in __maps__fixup_overlap_and_insert()
954 check_invariants(maps); in __maps__fixup_overlap_and_insert()
974 --RC_CHK_ACCESS(maps)->nr_maps; in __maps__fixup_overlap_and_insert()
975 check_invariants(maps); in __maps__fixup_overlap_and_insert()
983 err = __maps__insert_sorted(maps, i, new, NULL); in __maps__fixup_overlap_and_insert()
988 int maps__fixup_overlap_and_insert(struct maps *maps, struct map *new) in maps__fixup_overlap_and_insert() argument
992 down_write(maps__lock(maps)); in maps__fixup_overlap_and_insert()
993 err = __maps__fixup_overlap_and_insert(maps, new); in maps__fixup_overlap_and_insert()
994 up_write(maps__lock(maps)); in maps__fixup_overlap_and_insert()
998 int maps__copy_from(struct maps *dest, struct maps *parent) in maps__copy_from()
1095 struct map *maps__find(struct maps *maps, u64 ip) in maps__find() argument
1102 down_read(maps__lock(maps)); in maps__find()
1103 if (maps__maps_by_address_sorted(maps)) { in maps__find()
1105 struct map **maps_by_address = maps__maps_by_address(maps); in maps__find()
1106 unsigned int nr_maps = maps__nr_maps(maps); in maps__find()
1115 up_read(maps__lock(maps)); in maps__find()
1117 maps__sort_by_address(maps); in maps__find()
1129 struct map *maps__find_by_name(struct maps *maps, const char *name) in maps__find_by_name() argument
1138 down_read(maps__lock(maps)); in maps__find_by_name()
1141 i = RC_CHK_ACCESS(maps)->last_search_by_name_idx; in maps__find_by_name()
1142 if (i < maps__nr_maps(maps) && maps__maps_by_name(maps)) { in maps__find_by_name()
1143 struct dso *dso = map__dso(maps__maps_by_name(maps)[i]); in maps__find_by_name()
1146 result = map__get(maps__maps_by_name(maps)[i]); in maps__find_by_name()
1152 if (!done && maps__maps_by_name_sorted(maps)) { in maps__find_by_name()
1154 bsearch(name, maps__maps_by_name(maps), maps__nr_maps(maps), in maps__find_by_name()
1159 i = mapp - maps__maps_by_name(maps); in maps__find_by_name()
1160 RC_CHK_ACCESS(maps)->last_search_by_name_idx = i; in maps__find_by_name()
1164 up_read(maps__lock(maps)); in maps__find_by_name()
1167 if (maps__sort_by_name(maps)) { in maps__find_by_name()
1175 down_read(maps__lock(maps)); in maps__find_by_name()
1176 maps_by_address = maps__maps_by_address(maps); in maps__find_by_name()
1177 n = maps__nr_maps(maps); in maps__find_by_name()
1187 up_read(maps__lock(maps)); in maps__find_by_name()
1195 struct map *maps__find_next_entry(struct maps *maps, struct map *map) in maps__find_next_entry() argument
1200 down_read(maps__lock(maps)); in maps__find_next_entry()
1201 while (!maps__maps_by_address_sorted(maps)) { in maps__find_next_entry()
1202 up_read(maps__lock(maps)); in maps__find_next_entry()
1203 maps__sort_by_address(maps); in maps__find_next_entry()
1204 down_read(maps__lock(maps)); in maps__find_next_entry()
1206 i = maps__by_address_index(maps, map); in maps__find_next_entry()
1207 if (++i < maps__nr_maps(maps)) in maps__find_next_entry()
1208 result = map__get(maps__maps_by_address(maps)[i]); in maps__find_next_entry()
1210 up_read(maps__lock(maps)); in maps__find_next_entry()
1214 void maps__fixup_end(struct maps *maps) in maps__fixup_end() argument
1219 down_write(maps__lock(maps)); in maps__fixup_end()
1220 if (!maps__maps_by_address_sorted(maps)) in maps__fixup_end()
1221 __maps__sort_by_address(maps); in maps__fixup_end()
1223 maps_by_address = maps__maps_by_address(maps); in maps__fixup_end()
1224 n = maps__nr_maps(maps); in maps__fixup_end()
1240 RC_CHK_ACCESS(maps)->ends_broken = false; in maps__fixup_end()
1241 check_invariants(maps); in maps__fixup_end()
1243 up_write(maps__lock(maps)); in maps__fixup_end()
1250 int maps__merge_in(struct maps *kmaps, struct map *new_map) in maps__merge_in()
1335 void maps__load_first(struct maps *maps) in maps__load_first() argument
1337 down_read(maps__lock(maps)); in maps__load_first()
1339 if (maps__nr_maps(maps) > 0) in maps__load_first()
1340 map__load(maps__maps_by_address(maps)[0]); in maps__load_first()
1342 up_read(maps__lock(maps)); in maps__load_first()