From cdf8123ef60cd6d3afdddffd7902dec56bb52a50 Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Mon, 20 Jul 2015 11:32:24 +0200 Subject: [PATCH 1/1] [mc] OOPify/C++ify Type (cont) Make members a std::vector. --- src/mc/mc_compare.cpp | 11 +++++------ src/mc/mc_diff.cpp | 27 +++++++++++---------------- src/mc/mc_dwarf.cpp | 35 ++++++++++++++--------------------- src/mc/mc_object_info.cpp | 6 ------ src/mc/mc_object_info.h | 9 +++++---- teshsuite/mc/dwarf/dwarf.cpp | 13 ++++++------- 6 files changed, 41 insertions(+), 60 deletions(-) diff --git a/src/mc/mc_compare.cpp b/src/mc/mc_compare.cpp index 284cc519ac..ed81cf6d40 100644 --- a/src/mc/mc_compare.cpp +++ b/src/mc/mc_compare.cpp @@ -108,8 +108,7 @@ static int compare_areas_with_type(struct mc_compare_state& state, { 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: @@ -232,18 +231,18 @@ static int compare_areas_with_type(struct mc_compare_state& state, } 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; } diff --git a/src/mc/mc_diff.cpp b/src/mc/mc_diff.cpp index 7e3bb37fd1..d489ae5e2e 100644 --- a/src/mc/mc_diff.cpp +++ b/src/mc/mc_diff.cpp @@ -895,9 +895,7 @@ top: 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); @@ -1042,17 +1040,16 @@ top: 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; @@ -1104,20 +1101,18 @@ static mc_type_t get_offset_type(void *real_base_address, mc_type_t type, 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; } } diff --git a/src/mc/mc_dwarf.cpp b/src/mc/mc_dwarf.cpp index ea43d50626..f83f1464e9 100644 --- a/src/mc/mc_dwarf.cpp +++ b/src/mc/mc_dwarf.cpp @@ -541,9 +541,7 @@ static void MC_dwarf_add_members(mc_object_info_t info, Dwarf_Die * die, { 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); @@ -558,22 +556,22 @@ static void MC_dwarf_add_members(mc_object_info_t info, Dwarf_Die * die, 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); } @@ -581,15 +579,15 @@ static void MC_dwarf_add_members(mc_object_info_t info, Dwarf_Die * die, 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)); } } } @@ -1257,13 +1255,8 @@ static void MC_post_process_types(mc_object_info_t info) // 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); } } diff --git a/src/mc/mc_object_info.cpp b/src/mc/mc_object_info.cpp index 8301068fd8..5027e08111 100644 --- a/src/mc/mc_object_info.cpp +++ b/src/mc/mc_object_info.cpp @@ -22,17 +22,11 @@ Type::Type() 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 diff --git a/src/mc/mc_object_info.h b/src/mc/mc_object_info.h index 9dbbf53a96..237d1cbc76 100644 --- a/src/mc/mc_object_info.h +++ b/src/mc/mc_object_info.h @@ -40,9 +40,10 @@ namespace mc { 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) */ @@ -50,7 +51,7 @@ public: 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 members; /* if DW_TAG_structure_type, DW_TAG_class_type, DW_TAG_union_type*/ int is_pointer_type; // Location (for members) is either of: diff --git a/teshsuite/mc/dwarf/dwarf.cpp b/teshsuite/mc/dwarf/dwarf.cpp index 399795add7..930e72aaac 100644 --- a/teshsuite/mc/dwarf/dwarf.cpp +++ b/teshsuite/mc/dwarf/dwarf.cpp @@ -98,13 +98,12 @@ static dw_variable_t test_global_variable(mc_process_t process, mc_object_info_t 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; -- 2.20.1