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 int __maps__insert(struct maps *maps, struct map *new) in __maps__insert() argument
433 struct map **maps_by_address = maps__maps_by_address(maps); in __maps__insert()
434 struct map **maps_by_name = maps__maps_by_name(maps); in __maps__insert()
436 unsigned int nr_maps = maps__nr_maps(maps); in __maps__insert()
437 unsigned int nr_allocate = RC_CHK_ACCESS(maps)->nr_maps_allocated; in __maps__insert()
446 maps__set_maps_by_address(maps, maps_by_address); in __maps__insert()
454 __maps__free_maps_by_name(maps); in __maps__insert()
456 maps__set_maps_by_name(maps, maps_by_name); in __maps__insert()
458 RC_CHK_ACCESS(maps)->nr_maps_allocated = nr_allocate; in __maps__insert()
466 RC_CHK_ACCESS(maps)->nr_maps = nr_maps; in __maps__insert()
475 maps__set_maps_by_address_sorted(maps, true); in __maps__insert()
476 maps__set_maps_by_name_sorted(maps, maps_by_name != NULL); in __maps__insert()
479 maps__set_maps_by_address_sorted(maps, in __maps__insert()
480 maps__maps_by_address_sorted(maps) && in __maps__insert()
482 maps__set_maps_by_name_sorted(maps, false); in __maps__insert()
485 RC_CHK_ACCESS(maps)->ends_broken = true; in __maps__insert()
490 kmap->kmaps = maps; in __maps__insert()
497 int maps__insert(struct maps *maps, struct map *map) in maps__insert() argument
501 down_write(maps__lock(maps)); in maps__insert()
502 ret = __maps__insert(maps, map); in maps__insert()
503 check_invariants(maps); in maps__insert()
504 up_write(maps__lock(maps)); in maps__insert()
508 static void __maps__remove(struct maps *maps, struct map *map) in __maps__remove() argument
510 struct map **maps_by_address = maps__maps_by_address(maps); in __maps__remove()
511 struct map **maps_by_name = maps__maps_by_name(maps); in __maps__remove()
512 unsigned int nr_maps = maps__nr_maps(maps); in __maps__remove()
516 address_idx = maps__by_address_index(maps, map); in __maps__remove()
523 unsigned int name_idx = maps__by_name_index(maps, map); in __maps__remove()
531 --RC_CHK_ACCESS(maps)->nr_maps; in __maps__remove()
534 void maps__remove(struct maps *maps, struct map *map) in maps__remove() argument
536 down_write(maps__lock(maps)); in maps__remove()
537 __maps__remove(maps, map); in maps__remove()
538 check_invariants(maps); in maps__remove()
539 up_write(maps__lock(maps)); in maps__remove()
542 bool maps__empty(struct maps *maps) in maps__empty() argument
546 down_read(maps__lock(maps)); in maps__empty()
547 res = maps__nr_maps(maps) == 0; in maps__empty()
548 up_read(maps__lock(maps)); in maps__empty()
553 bool maps__equal(struct maps *a, struct maps *b) in maps__equal()
558 int maps__for_each_map(struct maps *maps, int (*cb)(struct map *map, void *data), void *data) in maps__for_each_map() argument
565 down_read(maps__lock(maps)); in maps__for_each_map()
566 if (maps__maps_by_address_sorted(maps)) { in maps__for_each_map()
575 for (unsigned int i = 0; i < maps__nr_maps(maps); i++) { in maps__for_each_map()
576 struct map **maps_by_address = maps__maps_by_address(maps); in maps__for_each_map()
585 up_read(maps__lock(maps)); in maps__for_each_map()
587 maps__sort_by_address(maps); in maps__for_each_map()
592 void maps__remove_maps(struct maps *maps, bool (*cb)(struct map *map, void *data), void *data) in maps__remove_maps() argument
596 down_write(maps__lock(maps)); in maps__remove_maps()
598 maps_by_address = maps__maps_by_address(maps); in maps__remove_maps()
599 for (unsigned int i = 0; i < maps__nr_maps(maps);) { in maps__remove_maps()
601 __maps__remove(maps, maps_by_address[i]); in maps__remove_maps()
605 check_invariants(maps); in maps__remove_maps()
606 up_write(maps__lock(maps)); in maps__remove_maps()
609 struct symbol *maps__find_symbol(struct maps *maps, u64 addr, struct map **mapp) in maps__find_symbol() argument
611 struct map *map = maps__find(maps, addr); in maps__find_symbol()
650 struct symbol *maps__find_symbol_by_name(struct maps *maps, const char *name, struct map **mapp) in maps__find_symbol_by_name() argument
658 maps__for_each_map(maps, maps__find_symbol_by_name_cb, &args); in maps__find_symbol_by_name()
662 int maps__find_ams(struct maps *maps, struct addr_map_symbol *ams) in maps__find_ams() argument
665 if (maps == NULL) in maps__find_ams()
667 ams->ms.map = maps__find(maps, ams->addr); in maps__find_ams()
696 size_t maps__fprintf(struct maps *maps, FILE *fp) in maps__fprintf() argument
703 maps__for_each_map(maps, maps__fprintf_cb, &args); in maps__fprintf()
712 static unsigned int first_ending_after(struct maps *maps, const struct map *map) in first_ending_after() argument
714 struct map **maps_by_address = maps__maps_by_address(maps); in first_ending_after()
715 int low = 0, high = (int)maps__nr_maps(maps) - 1, first = high + 1; in first_ending_after()
717 assert(maps__maps_by_address_sorted(maps)); in first_ending_after()
738 static int __maps__insert_sorted(struct maps *maps, unsigned int first_after_index, in __maps__insert_sorted() argument
741 struct map **maps_by_address = maps__maps_by_address(maps); in __maps__insert_sorted()
742 struct map **maps_by_name = maps__maps_by_name(maps); in __maps__insert_sorted()
743 unsigned int nr_maps = maps__nr_maps(maps); in __maps__insert_sorted()
744 unsigned int nr_allocate = RC_CHK_ACCESS(maps)->nr_maps_allocated; in __maps__insert_sorted()
747 assert(maps__maps_by_address_sorted(maps)); in __maps__insert_sorted()
761 maps__set_maps_by_address(maps, maps_by_address); in __maps__insert_sorted()
769 __maps__free_maps_by_name(maps); in __maps__insert_sorted()
771 maps__set_maps_by_name(maps, maps_by_name); in __maps__insert_sorted()
773 RC_CHK_ACCESS(maps)->nr_maps_allocated = nr_allocate; in __maps__insert_sorted()
786 RC_CHK_ACCESS(maps)->nr_maps = nr_maps + to_add; in __maps__insert_sorted()
787 maps__set_maps_by_name_sorted(maps, false); in __maps__insert_sorted()
788 check_invariants(maps); in __maps__insert_sorted()
796 static int __maps__fixup_overlap_and_insert(struct maps *maps, struct map *new) in __maps__fixup_overlap_and_insert() argument
802 if (!maps__maps_by_address_sorted(maps)) in __maps__fixup_overlap_and_insert()
803 __maps__sort_by_address(maps); in __maps__fixup_overlap_and_insert()
809 for (i = first_ending_after(maps, new); i < maps__nr_maps(maps); ) { in __maps__fixup_overlap_and_insert()
810 struct map **maps_by_address = maps__maps_by_address(maps); in __maps__fixup_overlap_and_insert()
882 err = __maps__insert_sorted(maps, i, new, after); in __maps__fixup_overlap_and_insert()
884 check_invariants(maps); in __maps__fixup_overlap_and_insert()
887 check_invariants(maps); in __maps__fixup_overlap_and_insert()
895 err = __maps__insert_sorted(maps, i + 1, after, NULL); in __maps__fixup_overlap_and_insert()
897 check_invariants(maps); in __maps__fixup_overlap_and_insert()
902 if (i + 1 < maps__nr_maps(maps)) in __maps__fixup_overlap_and_insert()
913 check_invariants(maps); in __maps__fixup_overlap_and_insert()
916 __maps__remove(maps, pos); in __maps__fixup_overlap_and_insert()
917 check_invariants(maps); in __maps__fixup_overlap_and_insert()
925 err = __maps__insert_sorted(maps, i, new, NULL); in __maps__fixup_overlap_and_insert()
930 int maps__fixup_overlap_and_insert(struct maps *maps, struct map *new) in maps__fixup_overlap_and_insert() argument
934 down_write(maps__lock(maps)); in maps__fixup_overlap_and_insert()
935 err = __maps__fixup_overlap_and_insert(maps, new); in maps__fixup_overlap_and_insert()
936 up_write(maps__lock(maps)); in maps__fixup_overlap_and_insert()
940 int maps__copy_from(struct maps *dest, struct maps *parent) in maps__copy_from()
1036 struct map *maps__find(struct maps *maps, u64 ip) in maps__find() argument
1043 down_read(maps__lock(maps)); in maps__find()
1044 if (maps__maps_by_address_sorted(maps)) { in maps__find()
1046 bsearch(&ip, maps__maps_by_address(maps), maps__nr_maps(maps), in maps__find()
1053 up_read(maps__lock(maps)); in maps__find()
1055 maps__sort_by_address(maps); in maps__find()
1067 struct map *maps__find_by_name(struct maps *maps, const char *name) in maps__find_by_name() argument
1076 down_read(maps__lock(maps)); in maps__find_by_name()
1079 i = RC_CHK_ACCESS(maps)->last_search_by_name_idx; in maps__find_by_name()
1080 if (i < maps__nr_maps(maps) && maps__maps_by_name(maps)) { in maps__find_by_name()
1081 struct dso *dso = map__dso(maps__maps_by_name(maps)[i]); in maps__find_by_name()
1084 result = map__get(maps__maps_by_name(maps)[i]); in maps__find_by_name()
1090 if (!done && maps__maps_by_name_sorted(maps)) { in maps__find_by_name()
1092 bsearch(name, maps__maps_by_name(maps), maps__nr_maps(maps), in maps__find_by_name()
1097 i = mapp - maps__maps_by_name(maps); in maps__find_by_name()
1098 RC_CHK_ACCESS(maps)->last_search_by_name_idx = i; in maps__find_by_name()
1102 up_read(maps__lock(maps)); in maps__find_by_name()
1105 if (maps__sort_by_name(maps)) { in maps__find_by_name()
1113 down_read(maps__lock(maps)); in maps__find_by_name()
1114 maps_by_address = maps__maps_by_address(maps); in maps__find_by_name()
1115 n = maps__nr_maps(maps); in maps__find_by_name()
1125 up_read(maps__lock(maps)); in maps__find_by_name()
1133 struct map *maps__find_next_entry(struct maps *maps, struct map *map) in maps__find_next_entry() argument
1138 down_read(maps__lock(maps)); in maps__find_next_entry()
1139 i = maps__by_address_index(maps, map); in maps__find_next_entry()
1140 if (i < maps__nr_maps(maps)) in maps__find_next_entry()
1141 result = map__get(maps__maps_by_address(maps)[i]); in maps__find_next_entry()
1143 up_read(maps__lock(maps)); in maps__find_next_entry()
1147 void maps__fixup_end(struct maps *maps) in maps__fixup_end() argument
1152 down_write(maps__lock(maps)); in maps__fixup_end()
1153 if (!maps__maps_by_address_sorted(maps)) in maps__fixup_end()
1154 __maps__sort_by_address(maps); in maps__fixup_end()
1156 maps_by_address = maps__maps_by_address(maps); in maps__fixup_end()
1157 n = maps__nr_maps(maps); in maps__fixup_end()
1173 RC_CHK_ACCESS(maps)->ends_broken = false; in maps__fixup_end()
1174 check_invariants(maps); in maps__fixup_end()
1176 up_write(maps__lock(maps)); in maps__fixup_end()
1183 int maps__merge_in(struct maps *kmaps, struct map *new_map) in maps__merge_in()
1268 void maps__load_first(struct maps *maps) in maps__load_first() argument
1270 down_read(maps__lock(maps)); in maps__load_first()
1272 if (maps__nr_maps(maps) > 0) in maps__load_first()
1273 map__load(maps__maps_by_address(maps)[0]); in maps__load_first()
1275 up_read(maps__lock(maps)); in maps__load_first()