X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7103743c77273a47045e089339e6f1341afa7220..7bf4da31d5d3b1940d0166da655136ccf6af8148:/src/mc/inspect/mc_dwarf.cpp diff --git a/src/mc/inspect/mc_dwarf.cpp b/src/mc/inspect/mc_dwarf.cpp index 93fc9c70dc..a6d44f9254 100644 --- a/src/mc/inspect/mc_dwarf.cpp +++ b/src/mc/inspect/mc_dwarf.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2008-2020. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -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/RemoteClient.hpp" +#include "src/mc/remote/RemoteSimulation.hpp" #include #include @@ -59,7 +59,7 @@ static uint64_t MC_dwarf_array_element_count(Dwarf_Die* die, Dwarf_Die* unit); /** @brief Process a DIE * - * @param info the resulting object fot the library/binary file (output) + * @param info the resulting object for the library/binary file (output) * @param die the current DIE * @param unit the DIE of the compile unit of the current DIE * @param frame containing frame if any @@ -74,7 +74,7 @@ static void MC_dwarf_handle_type_die(simgrid::mc::ObjectInformation* info, Dwarf /** @brief Calls MC_dwarf_handle_die on all children of the given die * - * @param info the resulting object fot the library/binary file (output) + * @param info the resulting object for the library/binary file (output) * @param die the current DIE * @param unit the DIE of the compile unit of the current DIE * @param frame containing frame if any @@ -84,12 +84,12 @@ static void MC_dwarf_handle_children(simgrid::mc::ObjectInformation* info, Dwarf /** @brief Handle a variable (DW_TAG_variable or other) * - * @param info the resulting object fot the library/binary file (output) + * @param info the resulting object for the library/binary file (output) * @param die the current DIE * @param unit the DIE of the compile unit of the current DIE * @param frame containing frame if any */ -static void MC_dwarf_handle_variable_die(simgrid::mc::ObjectInformation* info, Dwarf_Die* die, Dwarf_Die* unit, +static void MC_dwarf_handle_variable_die(simgrid::mc::ObjectInformation* info, Dwarf_Die* die, const Dwarf_Die* unit, simgrid::mc::Frame* frame, const char* ns); /** @brief Get the DW_TAG_type of the DIE @@ -123,7 +123,6 @@ enum class FormClass { static TagClass classify_tag(int tag) { switch (tag) { - case DW_TAG_array_type: case DW_TAG_class_type: case DW_TAG_enumeration_type: @@ -224,7 +223,7 @@ static FormClass classify_form(int form) */ inline XBT_PRIVATE const char* tagname(Dwarf_Die* die) { - return simgrid::dwarf::tagname(dwarf_tag(die)); + return tagname(dwarf_tag(die)); } } // namespace dwarf @@ -397,8 +396,7 @@ static uint64_t MC_dwarf_array_element_count(Dwarf_Die* die, Dwarf_Die* unit) int result = 1; Dwarf_Die child; - int res; - for (res = dwarf_child(die, &child); res == 0; res = dwarf_siblingof(&child, &child)) { + for (int res = dwarf_child(die, &child); res == 0; res = dwarf_siblingof(&child, &child)) { int child_tag = dwarf_tag(&child); if (child_tag == DW_TAG_subrange_type || child_tag == DW_TAG_enumeration_type) result *= MC_dwarf_subrange_element_count(&child, unit); @@ -432,7 +430,7 @@ static bool MC_compare_variable(simgrid::mc::Variable const& a, simgrid::mc::Var * @param member the member of the type * @param child DIE of the member (DW_TAG_member) */ -static void MC_dwarf_fill_member_location(simgrid::mc::Type* type, simgrid::mc::Member* member, Dwarf_Die* child) +static void MC_dwarf_fill_member_location(const simgrid::mc::Type* type, simgrid::mc::Member* member, Dwarf_Die* child) { xbt_assert(not dwarf_hasattr(child, DW_AT_data_bit_offset), "Can't groke DW_AT_data_bit_offset."); @@ -485,16 +483,14 @@ static void MC_dwarf_fill_member_location(simgrid::mc::Type* type, simgrid::mc:: * @param unit DIE of the compilation unit containing the type DIE * @param type the type */ -static void MC_dwarf_add_members(simgrid::mc::ObjectInformation* /*info*/, Dwarf_Die* die, Dwarf_Die* /*unit*/, - simgrid::mc::Type* type) +static void MC_dwarf_add_members(const simgrid::mc::ObjectInformation* /*info*/, Dwarf_Die* die, + const Dwarf_Die* /*unit*/, simgrid::mc::Type* type) { - int res; Dwarf_Die child; xbt_assert(type->members.empty()); - for (res = dwarf_child(die, &child); res == 0; res = dwarf_siblingof(&child, &child)) { + for (int res = dwarf_child(die, &child); res == 0; res = dwarf_siblingof(&child, &child)) { int tag = dwarf_tag(&child); if (tag == DW_TAG_member || tag == DW_TAG_inheritance) { - // Skip declarations: if (MC_dwarf_attr_flag(&child, DW_AT_declaration, false)) continue; @@ -646,8 +642,8 @@ static void MC_dwarf_handle_type_die(simgrid::mc::ObjectInformation* info, Dwarf static int mc_anonymous_variable_index = 0; static std::unique_ptr MC_die_to_variable(simgrid::mc::ObjectInformation* info, Dwarf_Die* die, - Dwarf_Die* /*unit*/, simgrid::mc::Frame* frame, - const char* ns) + const Dwarf_Die* /*unit*/, + const simgrid::mc::Frame* frame, const char* ns) { // Skip declarations: if (MC_dwarf_attr_flag(die, DW_AT_declaration, false)) @@ -662,10 +658,10 @@ static std::unique_ptr MC_die_to_variable(simgrid::mc::Ob // No location: do not add it ? return nullptr; - std::unique_ptr variable = std::unique_ptr(new simgrid::mc::Variable()); - variable->id = dwarf_dieoffset(die); - variable->global = frame == nullptr; // Can be override base on DW_AT_location - variable->object_info = info; + auto variable = std::make_unique(); + variable->id = dwarf_dieoffset(die); + variable->global = frame == nullptr; // Can be override base on DW_AT_location + variable->object_info = info; const char* name = MC_dwarf_attr_integrate_string(die, DW_AT_name); if (name) @@ -692,9 +688,9 @@ static std::unique_ptr MC_die_to_variable(simgrid::mc::Ob if (len == 1 && expr[0].atom == DW_OP_addr) { variable->global = true; - uintptr_t offset = (uintptr_t)expr[0].number; - uintptr_t base = (uintptr_t)info->base_address(); - variable->address = (void*)(base + offset); + auto offset = static_cast(expr[0].number); + auto base = reinterpret_cast(info->base_address()); + variable->address = reinterpret_cast(base + offset); } else variable->location_list = { simgrid::dwarf::LocationListEntry(simgrid::dwarf::DwarfExpression(expr, expr + len))}; @@ -741,7 +737,7 @@ static std::unique_ptr MC_die_to_variable(simgrid::mc::Ob return variable; } -static void MC_dwarf_handle_variable_die(simgrid::mc::ObjectInformation* info, Dwarf_Die* die, Dwarf_Die* unit, +static void MC_dwarf_handle_variable_die(simgrid::mc::ObjectInformation* info, Dwarf_Die* die, const Dwarf_Die* unit, simgrid::mc::Frame* frame, const char* ns) { std::unique_ptr variable = MC_die_to_variable(info, die, unit, frame, ns); @@ -788,11 +784,11 @@ static void MC_dwarf_handle_scope_die(simgrid::mc::ObjectInformation* info, Dwar // This is the base address for DWARF addresses. // Relocated addresses are offset from this base address. // See DWARF4 spec 7.5 - std::uint64_t base = (std::uint64_t)info->base_address(); + auto base = reinterpret_cast(info->base_address()); // TODO, support DW_AT_ranges uint64_t low_pc = MC_dwarf_attr_integrate_addr(die, DW_AT_low_pc); - frame.range.begin() = low_pc ? (std::uint64_t)base + low_pc : 0; + frame.range.begin() = low_pc ? base + low_pc : 0; if (low_pc) { // DW_AT_high_pc: Dwarf_Attribute attr; @@ -802,8 +798,7 @@ static void MC_dwarf_handle_scope_die(simgrid::mc::ObjectInformation* info, Dwar Dwarf_Addr high_pc; switch (simgrid::dwarf::classify_form(dwarf_whatform(&attr))) { - - // DW_AT_high_pc if an offset from the low_pc: + // DW_AT_high_pc if an offset from the low_pc: case simgrid::dwarf::FormClass::Constant: xbt_assert(dwarf_formsdata(&attr, &offset) == 0, "Could not read constant"); @@ -856,8 +851,7 @@ static void MC_dwarf_handle_children(simgrid::mc::ObjectInformation* info, Dwarf { // For each child DIE: Dwarf_Die child; - int res; - for (res = dwarf_child(die, &child); res == 0; res = dwarf_siblingof(&child, &child)) + for (int res = dwarf_child(die, &child); res == 0; res = dwarf_siblingof(&child, &child)) MC_dwarf_handle_die(info, &child, unit, frame, ns); } @@ -867,8 +861,7 @@ static void MC_dwarf_handle_die(simgrid::mc::ObjectInformation* info, Dwarf_Die* int tag = dwarf_tag(die); simgrid::dwarf::TagClass klass = simgrid::dwarf::classify_tag(tag); switch (klass) { - - // Type: + // Type: case simgrid::dwarf::TagClass::Type: MC_dwarf_handle_type_die(info, die, unit, frame, ns); break; @@ -895,10 +888,10 @@ static void MC_dwarf_handle_die(simgrid::mc::ObjectInformation* info, Dwarf_Die* static Elf64_Half get_type(Elf* elf) { - Elf64_Ehdr* ehdr64 = elf64_getehdr(elf); + const Elf64_Ehdr* ehdr64 = elf64_getehdr(elf); if (ehdr64) return ehdr64->e_type; - Elf32_Ehdr* ehdr32 = elf32_getehdr(elf); + const Elf32_Ehdr* ehdr32 = elf32_getehdr(elf); if (ehdr32) return ehdr32->e_type; xbt_die("Could not get ELF heeader"); @@ -939,7 +932,7 @@ static std::vector get_build_id(Elf* elf) // Iterate over the program headers and find the PT_NOTE ones: for (size_t i = 0; i < phnum; ++i) { GElf_Phdr phdr_temp; - GElf_Phdr* phdr = gelf_getphdr(elf, i, &phdr_temp); + const GElf_Phdr* phdr = gelf_getphdr(elf, i, &phdr_temp); if (phdr->p_type != PT_NOTE) continue; @@ -959,7 +952,7 @@ static std::vector get_build_id(Elf* elf) memcmp((char*)data->d_buf + name_pos, "GNU", sizeof("GNU")) == 0) { XBT_DEBUG("Found GNU/NT_GNU_BUILD_ID note"); char* start = (char*)data->d_buf + desc_pos; - char* end = (char*)start + nhdr.n_descsz; + char* end = start + nhdr.n_descsz; return std::vector(start, end); } } @@ -1028,7 +1021,7 @@ static std::string find_by_build_id(std::vector id) return std::string(); } -/** @brief Populate the debugging informations of the given ELF object +/** @brief Populate the debugging information of the given ELF object * * Read the DWARf information of the EFFL object and populate the * lists of types, variables, functions. @@ -1062,7 +1055,7 @@ static void MC_load_dwarf(simgrid::mc::ObjectInformation* info) dwarf_end(dwarf); // If there was no DWARF in the file, try to find it in a separate file. - // Different methods might be used to store the DWARF informations: + // Different methods might be used to store the DWARF information: // * GNU NT_GNU_BUILD_ID // * .gnu_debuglink // See https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html @@ -1139,7 +1132,6 @@ static void MC_post_process_variables(simgrid::mc::ObjectInformation* info) static void mc_post_process_scope(simgrid::mc::ObjectInformation* info, simgrid::mc::Frame* scope) { - if (scope->tag == DW_TAG_inlined_subroutine) { // Attach correct namespaced name in inlined subroutine: auto i = info->subprograms.find(scope->abstract_origin_id); @@ -1195,12 +1187,11 @@ static void MC_post_process_types(simgrid::mc::ObjectInformation* info) namespace simgrid { namespace mc { -/** @brief Finds informations about a given shared object/executable */ -std::shared_ptr createObjectInformation(std::vector const& maps, - const char* name) +/** @brief Finds information about a given shared object/executable */ +std::shared_ptr createObjectInformation(std::vector const& maps, const char* name) { - std::shared_ptr result = std::make_shared(); - result->file_name = 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()); @@ -1213,12 +1204,11 @@ std::shared_ptr createObjectInformation(std::vec /*************************************************************************/ -void postProcessObjectInformation(simgrid::mc::RemoteClient* process, simgrid::mc::ObjectInformation* info) +void postProcessObjectInformation(const RemoteSimulation* process, ObjectInformation* info) { for (auto& t : info->types) { - - simgrid::mc::Type* type = &(t.second); - simgrid::mc::Type* subtype = type; + Type* type = &(t.second); + Type* subtype = type; while (subtype->type == DW_TAG_typedef || subtype->type == DW_TAG_volatile_type || subtype->type == DW_TAG_const_type) if (subtype->subtype)