diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/builtin-report.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index ec230a0146e9..b4e76f75ba87 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
@@ -400,9 +400,27 @@ static void thread__insert_map(struct thread *self, struct map *map) | |||
400 | 400 | ||
401 | list_for_each_entry_safe(pos, tmp, &self->maps, node) { | 401 | list_for_each_entry_safe(pos, tmp, &self->maps, node) { |
402 | if (map__overlap(pos, map)) { | 402 | if (map__overlap(pos, map)) { |
403 | list_del_init(&pos->node); | 403 | if (verbose >= 2) { |
404 | /* XXX leaks dsos */ | 404 | printf("overlapping maps:\n"); |
405 | free(pos); | 405 | map__fprintf(map, stdout); |
406 | map__fprintf(pos, stdout); | ||
407 | } | ||
408 | |||
409 | if (map->start <= pos->start && map->end > pos->start) | ||
410 | pos->start = map->end; | ||
411 | |||
412 | if (map->end >= pos->end && map->start < pos->end) | ||
413 | pos->end = map->start; | ||
414 | |||
415 | if (verbose >= 2) { | ||
416 | printf("after collision:\n"); | ||
417 | map__fprintf(pos, stdout); | ||
418 | } | ||
419 | |||
420 | if (pos->start >= pos->end) { | ||
421 | list_del_init(&pos->node); | ||
422 | free(pos); | ||
423 | } | ||
406 | } | 424 | } |
407 | } | 425 | } |
408 | 426 | ||