case DW_TAG_pointer_type:
case DW_TAG_reference_type:
case DW_TAG_rvalue_reference_type:
+
+ addr_pointed1 = *((void **)(area1));
+ addr_pointed2 = *((void **)(area2));
+
if(type->subtype && type->subtype->type == DW_TAG_subroutine_type){
- addr_pointed1 = *((void **)(area1));
- addr_pointed2 = *((void **)(area2));
return (addr_pointed1 != addr_pointed2);
}else{
- addr_pointed1 = *((void **)(area1));
- addr_pointed2 = *((void **)(area2));
if(addr_pointed1 == NULL && addr_pointed2 == NULL)
return 0;
return 1;
if(type->dw_type_id == NULL)
return (addr_pointed1 != addr_pointed2);
- else
- return compare_areas_with_type(addr_pointed1, addr_pointed2, snapshot1, snapshot2, info, other_info, type->subtype, region_size, region_type, start_data, pointer_level);
+ else {
+ void* translated_addr_pointer1 = mc_translate_address((uintptr_t)addr_pointed1, snapshot1);
+ void* translated_addr_pointer2 = mc_translate_address((uintptr_t)addr_pointed2, snapshot2);
+ return compare_areas_with_type(
+ translated_addr_pointer1, translated_addr_pointer2, snapshot1, snapshot2, info, other_info, type->subtype, region_size, region_type, start_data, pointer_level);
+ }
}
else{
case DW_TAG_class_type:
xbt_dynar_foreach(type->members, cursor, member){
XBT_DEBUG("Compare member %s", member->name);
- res = compare_areas_with_type((char *)area1 + member->offset, (char *)area2 + member->offset, snapshot1, snapshot2, info, other_info, member->subtype, region_size, region_type, start_data, pointer_level);
+ void* member1 = mc_member_snapshot_resolve(area1, type, member, snapshot1);
+ void* member2 = mc_member_snapshot_resolve(area2, type, member, snapshot2);
+ res = compare_areas_with_type(member1, member2, snapshot1, snapshot2, info, other_info, member->subtype, region_size, region_type, start_data, pointer_level);
if(res == 1)
return res;
}