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) {
}
}
- 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);
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;
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;
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:
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);
}
}
+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)