|
@@ -400,9 +400,27 @@ static void thread__insert_map(struct thread *self, struct map *map)
|
|
|
|
|
|
list_for_each_entry_safe(pos, tmp, &self->maps, node) {
|
|
|
if (map__overlap(pos, map)) {
|
|
|
- list_del_init(&pos->node);
|
|
|
- /* XXX leaks dsos */
|
|
|
- free(pos);
|
|
|
+ if (verbose >= 2) {
|
|
|
+ printf("overlapping maps:\n");
|
|
|
+ map__fprintf(map, stdout);
|
|
|
+ map__fprintf(pos, stdout);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (map->start <= pos->start && map->end > pos->start)
|
|
|
+ pos->start = map->end;
|
|
|
+
|
|
|
+ if (map->end >= pos->end && map->start < pos->end)
|
|
|
+ pos->end = map->start;
|
|
|
+
|
|
|
+ if (verbose >= 2) {
|
|
|
+ printf("after collision:\n");
|
|
|
+ map__fprintf(pos, stdout);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pos->start >= pos->end) {
|
|
|
+ list_del_init(&pos->node);
|
|
|
+ free(pos);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|