Make members a std::vector.
{
mc_process_t process = &mc_model_checker->process();
- unsigned int cursor = 0;
- mc_type_t member, subtype, subsubtype;
+ mc_type_t subtype, subsubtype;
int elm_size, i, res;
top:
}
case DW_TAG_structure_type:
case DW_TAG_class_type:
- xbt_dynar_foreach(type->members, cursor, member) {
+ for(simgrid::mc::Type& member : type->members) {
void *member1 =
- mc_member_resolve(real_area1, type, member, snapshot1, process_index);
+ mc_member_resolve(real_area1, type, &member, snapshot1, process_index);
void *member2 =
- mc_member_resolve(real_area2, type, member, snapshot2, process_index);
+ mc_member_resolve(real_area2, type, &member, snapshot2, process_index);
mc_mem_region_t subregion1 = mc_get_region_hinted(member1, snapshot1, process_index, region1);
mc_mem_region_t subregion2 = mc_get_region_hinted(member2, snapshot2, process_index, region2);
res =
compare_areas_with_type(state, process_index,
member1, snapshot1, subregion1,
member2, snapshot2, subregion2,
- member->subtype, pointer_level);
+ member.subtype, pointer_level);
if (res == 1)
return res;
}
mc_type_t subtype, subsubtype;
int res, elm_size;
- unsigned int cursor = 0;
- mc_type_t member;
- const void *addr_pointed1, *addr_pointed2;;
+ const void *addr_pointed1, *addr_pointed2;
mc_mem_region_t heap_region1 = MC_get_heap_region(snapshot1);
mc_mem_region_t heap_region2 = MC_get_heap_region(snapshot2);
return -1;
}
} else {
- cursor = 0;
- xbt_dynar_foreach(type->members, cursor, member) {
+ for(simgrid::mc::Type& member : type->members) {
// TODO, optimize this? (for the offset case)
void *real_member1 =
- mc_member_resolve(real_area1, type, member, (mc_address_space_t) snapshot1, process_index);
+ mc_member_resolve(real_area1, type, &member, (mc_address_space_t) snapshot1, process_index);
void *real_member2 =
- mc_member_resolve(real_area2, type, member, (mc_address_space_t) snapshot2, process_index);
+ mc_member_resolve(real_area2, type, &member, (mc_address_space_t) snapshot2, process_index);
res =
compare_heap_area_with_type(state, process_index, real_member1, real_member2,
snapshot1, snapshot2,
- previous, member->subtype, -1,
+ previous, member.subtype, -1,
check_ignore, 0);
if (res == 1) {
return res;
else
return NULL;
} else {
- unsigned int cursor = 0;
- mc_type_t member;
- xbt_dynar_foreach(type->members, cursor, member) {
+ for(simgrid::mc::Type& member : type->members) {
- if (member->has_offset_location()) {
+ if (member.has_offset_location()) {
// We have the offset, use it directly (shortcut):
- if (member->offset() == offset)
- return member->subtype;
+ if (member.offset() == offset)
+ return member.subtype;
} else {
void *real_member =
- mc_member_resolve(real_base_address, type, member,
+ mc_member_resolve(real_base_address, type, &member,
snapshot, process_index);
if ((char*) real_member - (char *) real_base_address == offset)
- return member->subtype;
+ return member.subtype;
}
}
{
int res;
Dwarf_Die child;
- xbt_assert(!type->members);
- type->members =
- xbt_dynar_new(sizeof(mc_type_t), (void (*)(void *)) dw_type_free_voidp);
+ xbt_assert(type->members.empty());
for (res = dwarf_child(die, &child); res == 0;
res = dwarf_siblingof(&child, &child)) {
int tag = dwarf_tag(&child);
continue;
// TODO, we should use another type (because is is not a type but a member)
- mc_type_t member = new simgrid::mc::Type();
- member->type = tag;
+ simgrid::mc::Type member;
+ member.type = tag;
// Global Offset:
- member->id = dwarf_dieoffset(&child);
+ member.id = dwarf_dieoffset(&child);
const char *name = MC_dwarf_attr_integrate_string(&child, DW_AT_name);
if (name)
- member->name = name;
- member->byte_size =
+ member.name = name;
+ member.byte_size =
MC_dwarf_attr_integrate_uint(&child, DW_AT_byte_size, 0);
- member->element_count = -1;
+ member.element_count = -1;
char* type_id = MC_dwarf_at_type(&child);
if (type_id) {
- member->dw_type_id = type_id;
+ member.dw_type_id = type_id;
free(type_id);
}
xbt_die("Can't groke DW_AT_data_bit_offset.");
}
- MC_dwarf_fill_member_location(type, member, &child);
+ MC_dwarf_fill_member_location(type, &member, &child);
- if (member->dw_type_id.empty()) {
+ if (member.dw_type_id.empty()) {
xbt_die("Missing type for member %s of <%" PRIx64 ">%s",
- member->name.c_str(),
+ member.name.c_str(),
(uint64_t) type->id, type->name.c_str());
}
- xbt_dynar_push(type->members, &member);
+ type->members.push_back(std::move(member));
}
}
}
// Lookup "subtype" field:
xbt_dict_foreach(info->types, cursor, origin, type) {
MC_resolve_subtype(info, type);
-
- mc_type_t member;
- unsigned int i = 0;
- if (type->members != NULL)
- xbt_dynar_foreach(type->members, i, member) {
- MC_resolve_subtype(info, member);
- }
+ for (simgrid::mc::Type& member : type->members)
+ MC_resolve_subtype(info, &member);
}
}
this->id = 0;
this->byte_size = 0;
this->element_count = 0;
- this->members = nullptr;
this->is_pointer_type = 0;
this->subtype = nullptr;
this->full_type = nullptr;
}
-Type::~Type()
-{
- xbt_dynar_free(&this->members);
-}
-
// ObjectInformations
dw_frame_t ObjectInformation::find_function(const void *ip) const
class Type {
public:
Type();
- ~Type();
- Type(Type const& type) = delete;
- Type& operator=(Type const&) = delete;
+ Type(Type const& type) = default;
+ Type& operator=(Type const&) = default;
+ Type(Type&& type) = default;
+ Type& operator=(Type&&) = default;
e_mc_type_type type;
Dwarf_Off id; /* Offset in the section (in hexadecimal form) */
int byte_size; /* Size in bytes */
int element_count; /* Number of elements for array type */
std::string dw_type_id; /* DW_AT_type id */
- xbt_dynar_t members; /* if DW_TAG_structure_type, DW_TAG_class_type, DW_TAG_union_type*/
+ std::vector<Type> members; /* if DW_TAG_structure_type, DW_TAG_class_type, DW_TAG_union_type*/
int is_pointer_type;
// Location (for members) is either of:
return variable;
}
-static mc_type_t find_member(mc_object_info_t info, const char* name, mc_type_t type) {
- unsigned int cursor = 0;
- mc_type_t member;
- xbt_dynar_foreach(type->members, cursor, member)
- if(member->name == name)
- return member;
- return NULL;
+static mc_type_t find_member(mc_object_info_t info, const char* name, mc_type_t type)
+{
+ for (simgrid::mc::Type& member : type->members)
+ if(member.name == name)
+ return &member;
+ return nullptr;
}
int some_local_variable = 0;