X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f2b3af5dd26bac71e8770b5f22f57fd2e0087f32..97b1421930b3e7d2a0e9fc7c501486a6d0b2d402:/src/mc/inspect/mc_dwarf.cpp diff --git a/src/mc/inspect/mc_dwarf.cpp b/src/mc/inspect/mc_dwarf.cpp index e5e62b623e..90277e10f2 100644 --- a/src/mc/inspect/mc_dwarf.cpp +++ b/src/mc/inspect/mc_dwarf.cpp @@ -13,7 +13,7 @@ #include "src/mc/inspect/Variable.hpp" #include "src/mc/inspect/mc_dwarf.hpp" #include "src/mc/mc_private.hpp" -#include "src/mc/remote/RemoteSimulation.hpp" +#include "src/mc/remote/RemoteProcess.hpp" #include #include @@ -399,10 +399,10 @@ static void MC_dwarf_fill_member_location(const simgrid::mc::Type* type, simgrid xbt_assert(not dwarf_hasattr(child, DW_AT_data_bit_offset), "Can't groke DW_AT_data_bit_offset."); if (not dwarf_hasattr_integrate(child, DW_AT_data_member_location)) { - if (type->type == DW_TAG_union_type) - return; - xbt_die("Missing DW_AT_data_member_location field in DW_TAG_member %s of type <%" PRIx64 ">%s", - member->name.c_str(), (uint64_t)type->id, type->name.c_str()); + xbt_assert(type->type == DW_TAG_union_type, + "Missing DW_AT_data_member_location field in DW_TAG_member %s of type <%" PRIx64 ">%s", + member->name.c_str(), (uint64_t)type->id, type->name.c_str()); + return; } Dwarf_Attribute attr; @@ -603,8 +603,6 @@ static void MC_dwarf_handle_type_die(simgrid::mc::ObjectInformation* info, Dwarf info->full_types_by_name[t.name] = &t; } -static int mc_anonymous_variable_index = 0; - static std::unique_ptr MC_die_to_variable(simgrid::mc::ObjectInformation* info, Dwarf_Die* die, const Dwarf_Die* /*unit*/, const simgrid::mc::Frame* frame, const char* ns) @@ -694,6 +692,7 @@ static std::unique_ptr MC_die_to_variable(simgrid::mc::Ob // The current code needs a variable name, // generate a fake one: + static int mc_anonymous_variable_index = 0; if (variable->name.empty()) { variable->name = "@anonymous#" + std::to_string(mc_anonymous_variable_index); mc_anonymous_variable_index++; @@ -995,9 +994,7 @@ static void MC_load_dwarf(simgrid::mc::ObjectInformation* info) int fd = open(info->file_name.c_str(), O_RDONLY); xbt_assert(fd >= 0, "Could not open file %s", info->file_name.c_str()); Elf* elf = elf_begin(fd, ELF_C_READ, nullptr); - xbt_assert(elf != nullptr, "Not an ELF file"); - Elf_Kind kind = elf_kind(elf); - xbt_assert(kind == ELF_K_ELF, "Not an ELF file"); + xbt_assert(elf != nullptr && elf_kind(elf) == ELF_K_ELF, "%s is not an ELF file", info->file_name.c_str()); // Remember if this is a `ET_EXEC` (fixed location) or `ET_DYN`: Elf64_Half type = get_type(elf); @@ -1148,24 +1145,32 @@ static void MC_post_process_types(simgrid::mc::ObjectInformation* info) namespace simgrid { namespace mc { +void ObjectInformation::ensure_dwarf_loaded() +{ + if (dwarf_loaded) + return; + dwarf_loaded = true; + + MC_load_dwarf(this); + MC_post_process_variables(this); + MC_post_process_types(this); + for (auto& entry : this->subprograms) + mc_post_process_scope(this, &entry.second); + MC_make_functions_index(this); +} + /** @brief Finds information about a given shared object/executable */ std::shared_ptr createObjectInformation(std::vector const& maps, const char* name) { auto result = std::make_shared(); result->file_name = name; simgrid::mc::find_object_address(maps, result.get()); - MC_load_dwarf(result.get()); - MC_post_process_variables(result.get()); - MC_post_process_types(result.get()); - for (auto& entry : result.get()->subprograms) - mc_post_process_scope(result.get(), &entry.second); - MC_make_functions_index(result.get()); return result; } /*************************************************************************/ -void postProcessObjectInformation(const RemoteSimulation* process, ObjectInformation* info) +void postProcessObjectInformation(const RemoteProcess* process, ObjectInformation* info) { for (auto& t : info->types) { Type* type = &(t.second);