From 41ac2593deb812baee12c58b6b7c4911a2da8cd7 Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Thu, 19 Jun 2014 13:09:09 +0200 Subject: [PATCH] [mc] Avoid region lookup when we know we are in the heap --- src/mc/mc_diff.c | 14 ++++++++++---- src/mc/mc_private.h | 3 +++ src/mc/mc_snapshot.c | 12 ++++++++++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/mc/mc_diff.c b/src/mc/mc_diff.c index 6eaa31a54d..dbef02a6f8 100644 --- a/src/mc/mc_diff.c +++ b/src/mc/mc_diff.c @@ -771,6 +771,9 @@ static int compare_heap_area_without_type(struct s_mc_diff *state, int pointer_align, res_compare; ssize_t ignore1, ignore2; + mc_mem_region_t heap_region1 = snapshot1->regions[0]; + mc_mem_region_t heap_region2 = snapshot2->regions[0]; + while (i < size) { if (check_ignore > 0) { @@ -792,7 +795,7 @@ static int compare_heap_area_without_type(struct s_mc_diff *state, } } - if (mc_snapshot_memcp(((char *) real_area1) + i, snapshot1, ((char *) real_area2) + i, snapshot2, 1) != 0) { + if (mc_snapshot_region_memcp(((char *) real_area1) + i, heap_region1, ((char *) real_area2) + i, heap_region2, 1) != 0) { pointer_align = (i / sizeof(void *)) * sizeof(void *); addr_pointed1 = mc_snapshot_read_pointer((char *) real_area1 + pointer_align, snapshot1); @@ -873,6 +876,9 @@ static int compare_heap_area_with_type(struct s_mc_diff *state, dw_type_t member; void *addr_pointed1, *addr_pointed2;; + mc_mem_region_t heap_region1 = snapshot1->regions[0]; + mc_mem_region_t heap_region2 = snapshot2->regions[0]; + switch (type->type) { case DW_TAG_unspecified_type: return 1; @@ -882,12 +888,12 @@ static int compare_heap_area_with_type(struct s_mc_diff *state, if (real_area1 == real_area2) return -1; else - return (mc_snapshot_memcp(real_area1, snapshot1, real_area2, snapshot2, area_size) != 0); + return (mc_snapshot_region_memcp(real_area1, heap_region1, real_area2, heap_region2, area_size) != 0); } else { if (area_size != -1 && type->byte_size != area_size) return -1; else { - return (mc_snapshot_memcp(real_area1, snapshot1, real_area2, snapshot2, type->byte_size) != 0); + return (mc_snapshot_region_memcp(real_area1, heap_region1, real_area2, heap_region2, type->byte_size) != 0); } } break; @@ -895,7 +901,7 @@ static int compare_heap_area_with_type(struct s_mc_diff *state, if (area_size != -1 && type->byte_size != area_size) return -1; else - return (mc_snapshot_memcp(real_area1, snapshot1, real_area2, snapshot2, type->byte_size) != 0); + return (mc_snapshot_region_memcp(real_area1, heap_region1, real_area2, heap_region2, type->byte_size) != 0); break; case DW_TAG_typedef: case DW_TAG_const_type: diff --git a/src/mc/mc_private.h b/src/mc/mc_private.h index 8362de99df..cdf0571c25 100644 --- a/src/mc/mc_private.h +++ b/src/mc/mc_private.h @@ -152,6 +152,9 @@ static inline bool mc_snapshot_region_linear(mc_mem_region_t region) { void* mc_snapshot_read_region(void* addr, mc_mem_region_t region, void* target, size_t size); void* mc_snapshot_read(void* addr, mc_snapshot_t snapshot, void* target, size_t size); +int mc_snapshot_region_memcp( + void* addr1, mc_mem_region_t region1, + void* addr2, mc_mem_region_t region2, size_t size); int mc_snapshot_memcp( void* addr1, mc_snapshot_t snapshot1, void* addr2, mc_snapshot_t snapshot2, size_t size); diff --git a/src/mc/mc_snapshot.c b/src/mc/mc_snapshot.c index 8bf1279911..998b85bbc9 100644 --- a/src/mc/mc_snapshot.c +++ b/src/mc/mc_snapshot.c @@ -148,6 +148,18 @@ void* mc_snapshot_read(void* addr, mc_snapshot_t snapshot, void* target, size_t } } +int mc_snapshot_region_memcp( + void* addr1, mc_mem_region_t region1, + void* addr2, mc_mem_region_t region2, size_t size) +{ + void* buffer1 = mc_snapshot_read_region(addr1, region1, alloca(size), size); + void* buffer2 = mc_snapshot_read_region(addr2, region2, alloca(size), size); + if (buffer1 == buffer2) { + return 0; + } + return memcmp(buffer1, buffer2, size); +} + int mc_snapshot_memcp( void* addr1, mc_snapshot_t snapshot1, void* addr2, mc_snapshot_t snapshot2, size_t size) -- 2.20.1