X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/bc48db087894fd960073b3120cebf90e6b2f8c02..872d65264714799b25eb231609c3f05bae3d03dc:/src/mc/mc_dwarf.cpp diff --git a/src/mc/mc_dwarf.cpp b/src/mc/mc_dwarf.cpp index 7942ae22b3..30b5f38400 100644 --- a/src/mc/mc_dwarf.cpp +++ b/src/mc/mc_dwarf.cpp @@ -17,6 +17,8 @@ #include #include +#include + #include #include "src/simgrid/util.hpp" #include @@ -571,11 +573,35 @@ static void MC_dwarf_add_members(simgrid::mc::ObjectInformation* info, Dwarf_Die // TODO, we should use another type (because is is not a type but a member) simgrid::mc::Member member; - member.inheritance = tag == DW_TAG_inheritance; + if (tag == DW_TAG_inheritance) + member.flags |= simgrid::mc::Member::INHERITANCE_FLAG; const char *name = MC_dwarf_attr_integrate_string(&child, DW_AT_name); if (name) member.name = name; + // Those base names are used by GCC and clang for virtual table pointers + // respectively ("__vptr$ClassName", "__vptr.ClassName"): + if (boost::algorithm::starts_with(member.name, "__vptr$") || + boost::algorithm::starts_with(member.name, "__vptr.")) + member.flags |= simgrid::mc::Member::VIRTUAL_POINTER_FLAG; + // A cleaner stolution would be to check against the type: + // --- + // tag: DW_TAG_member + // name: "_vptr$Foo" + // type: + // # Type for a pointer to a vtable + // tag: DW_TAG_pointer_type + // type: + // # Type for a vtable: + // tag: DW_TAG_pointer_type + // name: "__vtbl_ptr_type" + // type: + // tag: DW_TAG_subroutine_type + // type: + // tag: DW_TAG_base_type + // name: "int" + // --- + member.byte_size = MC_dwarf_attr_integrate_uint(&child, DW_AT_byte_size, 0); member.type_id = MC_dwarf_at_type(&child); @@ -679,7 +705,7 @@ static simgrid::mc::Type MC_dwarf_die_to_type( break; } - return std::move(type); + return type; } static void MC_dwarf_handle_type_die(simgrid::mc::ObjectInformation* info, Dwarf_Die * die, @@ -714,7 +740,7 @@ static std::unique_ptr MC_die_to_variable( std::unique_ptr variable = std::unique_ptr(new simgrid::mc::Variable()); - variable->dwarf_offset = dwarf_dieoffset(die); + variable->id = dwarf_dieoffset(die); variable->global = frame == nullptr; // Can be override base on DW_AT_location variable->object_info = info; @@ -740,12 +766,12 @@ static std::unique_ptr MC_die_to_variable( xbt_die( "Could not read location expression in DW_AT_location " "of variable <%" PRIx64 ">%s", - (uint64_t) variable->dwarf_offset, + (uint64_t) variable->id, variable->name.c_str()); } if (len == 1 && expr[0].atom == DW_OP_addr) { - variable->global = 1; + variable->global = true; uintptr_t offset = (uintptr_t) expr[0].number; uintptr_t base = (uintptr_t) info->base_address(); variable->address = (void *) (base + offset); @@ -767,7 +793,7 @@ static std::unique_ptr MC_die_to_variable( xbt_die("Unexpected form 0x%x (%i), class 0x%x (%i) list for location " "in <%" PRIx64 ">%s", form, form, (int) form_class, (int) form_class, - (uint64_t) variable->dwarf_offset, + (uint64_t) variable->id, variable->name.c_str()); } @@ -804,7 +830,7 @@ static std::unique_ptr MC_die_to_variable( variable->name = "@anonymous#" + std::to_string(mc_anonymous_variable_index++); - return std::move(variable); + return variable; } static void MC_dwarf_handle_variable_die(simgrid::mc::ObjectInformation* info, Dwarf_Die * die, @@ -887,7 +913,7 @@ static void MC_dwarf_handle_scope_die(simgrid::mc::ObjectInformation* info, Dwar case simgrid::dwarf::FormClass::Address: if (dwarf_formaddr(&attr, &high_pc) != 0) xbt_die("Could not read address"); - frame.range.begin() = base + high_pc; + frame.range.end() = base + high_pc; break; default: @@ -998,11 +1024,11 @@ void read_dwarf_info(simgrid::mc::ObjectInformation* info, Dwarf* dwarf) Dwarf_Off next_offset = 0; size_t length; - while (dwarf_nextcu(dwarf, offset, &next_offset, &length, nullptr, NULL, NULL) == + while (dwarf_nextcu(dwarf, offset, &next_offset, &length, nullptr, nullptr, nullptr) == 0) { Dwarf_Die unit_die; if (dwarf_offdie(dwarf, offset + length, &unit_die) != nullptr) - MC_dwarf_handle_children(info, &unit_die, &unit_die, nullptr, NULL); + MC_dwarf_handle_children(info, &unit_die, &unit_die, nullptr, nullptr); offset = next_offset; } } @@ -1081,7 +1107,7 @@ std::string to_hex(const char* data, std::size_t count) for (int j = 0; j < 2; ++j) res[2 * i + j] = hex_byte[j]; } - return std::move(res); + return res; } /** Binary data to hexadecimal */ @@ -1113,7 +1139,7 @@ std::string find_by_build_id(std::vector id) + to_hex(id.data() + 1, id.size() - 1) + ".debug"; XBT_DEBUG("Checking debug file: %s", filename.c_str()); if (access(filename.c_str(), F_OK) == 0) - return std::move(filename); + return filename; } return std::string(); } @@ -1324,7 +1350,7 @@ std::shared_ptr createObjectInformation( for (auto& entry : result.get()->subprograms) mc_post_process_scope(result.get(), &entry.second); MC_make_functions_index(result.get()); - return std::move(result); + return result; } /*************************************************************************/