- case DW_TAG_structure_type:
- case DW_TAG_class_type:
- if (type->full_type)
- type = type->full_type;
- if (area_size != -1 && type->byte_size != area_size) {
- if (area_size <= type->byte_size || area_size % type->byte_size != 0)
- return -1;
- for (size_t i = 0; i < (size_t)(area_size / type->byte_size); i++) {
- int res = compare_heap_area_with_type(state, process_index,
- (char *) real_area1 + i * type->byte_size,
- (char *) real_area2 + i * type->byte_size,
- snapshot1, snapshot2, previous, type, -1,
- check_ignore, 0);
- if (res == 1)
- return res;
- }
- } else {
- for(simgrid::mc::Member& member : type->members) {
- // TODO, optimize this? (for the offset case)
- void *real_member1 = simgrid::dwarf::resolve_member(
- real_area1, type, &member, (simgrid::mc::AddressSpace*) snapshot1, process_index);
- void *real_member2 = simgrid::dwarf::resolve_member(
- real_area2, type, &member, (simgrid::mc::AddressSpace*) snapshot2, process_index);
- int res = compare_heap_area_with_type(
- state, process_index, real_member1, real_member2,
- snapshot1, snapshot2,
- previous, member.type, -1,
- check_ignore, 0);
- if (res == 1)
- return res;
- }
- }
- return 0;
+ case DW_TAG_reference_type:
+ case DW_TAG_rvalue_reference_type:
+ case DW_TAG_pointer_type:
+ if (type->subtype && type->subtype->type == DW_TAG_subroutine_type) {
+ addr_pointed1 = snapshot1->read(remote((void**)real_area1), process_index);
+ addr_pointed2 = snapshot2->read(remote((void**)real_area2), process_index);
+ return (addr_pointed1 != addr_pointed2);
+ }
+ pointer_level++;
+ if (pointer_level <= 1) {
+ addr_pointed1 = snapshot1->read(remote((void**)real_area1), process_index);
+ addr_pointed2 = snapshot2->read(remote((void**)real_area2), process_index);
+ if (addr_pointed1 > state.std_heap_copy.heapbase && addr_pointed1 < mc_snapshot_get_heap_end(snapshot1) &&
+ addr_pointed2 > state.std_heap_copy.heapbase && addr_pointed2 < mc_snapshot_get_heap_end(snapshot2))
+ return compare_heap_area(state, process_index, addr_pointed1, addr_pointed2, snapshot1, snapshot2, previous,
+ type->subtype, pointer_level);
+ else
+ return (addr_pointed1 != addr_pointed2);
+ }
+ for (size_t i = 0; i < (area_size / sizeof(void*)); i++) {
+ addr_pointed1 = snapshot1->read(remote((void**)((char*)real_area1 + i * sizeof(void*))), process_index);
+ addr_pointed2 = snapshot2->read(remote((void**)((char*)real_area2 + i * sizeof(void*))), process_index);
+ int res;
+ if (addr_pointed1 > state.std_heap_copy.heapbase && addr_pointed1 < mc_snapshot_get_heap_end(snapshot1) &&
+ addr_pointed2 > state.std_heap_copy.heapbase && addr_pointed2 < mc_snapshot_get_heap_end(snapshot2))
+ res = compare_heap_area(state, process_index, addr_pointed1, addr_pointed2, snapshot1, snapshot2, previous,
+ type->subtype, pointer_level);
+ else
+ res = (addr_pointed1 != addr_pointed2);
+ if (res == 1)
+ return res;
+ }
+ return 0;
+
+ case DW_TAG_structure_type:
+ case DW_TAG_class_type:
+ if (type->full_type)
+ type = type->full_type;
+ if (area_size != -1 && type->byte_size != area_size) {
+ if (area_size <= type->byte_size || area_size % type->byte_size != 0)
+ return -1;
+ for (size_t i = 0; i < (size_t)(area_size / type->byte_size); i++) {
+ int res = compare_heap_area_with_type(state, process_index, (char*)real_area1 + i * type->byte_size,
+ (char*)real_area2 + i * type->byte_size, snapshot1, snapshot2,
+ previous, type, -1, check_ignore, 0);
+ if (res == 1)
+ return res;
+ }
+ } else {
+ for (simgrid::mc::Member& member : type->members) {
+ // TODO, optimize this? (for the offset case)
+ void* real_member1 = simgrid::dwarf::resolve_member(real_area1, type, &member,
+ (simgrid::mc::AddressSpace*)snapshot1, process_index);
+ void* real_member2 = simgrid::dwarf::resolve_member(real_area2, type, &member,
+ (simgrid::mc::AddressSpace*)snapshot2, process_index);
+ int res = compare_heap_area_with_type(state, process_index, real_member1, real_member2, snapshot1,
+ snapshot2, previous, member.type, -1, check_ignore, 0);
+ if (res == 1)
+ return res;
+ }
+ }
+ return 0;