X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/deaddec5dc5d4dda8dc1b9692869970e253facfa..e7173457dce01a608824b72d2e4ff62572d51d13:/src/mc/mc_dwarf.cpp?ds=sidebyside diff --git a/src/mc/mc_dwarf.cpp b/src/mc/mc_dwarf.cpp index ea43d50626..976264c0be 100644 --- a/src/mc/mc_dwarf.cpp +++ b/src/mc/mc_dwarf.cpp @@ -18,13 +18,20 @@ #include "mc_object_info.h" #include "mc_private.h" -static void dw_variable_free(dw_variable_t v); -static void dw_variable_free_voidp(void *t); +static void mc_variable_free_voidp(void *t) +{ + delete *(simgrid::mc::Variable**)t; +} + +static void mc_frame_free(void* frame) +{ + delete (simgrid::mc::Frame*)frame; +} -static void MC_dwarf_register_global_variable(mc_object_info_t info, dw_variable_t variable); -static void MC_register_variable(mc_object_info_t info, dw_frame_t frame, dw_variable_t variable); -static void MC_dwarf_register_non_global_variable(mc_object_info_t info, dw_frame_t frame, dw_variable_t variable); -static void MC_dwarf_register_variable(mc_object_info_t info, dw_frame_t frame, dw_variable_t variable); +static void MC_dwarf_register_global_variable(mc_object_info_t info, mc_variable_t variable); +static void MC_register_variable(mc_object_info_t info, mc_frame_t frame, mc_variable_t variable); +static void MC_dwarf_register_non_global_variable(mc_object_info_t info, mc_frame_t frame, mc_variable_t variable); +static void MC_dwarf_register_variable(mc_object_info_t info, mc_frame_t frame, mc_variable_t variable); XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_dwarf, mc, "DWARF processing"); @@ -64,13 +71,13 @@ static uint64_t MC_dwarf_array_element_count(Dwarf_Die * die, Dwarf_Die * unit); * \param frame containg frame if any */ static void MC_dwarf_handle_die(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, dw_frame_t frame, + Dwarf_Die * unit, mc_frame_t frame, const char *ns); /** \brief Process a type DIE */ static void MC_dwarf_handle_type_die(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, dw_frame_t frame, + Dwarf_Die * unit, mc_frame_t frame, const char *ns); /** \brief Calls MC_dwarf_handle_die on all childrend of the given die @@ -81,7 +88,7 @@ static void MC_dwarf_handle_type_die(mc_object_info_t info, Dwarf_Die * die, * \param frame containg frame if any */ static void MC_dwarf_handle_children(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, dw_frame_t frame, + Dwarf_Die * unit, mc_frame_t frame, const char *ns); /** \brief Handle a variable (DW_TAG_variable or other) @@ -92,7 +99,7 @@ static void MC_dwarf_handle_children(mc_object_info_t info, Dwarf_Die * die, * \param frame containg frame if any */ static void MC_dwarf_handle_variable_die(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, dw_frame_t frame, + Dwarf_Die * unit, mc_frame_t frame, const char *ns); /** \brief Get the DW_TAG_type of the DIE @@ -100,7 +107,7 @@ static void MC_dwarf_handle_variable_die(mc_object_info_t info, Dwarf_Die * die, * \param die DIE * \return DW_TAG_type attribute as a new string (NULL if none) */ -static char *MC_dwarf_at_type(Dwarf_Die * die); +static std::string MC_dwarf_at_type(Dwarf_Die * die); /** \brief A class of DWARF tags (DW_TAG_*) */ @@ -305,10 +312,16 @@ static Dwarf_Off MC_dwarf_attr_integrate_dieoffset(Dwarf_Die * die, * \param dit the DIE * \return DW_AT_type reference as a global offset in hexadecimal (or NULL) */ -static char *MC_dwarf_at_type(Dwarf_Die * die) +static +std::string MC_dwarf_at_type(Dwarf_Die * die) { Dwarf_Off offset = MC_dwarf_attr_integrate_dieoffset(die, DW_AT_type); - return offset == 0 ? NULL : bprintf("%" PRIx64, offset); + if (offset == 0) + return std::string(); + char* s = bprintf("%" PRIx64, offset); + std::string res(s); + free(s); + return std::move(res); } static uint64_t MC_dwarf_attr_integrate_addr(Dwarf_Die * die, int attribute) @@ -541,9 +554,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,38 +569,33 @@ 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; - - char* type_id = MC_dwarf_at_type(&child); - if (type_id) { - member->dw_type_id = type_id; - free(type_id); - } + member.element_count = -1; + member.type_id = MC_dwarf_at_type(&child); if (dwarf_hasattr(&child, DW_AT_data_bit_offset)) { 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.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)); } } } @@ -602,7 +608,7 @@ static void MC_dwarf_add_members(mc_object_info_t info, Dwarf_Die * die, * \return MC representation of the type */ static mc_type_t MC_dwarf_die_to_type(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, dw_frame_t frame, + Dwarf_Die * unit, mc_frame_t frame, const char *ns) { @@ -639,11 +645,7 @@ static mc_type_t MC_dwarf_die_to_type(mc_object_info_t info, Dwarf_Die * die, free(full_name); } - char* type_id = MC_dwarf_at_type(die); - if (type_id) { - type->dw_type_id = type_id; - free(type_id); - } + type->type_id = MC_dwarf_at_type(die); // Some compilers do not emit DW_AT_byte_size for pointer_type, // so we fill this. We currently assume that the model-checked process is in @@ -690,7 +692,7 @@ static mc_type_t MC_dwarf_die_to_type(mc_object_info_t info, Dwarf_Die * die, } static void MC_dwarf_handle_type_die(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, dw_frame_t frame, + Dwarf_Die * unit, mc_frame_t frame, const char *ns) { mc_type_t type = MC_dwarf_die_to_type(info, die, unit, frame, ns); @@ -706,8 +708,8 @@ static void MC_dwarf_handle_type_die(mc_object_info_t info, Dwarf_Die * die, static int mc_anonymous_variable_index = 0; -static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, dw_frame_t frame, +static mc_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die * die, + Dwarf_Die * unit, mc_frame_t frame, const char *ns) { // Skip declarations: @@ -724,15 +726,15 @@ static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die * die, return NULL; } - dw_variable_t variable = xbt_new0(s_dw_variable_t, 1); + simgrid::mc::Variable* variable = new simgrid::mc::Variable(); variable->dwarf_offset = dwarf_dieoffset(die); variable->global = frame == NULL; // Can be override base on DW_AT_location variable->object_info = info; const char *name = MC_dwarf_attr_integrate_string(die, DW_AT_name); - variable->name = xbt_strdup(name); - - variable->type_origin = MC_dwarf_at_type(die); + if (name) + variable->name = name; + variable->type_id = MC_dwarf_at_type(die); int form = dwarf_whatform(&attr_location); int klass = @@ -746,9 +748,11 @@ static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die * die, Dwarf_Op *expr; size_t len; if (dwarf_getlocation(&attr_location, &expr, &len)) { - xbt_die - ("Could not read location expression in DW_AT_location of variable <%" - PRIx64 ">%s", (uint64_t) variable->dwarf_offset, variable->name); + xbt_die( + "Could not read location expression in DW_AT_location " + "of variable <%" PRIx64 ">%s", + (uint64_t) variable->dwarf_offset, + variable->name.c_str()); } if (len == 1 && expr[0].atom == DW_OP_addr) { @@ -757,8 +761,9 @@ static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die * die, uintptr_t base = (uintptr_t) info->base_address(); variable->address = (void *) (base + offset); } else { - mc_dwarf_location_list_init_from_expression(&variable->locations, len, - expr); + mc_dwarf_location_list_init_from_expression( + &variable->location_list, len, + expr); } break; @@ -766,13 +771,16 @@ static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die * die, case MC_DW_CLASS_LOCLISTPTR: case MC_DW_CLASS_CONSTANT: // Reference to location list: - mc_dwarf_location_list_init(&variable->locations, info, die, - &attr_location); + mc_dwarf_location_list_init( + &variable->location_list, info, die, + &attr_location); break; default: - xbt_die("Unexpected form 0x%x (%i), class 0x%x (%i) list for location in <%" - PRIx64 ">%s", form, form, klass, klass, - (uint64_t) variable->dwarf_offset, variable->name); + xbt_die("Unexpected form 0x%x (%i), class 0x%x (%i) list for location " + "in <%" PRIx64 ">%s", + form, form, klass, klass, + (uint64_t) variable->dwarf_offset, + variable->name.c_str()); } // Handle start_scope: @@ -797,39 +805,32 @@ static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die * die, } } - if (ns && variable->global) { - char *old_name = variable->name; - variable->name = bprintf("%s::%s", ns, old_name); - free(old_name); - } + if (ns && variable->global) + variable->name = + std::string(ns) + "::" + variable->name; + // The current code needs a variable name, // generate a fake one: - if (!variable->name) { - variable->name = bprintf("@anonymous#%i", mc_anonymous_variable_index++); - } + if (variable->name.empty()) + variable->name = + "@anonymous#" + std::to_string(mc_anonymous_variable_index++); return variable; } static void MC_dwarf_handle_variable_die(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, dw_frame_t frame, + Dwarf_Die * unit, mc_frame_t frame, const char *ns) { - dw_variable_t variable = + mc_variable_t variable = MC_die_to_variable(info, die, unit, frame, ns); if (variable == NULL) return; MC_dwarf_register_variable(info, frame, variable); } -static void mc_frame_free_voipd(dw_frame_t * p) -{ - mc_frame_free(*p); - *p = NULL; -} - static void MC_dwarf_handle_scope_die(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, dw_frame_t parent_frame, + Dwarf_Die * unit, mc_frame_t parent_frame, const char *ns) { // TODO, handle DW_TAG_type/DW_TAG_location for DW_TAG_with_stmt @@ -844,7 +845,7 @@ static void MC_dwarf_handle_scope_die(mc_object_info_t info, Dwarf_Die * die, if (klass == mc_tag_scope) xbt_assert(parent_frame, "No parent scope for this scope"); - dw_frame_t frame = xbt_new0(s_dw_frame_t, 1); + mc_frame_t frame = new simgrid::mc::Frame(); frame->tag = tag; frame->id = dwarf_dieoffset(die); @@ -852,8 +853,10 @@ static void MC_dwarf_handle_scope_die(mc_object_info_t info, Dwarf_Die * die, if (klass == mc_tag_subprogram) { const char *name = MC_dwarf_attr_integrate_string(die, DW_AT_name); - frame->name = - ns ? bprintf("%s::%s", ns, name) : xbt_strdup(name); + if(ns) + frame->name = std::string(ns) + "::" + name; + else + frame->name = name; } frame->abstract_origin_id = @@ -864,10 +867,6 @@ static void MC_dwarf_handle_scope_die(mc_object_info_t info, Dwarf_Die * die, // See DWARF4 spec 7.5 void *base = info->base_address(); - // Variables are filled in the (recursive) call of MC_dwarf_handle_children: - frame->variables = - xbt_dynar_new(sizeof(dw_variable_t), dw_variable_free_voidp); - // TODO, support DW_AT_ranges uint64_t low_pc = MC_dwarf_attr_integrate_addr(die, DW_AT_low_pc); frame->low_pc = low_pc ? ((char *) base) + low_pc : 0; @@ -911,9 +910,6 @@ static void MC_dwarf_handle_scope_die(mc_object_info_t info, Dwarf_Die * die, &attr_frame_base); } - frame->scopes = - xbt_dynar_new(sizeof(dw_frame_t), (void_f_pvoid_t) mc_frame_free_voipd); - // Register it: if (klass == mc_tag_subprogram) { char *key = bprintf("%" PRIx64, (uint64_t) frame->id); @@ -928,7 +924,7 @@ static void MC_dwarf_handle_scope_die(mc_object_info_t info, Dwarf_Die * die, static void mc_dwarf_handle_namespace_die(mc_object_info_t info, Dwarf_Die * die, Dwarf_Die * unit, - dw_frame_t frame, + mc_frame_t frame, const char *ns) { const char *name = MC_dwarf_attr_integrate_string(die, DW_AT_name); @@ -941,7 +937,7 @@ static void mc_dwarf_handle_namespace_die(mc_object_info_t info, } static void MC_dwarf_handle_children(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, dw_frame_t frame, + Dwarf_Die * unit, mc_frame_t frame, const char *ns) { // For each child DIE: @@ -954,7 +950,7 @@ static void MC_dwarf_handle_children(mc_object_info_t info, Dwarf_Die * die, } static void MC_dwarf_handle_die(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, dw_frame_t frame, + Dwarf_Die * unit, mc_frame_t frame, const char *ns) { int tag = dwarf_tag(die); @@ -1029,37 +1025,11 @@ void MC_dwarf_get_variables(mc_object_info_t info) /************************** Free functions *************************/ -void mc_frame_free(dw_frame_t frame) -{ - xbt_free(frame->name); - mc_dwarf_location_list_clear(&(frame->frame_base)); - xbt_dynar_free(&(frame->variables)); - xbt_dynar_free(&(frame->scopes)); - xbt_free(frame); -} - static void dw_type_free(mc_type_t t) { delete t; } -void dw_variable_free(dw_variable_t v) -{ - if (v) { - xbt_free(v->name); - xbt_free(v->type_origin); - - if (v->locations.locations) - mc_dwarf_location_list_clear(&v->locations); - xbt_free(v); - } -} - -void dw_variable_free_voidp(void *t) -{ - dw_variable_free((dw_variable_t) * (void **) t); -} - // ***** object_info namespace simgrid { @@ -1077,9 +1047,9 @@ ObjectInformation::ObjectInformation() this->end_rw = nullptr; this->start_ro = nullptr; this->end_ro = nullptr; - this->subprograms = xbt_dict_new_homogeneous((void (*)(void *)) mc_frame_free); + this->subprograms = xbt_dict_new_homogeneous(mc_frame_free); this->global_variables = - xbt_dynar_new(sizeof(dw_variable_t), dw_variable_free_voidp); + xbt_dynar_new(sizeof(mc_variable_t), mc_variable_free_voidp); this->types = xbt_dict_new_homogeneous((void (*)(void *)) dw_type_free); this->full_types_by_name = xbt_dict_new_homogeneous(NULL); this->functions_index = nullptr; @@ -1145,7 +1115,7 @@ static void MC_make_functions_index(mc_object_info_t info) xbt_dynar_t index = xbt_dynar_new(sizeof(s_mc_function_index_item_t), NULL); // Populate the array: - dw_frame_t frame = NULL; + mc_frame_t frame = NULL; xbt_dict_cursor_t cursor; char *key; xbt_dict_foreach(info->subprograms, cursor, key, frame) { @@ -1173,38 +1143,36 @@ static void MC_make_functions_index(mc_object_info_t info) static void MC_post_process_variables(mc_object_info_t info) { unsigned cursor = 0; - dw_variable_t variable = NULL; - xbt_dynar_foreach(info->global_variables, cursor, variable) { - if (variable->type_origin) { - variable->type = (mc_type_t) xbt_dict_get_or_null(info->types, variable->type_origin); - } - } + mc_variable_t variable = nullptr; + xbt_dynar_foreach(info->global_variables, cursor, variable) + if (!variable->type_id.empty()) + variable->type = (mc_type_t) xbt_dict_get_or_null( + info->types, variable->type_id.c_str()); } -static void mc_post_process_scope(mc_object_info_t info, dw_frame_t scope) +static void mc_post_process_scope(mc_object_info_t info, mc_frame_t scope) { if (scope->tag == DW_TAG_inlined_subroutine) { // Attach correct namespaced name in inlined subroutine: char *key = bprintf("%" PRIx64, (uint64_t) scope->abstract_origin_id); - dw_frame_t abstract_origin = (dw_frame_t) xbt_dict_get_or_null(info->subprograms, key); + mc_frame_t abstract_origin = (mc_frame_t) xbt_dict_get_or_null(info->subprograms, key); xbt_assert(abstract_origin, "Could not lookup abstract origin %s", key); xbt_free(key); - scope->name = xbt_strdup(abstract_origin->name); - + scope->name = abstract_origin->name; } + // Direct: unsigned cursor = 0; - dw_variable_t variable = NULL; - xbt_dynar_foreach(scope->variables, cursor, variable) { - if (variable->type_origin) { - variable->type = (mc_type_t) xbt_dict_get_or_null(info->types, variable->type_origin); - } - } + mc_variable_t variable = nullptr; + xbt_dynar_foreach(scope->variables, cursor, variable) + if (!variable->type_id.empty()) + variable->type = (mc_type_t) xbt_dict_get_or_null( + info->types, variable->type_id.c_str()); // Recursive post-processing of nested-scopes: - dw_frame_t nested_scope = NULL; + mc_frame_t nested_scope = nullptr; xbt_dynar_foreach(scope->scopes, cursor, nested_scope) mc_post_process_scope(info, nested_scope); @@ -1214,7 +1182,7 @@ static void MC_post_process_functions(mc_object_info_t info) { xbt_dict_cursor_t cursor; char *key; - dw_frame_t subprogram = NULL; + mc_frame_t subprogram = NULL; xbt_dict_foreach(info->subprograms, cursor, key, subprogram) { mc_post_process_scope(info, subprogram); } @@ -1226,10 +1194,10 @@ static void MC_post_process_functions(mc_object_info_t info) static void MC_resolve_subtype(mc_object_info_t info, mc_type_t type) { - if (type->dw_type_id.empty()) + if (type->type_id.empty()) return; type->subtype = (mc_type_t) xbt_dict_get_or_null( - info->types, type->dw_type_id.c_str()); + info->types, type->type_id.c_str()); if (type->subtype == NULL) return; if (type->subtype->byte_size != 0) @@ -1257,13 +1225,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); } } @@ -1287,7 +1250,7 @@ std::shared_ptr MC_find_object_info( /*************************************************************************/ -static int MC_dwarf_get_variable_index(xbt_dynar_t variables, char *var, +static int MC_dwarf_get_variable_index(xbt_dynar_t variables, const char *var, void *address) { @@ -1297,15 +1260,15 @@ static int MC_dwarf_get_variable_index(xbt_dynar_t variables, char *var, unsigned int cursor = 0; int start = 0; int end = xbt_dynar_length(variables) - 1; - dw_variable_t var_test = NULL; + mc_variable_t var_test = NULL; while (start <= end) { cursor = (start + end) / 2; var_test = - (dw_variable_t) xbt_dynar_get_as(variables, cursor, dw_variable_t); - if (strcmp(var_test->name, var) < 0) { + (mc_variable_t) xbt_dynar_get_as(variables, cursor, mc_variable_t); + if (strcmp(var_test->name.c_str(), var) < 0) { start = cursor + 1; - } else if (strcmp(var_test->name, var) > 0) { + } else if (strcmp(var_test->name.c_str(), var) > 0) { end = cursor - 1; } else { if (address) { /* global variable */ @@ -1321,12 +1284,12 @@ static int MC_dwarf_get_variable_index(xbt_dynar_t variables, char *var, } } - if (strcmp(var_test->name, var) == 0) { + if (strcmp(var_test->name.c_str(), var) == 0) { if (address && var_test->address < address) return cursor + 1; else return cursor; - } else if (strcmp(var_test->name, var) < 0) + } else if (strcmp(var_test->name.c_str(), var) < 0) return cursor + 1; else return cursor; @@ -1334,30 +1297,32 @@ static int MC_dwarf_get_variable_index(xbt_dynar_t variables, char *var, } void MC_dwarf_register_global_variable(mc_object_info_t info, - dw_variable_t variable) + mc_variable_t variable) { int index = - MC_dwarf_get_variable_index(info->global_variables, variable->name, - variable->address); + MC_dwarf_get_variable_index(info->global_variables, + variable->name.c_str(), + variable->address); if (index != -1) xbt_dynar_insert_at(info->global_variables, index, &variable); // TODO, else ? } void MC_dwarf_register_non_global_variable(mc_object_info_t info, - dw_frame_t frame, - dw_variable_t variable) + mc_frame_t frame, + mc_variable_t variable) { xbt_assert(frame, "Frame is NULL"); int index = - MC_dwarf_get_variable_index(frame->variables, variable->name, NULL); + MC_dwarf_get_variable_index( + frame->variables, variable->name.c_str(), NULL); if (index != -1) xbt_dynar_insert_at(frame->variables, index, &variable); // TODO, else ? } -void MC_dwarf_register_variable(mc_object_info_t info, dw_frame_t frame, - dw_variable_t variable) +void MC_dwarf_register_variable(mc_object_info_t info, mc_frame_t frame, + mc_variable_t variable) { if (variable->global) MC_dwarf_register_global_variable(info, variable);