X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a109dc72a412b706828aefaa315f2ba710dee2df..b3b356352e87ae00a20f737c48e19b0c8413455a:/src/mc/mc_dwarf.cpp diff --git a/src/mc/mc_dwarf.cpp b/src/mc/mc_dwarf.cpp index ed26c43a96..92835289af 100644 --- a/src/mc/mc_dwarf.cpp +++ b/src/mc/mc_dwarf.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2014. The SimGrid Team. +/* Copyright (c) 2008-2015. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -23,6 +23,10 @@ #include "mc_object_info.h" #include "mc_private.h" +#include "mc_process.h" + +#include "mc/ObjectInformation.hpp" +#include "mc/Variable.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_dwarf, mc, "DWARF processing"); @@ -61,14 +65,14 @@ static uint64_t MC_dwarf_array_element_count(Dwarf_Die * die, Dwarf_Die * unit); * \param unit the DIE of the compile unit of the current DIE * \param frame containg frame if any */ -static void MC_dwarf_handle_die(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, mc_frame_t frame, +static void MC_dwarf_handle_die(simgrid::mc::ObjectInformation* info, Dwarf_Die * die, + Dwarf_Die * unit, simgrid::mc::Frame* 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, mc_frame_t frame, +static void MC_dwarf_handle_type_die(simgrid::mc::ObjectInformation* info, Dwarf_Die * die, + Dwarf_Die * unit, simgrid::mc::Frame* frame, const char *ns); /** \brief Calls MC_dwarf_handle_die on all childrend of the given die @@ -78,8 +82,8 @@ static void MC_dwarf_handle_type_die(mc_object_info_t info, Dwarf_Die * die, * \param unit the DIE of the compile unit of the current DIE * \param frame containg frame if any */ -static void MC_dwarf_handle_children(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, mc_frame_t frame, +static void MC_dwarf_handle_children(simgrid::mc::ObjectInformation* info, Dwarf_Die * die, + Dwarf_Die * unit, simgrid::mc::Frame* frame, const char *ns); /** \brief Handle a variable (DW_TAG_variable or other) @@ -89,8 +93,8 @@ static void MC_dwarf_handle_children(mc_object_info_t info, Dwarf_Die * die, * \param unit the DIE of the compile unit of the current 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, mc_frame_t frame, +static void MC_dwarf_handle_variable_die(simgrid::mc::ObjectInformation* info, Dwarf_Die * die, + Dwarf_Die * unit, simgrid::mc::Frame* frame, const char *ns); /** \brief Get the DW_TAG_type of the DIE @@ -468,7 +472,7 @@ static bool MC_compare_variable( return a.address < b.address; } -// ***** mc_type_t +// ***** simgrid::mc::Type* /** \brief Initialize the location of a member of a type * (DW_AT_data_member_location of a DW_TAG_member). @@ -477,7 +481,7 @@ static bool MC_compare_variable( * \param member the member of the type * \param child DIE of the member (DW_TAG_member) */ -static void MC_dwarf_fill_member_location(mc_type_t type, mc_type_t member, +static void MC_dwarf_fill_member_location(simgrid::mc::Type* type, simgrid::mc::Type* member, Dwarf_Die * child) { if (dwarf_hasattr(child, DW_AT_data_bit_offset)) { @@ -547,8 +551,8 @@ static void MC_dwarf_fill_member_location(mc_type_t type, mc_type_t member, * \param unit DIE of the compilation unit containing the type DIE * \param type the type */ -static void MC_dwarf_add_members(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, mc_type_t type) +static void MC_dwarf_add_members(simgrid::mc::ObjectInformation* info, Dwarf_Die * die, + Dwarf_Die * unit, simgrid::mc::Type* type) { int res; Dwarf_Die child; @@ -606,18 +610,15 @@ static void MC_dwarf_add_members(mc_object_info_t info, Dwarf_Die * die, * \return MC representation of the type */ static simgrid::mc::Type MC_dwarf_die_to_type( - mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, mc_frame_t frame, + simgrid::mc::ObjectInformation* info, Dwarf_Die * die, + Dwarf_Die * unit, simgrid::mc::Frame* frame, const char *ns) { - simgrid::mc::Type type; - type.type = -1; + type.type = dwarf_tag(die); type.name = std::string(); type.element_count = -1; - type.type = dwarf_tag(die); - // Global Offset type.id = dwarf_dieoffset(die); @@ -690,8 +691,8 @@ static simgrid::mc::Type MC_dwarf_die_to_type( return std::move(type); } -static void MC_dwarf_handle_type_die(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, mc_frame_t frame, +static void MC_dwarf_handle_type_die(simgrid::mc::ObjectInformation* info, Dwarf_Die * die, + Dwarf_Die * unit, simgrid::mc::Frame* frame, const char *ns) { simgrid::mc::Type type = MC_dwarf_die_to_type(info, die, unit, frame, ns); @@ -703,8 +704,8 @@ static void MC_dwarf_handle_type_die(mc_object_info_t info, Dwarf_Die * die, static int mc_anonymous_variable_index = 0; static std::unique_ptr MC_die_to_variable( - mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, mc_frame_t frame, + simgrid::mc::ObjectInformation* info, Dwarf_Die * die, + Dwarf_Die * unit, simgrid::mc::Frame* frame, const char *ns) { // Skip declarations: @@ -814,8 +815,8 @@ static std::unique_ptr MC_die_to_variable( return std::move(variable); } -static void MC_dwarf_handle_variable_die(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, mc_frame_t frame, +static void MC_dwarf_handle_variable_die(simgrid::mc::ObjectInformation* info, Dwarf_Die * die, + Dwarf_Die * unit, simgrid::mc::Frame* frame, const char *ns) { std::unique_ptr variable = @@ -831,8 +832,8 @@ static void MC_dwarf_handle_variable_die(mc_object_info_t info, Dwarf_Die * die, xbt_die("No frame for this local variable"); } -static void MC_dwarf_handle_scope_die(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, mc_frame_t parent_frame, +static void MC_dwarf_handle_scope_die(simgrid::mc::ObjectInformation* info, Dwarf_Die * die, + Dwarf_Die * unit, simgrid::mc::Frame* parent_frame, const char *ns) { // TODO, handle DW_TAG_type/DW_TAG_location for DW_TAG_with_stmt @@ -857,8 +858,10 @@ static void MC_dwarf_handle_scope_die(mc_object_info_t info, Dwarf_Die * die, const char *name = MC_dwarf_attr_integrate_string(die, DW_AT_name); if(ns) frame.name = std::string(ns) + "::" + name; - else + else if (name) frame.name = name; + else + frame.name.clear(); } frame.abstract_origin_id = @@ -926,9 +929,9 @@ static void MC_dwarf_handle_scope_die(mc_object_info_t info, Dwarf_Die * die, parent_frame->scopes.push_back(std::move(frame)); } -static void mc_dwarf_handle_namespace_die(mc_object_info_t info, +static void mc_dwarf_handle_namespace_die(simgrid::mc::ObjectInformation* info, Dwarf_Die * die, Dwarf_Die * unit, - mc_frame_t frame, + simgrid::mc::Frame* frame, const char *ns) { const char *name = MC_dwarf_attr_integrate_string(die, DW_AT_name); @@ -940,8 +943,8 @@ static void mc_dwarf_handle_namespace_die(mc_object_info_t info, xbt_free(new_ns); } -static void MC_dwarf_handle_children(mc_object_info_t info, Dwarf_Die * die, - Dwarf_Die * unit, mc_frame_t frame, +static void MC_dwarf_handle_children(simgrid::mc::ObjectInformation* info, Dwarf_Die * die, + Dwarf_Die * unit, simgrid::mc::Frame* frame, const char *ns) { // For each child DIE: @@ -953,8 +956,8 @@ 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, mc_frame_t frame, +static void MC_dwarf_handle_die(simgrid::mc::ObjectInformation* info, Dwarf_Die * die, + Dwarf_Die * unit, simgrid::mc::Frame* frame, const char *ns) { int tag = dwarf_tag(die); @@ -992,7 +995,7 @@ static void MC_dwarf_handle_die(mc_object_info_t info, Dwarf_Die * die, * Read the DWARf information of the EFFL object and populate the * lists of types, variables, functions. */ -void MC_dwarf_get_variables(mc_object_info_t info) +void MC_dwarf_get_variables(simgrid::mc::ObjectInformation* info) { int fd = open(info->file_name.c_str(), O_RDONLY); if (fd < 0) @@ -1039,7 +1042,7 @@ static int MC_compare_frame_index_items(simgrid::mc::FunctionIndexEntry* a, return 1; } -static void MC_make_functions_index(mc_object_info_t info) +static void MC_make_functions_index(simgrid::mc::ObjectInformation* info) { info->functions_index.clear(); @@ -1056,14 +1059,14 @@ static void MC_make_functions_index(mc_object_info_t info) // Sort the array by low_pc: std::sort(info->functions_index.begin(), info->functions_index.end(), - [](simgrid::mc::FunctionIndexEntry& a, - simgrid::mc::FunctionIndexEntry& b) + [](simgrid::mc::FunctionIndexEntry const& a, + simgrid::mc::FunctionIndexEntry const& b) { return a.low_pc < b.low_pc; }); } -static void MC_post_process_variables(mc_object_info_t info) +static void MC_post_process_variables(simgrid::mc::ObjectInformation* info) { // Someone needs this to be sorted but who? std::sort(info->global_variables.begin(), info->global_variables.end(), @@ -1076,7 +1079,7 @@ static void MC_post_process_variables(mc_object_info_t info) } } -static void mc_post_process_scope(mc_object_info_t info, mc_frame_t scope) +static void mc_post_process_scope(simgrid::mc::ObjectInformation* info, simgrid::mc::Frame* scope) { if (scope->tag == DW_TAG_inlined_subroutine) { @@ -1103,7 +1106,7 @@ static void mc_post_process_scope(mc_object_info_t info, mc_frame_t scope) /** \brief Fill/lookup the "subtype" field. */ -static void MC_resolve_subtype(mc_object_info_t info, mc_type_t type) +static void MC_resolve_subtype(simgrid::mc::ObjectInformation* info, simgrid::mc::Type* type) { if (!type->type_id) return; @@ -1122,7 +1125,7 @@ static void MC_resolve_subtype(mc_object_info_t info, mc_type_t type) type->subtype = *subtype; } -static void MC_post_process_types(mc_object_info_t info) +static void MC_post_process_types(simgrid::mc::ObjectInformation* info) { // Lookup "subtype" field: for(auto& i : info->types) { @@ -1133,13 +1136,13 @@ static void MC_post_process_types(mc_object_info_t info) } /** \brief Finds informations about a given shared object/executable */ -std::shared_ptr MC_find_object_info( +std::shared_ptr MC_find_object_info( std::vector const& maps, const char *name, int executable) { - std::shared_ptr result = - std::make_shared(); + std::shared_ptr result = + std::make_shared(); if (executable) - result->flags |= MC_OBJECT_INFO_EXECUTABLE; + result->flags |= simgrid::mc::ObjectInformation::Executable; result->file_name = name; MC_find_object_address(maps, result.get()); MC_dwarf_get_variables(result.get()); @@ -1153,12 +1156,12 @@ std::shared_ptr MC_find_object_info( /*************************************************************************/ -void MC_post_process_object_info(mc_process_t process, mc_object_info_t info) +void MC_post_process_object_info(simgrid::mc::Process* process, simgrid::mc::ObjectInformation* info) { for (auto& i : info->types) { - mc_type_t type = &(i.second); - mc_type_t subtype = type; + simgrid::mc::Type* type = &(i.second); + simgrid::mc::Type* subtype = type; while (subtype->type == DW_TAG_typedef || subtype->type == DW_TAG_volatile_type || subtype->type == DW_TAG_const_type) { if (subtype->subtype)