X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/cf75523de37862d1f4eddaa1cbdd276f20755fea..a49a03122b2def71ff741e78d15b38cd1d171184:/src/mc/mc_dwarf.cpp diff --git a/src/mc/mc_dwarf.cpp b/src/mc/mc_dwarf.cpp index 3d086788f7..8be805343d 100644 --- a/src/mc/mc_dwarf.cpp +++ b/src/mc/mc_dwarf.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2015. The SimGrid Team. +/* Copyright (c) 2008-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -20,17 +20,17 @@ #include -#include #include "src/simgrid/util.hpp" -#include -#include +#include "xbt/log.h" +#include "xbt/sysdep.h" +#include #include "src/mc/mc_private.h" #include "src/mc/mc_dwarf.hpp" -#include "src/mc/Process.hpp" #include "src/mc/ObjectInformation.hpp" #include "src/mc/Variable.hpp" +#include "src/mc/remote/RemoteClient.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_dwarf, mc, "DWARF processing"); @@ -53,8 +53,7 @@ static uint64_t MC_dwarf_default_lower_bound(int lang); * \param die DIE for the DW_TAG_enumeration_type or DW_TAG_subrange_type * \param unit DIE of the DW_TAG_compile_unit */ -static uint64_t MC_dwarf_subrange_element_count(Dwarf_Die * die, - Dwarf_Die * unit); +static uint64_t MC_dwarf_subrange_element_count(Dwarf_Die* die, Dwarf_Die* unit); /** \brief Computes the number of elements of a given DW_TAG_array_type. * @@ -261,7 +260,7 @@ static const char *MC_dwarf_attr_integrate_string(Dwarf_Die * die, int attribute) { Dwarf_Attribute attr; - if (!dwarf_attr_integrate(die, attribute, &attr)) + if (not dwarf_attr_integrate(die, attribute, &attr)) return nullptr; else return dwarf_formstring(&attr); @@ -280,7 +279,7 @@ static const char *MC_dwarf_attr_integrate_string(Dwarf_Die * die, static const char *MC_dwarf_at_linkage_name(Dwarf_Die * die) { const char *name = MC_dwarf_attr_integrate_string(die, DW_AT_linkage_name); - if (!name) + if (not name) name = MC_dwarf_attr_integrate_string(die, DW_AT_MIPS_linkage_name); return name; } @@ -358,13 +357,13 @@ static bool MC_dwarf_attr_flag(Dwarf_Die * die, int attribute, bool integrate) return result; } -/** \brief Find the default lower bound for a given language +/** @brief Find the default lower bound for a given language * * The default lower bound of an array (when DW_TAG_lower_bound * is missing) depends on the language of the compilation unit. * - * \param lang Language of the compilation unit (values defined in the DWARF spec) - * \return Default lower bound of an array in this compilation unit + * @param lang Language of the compilation unit (values defined in the DWARF spec) + * @return Default lower bound of an array in this compilation unit * */ static uint64_t MC_dwarf_default_lower_bound(int lang) { @@ -417,7 +416,7 @@ static uint64_t MC_dwarf_subrange_element_count(Dwarf_Die * die, return MC_dwarf_attr_integrate_uint(die, DW_AT_count, 0); // Otherwise compute DW_TAG_upper_bound-DW_TAG_lower_bound + 1: - if (!dwarf_hasattr_integrate(die, DW_AT_upper_bound)) + if (not dwarf_hasattr_integrate(die, DW_AT_upper_bound)) // This is not really 0, but the code expects this (we do not know): return 0; @@ -493,7 +492,7 @@ static void MC_dwarf_fill_member_location( if (dwarf_hasattr(child, DW_AT_data_bit_offset)) xbt_die("Can't groke DW_AT_data_bit_offset."); - if (!dwarf_hasattr_integrate(child, DW_AT_data_member_location)) { + if (not dwarf_hasattr_integrate(child, DW_AT_data_member_location)) { if (type->type == DW_TAG_union_type) return; xbt_die @@ -525,7 +524,7 @@ static void MC_dwarf_fill_member_location( // Offset from the base address of the object: { Dwarf_Word offset; - if (!dwarf_formudata(&attr, &offset)) + if (not dwarf_formudata(&attr, &offset)) member->offset(offset); else xbt_die("Cannot get %s location <%" PRIx64 ">%s", @@ -540,8 +539,7 @@ static void MC_dwarf_fill_member_location( // It's supposed to be possible in DWARF2 but I couldn't find its semantic // in the spec. default: - xbt_die("Can't handle form class (%i) / form 0x%x as DW_AT_member_location", - (int) form_class, form); + xbt_die("Can't handle form class (%d) / form 0x%x as DW_AT_member_location", (int)form_class, (unsigned)form); } } @@ -612,7 +610,7 @@ static void MC_dwarf_add_members(simgrid::mc::ObjectInformation* info, Dwarf_Die MC_dwarf_fill_member_location(type, &member, &child); - if (!member.type_id) + if (not member.type_id) xbt_die("Missing type for member %s of <%" PRIx64 ">%s", member.name.c_str(), (uint64_t) type->id, type->name.c_str()); @@ -715,7 +713,7 @@ static void MC_dwarf_handle_type_die(simgrid::mc::ObjectInformation* info, Dwarf { simgrid::mc::Type type = MC_dwarf_die_to_type(info, die, unit, frame, ns); auto& t = (info->types[type.id] = std::move(type)); - if (!t.name.empty() && type.byte_size != 0) + if (not t.name.empty() && type.byte_size != 0) info->full_types_by_name[t.name] = &t; } @@ -791,11 +789,8 @@ static std::unique_ptr MC_die_to_variable( break; default: - 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->id, - variable->name.c_str()); + xbt_die("Unexpected form 0x%x (%i), class 0x%x (%i) list for location in <%" PRIx64 ">%s", (unsigned)form, form, + (unsigned)form_class, (int)form_class, (uint64_t)variable->id, variable->name.c_str()); } // Handle start_scope: @@ -815,9 +810,8 @@ static std::unique_ptr MC_die_to_variable( case simgrid::dwarf::FormClass::RangeListPtr: // TODO default: - xbt_die - ("Unhandled form 0x%x, class 0x%X for DW_AT_start_scope of variable %s", - form, (int) form_class, name == nullptr ? "?" : name); + xbt_die("Unhandled form 0x%x, class 0x%X for DW_AT_start_scope of variable %s", (unsigned)form, + (unsigned)form_class, name == nullptr ? "?" : name); } } @@ -840,7 +834,7 @@ static void MC_dwarf_handle_variable_die(simgrid::mc::ObjectInformation* info, D { std::unique_ptr variable = MC_die_to_variable(info, die, unit, frame, ns); - if (!variable) + if (not variable) return; // Those arrays are sorted later: else if (variable->global) @@ -874,7 +868,7 @@ static void MC_dwarf_handle_scope_die(simgrid::mc::ObjectInformation* info, Dwar if (klass == simgrid::dwarf::TagClass::Subprogram) { const char *name = MC_dwarf_attr_integrate_string(die, DW_AT_name); - if (ns) + if (name && ns) frame.name = std::string(ns) + "::" + name; else if (name) frame.name = name; @@ -894,7 +888,7 @@ static void MC_dwarf_handle_scope_die(simgrid::mc::ObjectInformation* info, Dwar if (low_pc) { // DW_AT_high_pc: Dwarf_Attribute attr; - if (!dwarf_attr_integrate(die, DW_AT_high_pc, &attr)) + if (not dwarf_attr_integrate(die, DW_AT_high_pc, &attr)) xbt_die("Missing DW_AT_high_pc matching with DW_AT_low_pc"); Dwarf_Sword offset; @@ -1044,6 +1038,7 @@ void read_dwarf_info(simgrid::mc::ObjectInformation* info, Dwarf* dwarf) static std::vector get_build_id(Elf* elf) { +#ifdef __linux // Summary: the GNU build ID is stored in a ("GNU, NT_GNU_BUILD_ID) note // found in a PT_NOTE entry in the program header table. @@ -1081,6 +1076,7 @@ std::vector get_build_id(Elf* elf) } } +#endif return std::vector(); } @@ -1138,7 +1134,7 @@ std::string find_by_build_id(std::vector id) { std::string filename; std::string hex = to_hex(id); - for (const char* debug_path : debug_paths) { + for (const char* const& debug_path : debug_paths) { // Example: filename = std::string(debug_path) + ".build-id/" + to_hex(id.data(), 1) + '/' @@ -1201,7 +1197,7 @@ void MC_load_dwarf(simgrid::mc::ObjectInformation* info) // Try with NT_GNU_BUILD_ID: we find the build ID in the ELF file and then // use this ID to find the file in some known locations in the filesystem. std::vector build_id = get_build_id(elf); - if (!build_id.empty()) { + if (not build_id.empty()) { elf_end(elf); close(fd); @@ -1281,7 +1277,7 @@ static void MC_post_process_variables(simgrid::mc::ObjectInformation* info) // Someone needs this to be sorted but who? boost::range::sort(info->global_variables, MC_compare_variable); - for(simgrid::mc::Variable& variable : info->global_variables) + for (simgrid::mc::Variable& variable : info->global_variables) if (variable.type_id) variable.type = simgrid::util::find_map_ptr( info->types, variable.type_id); @@ -1307,15 +1303,14 @@ static void mc_post_process_scope(simgrid::mc::ObjectInformation* info, simgrid: // Recursive post-processing of nested-scopes: for (simgrid::mc::Frame& nested_scope : scope->scopes) - mc_post_process_scope(info, &nested_scope); - + mc_post_process_scope(info, &nested_scope); } static simgrid::mc::Type* MC_resolve_type( simgrid::mc::ObjectInformation* info, unsigned type_id) { - if (!type_id) + if (not type_id) return nullptr; simgrid::mc::Type* type = simgrid::util::find_map_ptr(info->types, type_id); if (type == nullptr) @@ -1341,7 +1336,7 @@ simgrid::mc::Type* MC_resolve_type( static void MC_post_process_types(simgrid::mc::ObjectInformation* info) { // Lookup "subtype" field: - for(auto& i : info->types) { + for (auto& i : info->types) { i.second.subtype = MC_resolve_type(info, i.second.type_id); for (simgrid::mc::Member& member : i.second.members) member.type = MC_resolve_type(info, member.type_id); @@ -1370,7 +1365,7 @@ std::shared_ptr createObjectInformation( /*************************************************************************/ -void postProcessObjectInformation(simgrid::mc::Process* process, simgrid::mc::ObjectInformation* info) +void postProcessObjectInformation(simgrid::mc::RemoteClient* process, simgrid::mc::ObjectInformation* info) { for (auto& i : info->types) { @@ -1385,11 +1380,10 @@ void postProcessObjectInformation(simgrid::mc::Process* process, simgrid::mc::Ob break; // Resolve full_type: - if (!subtype->name.empty() && subtype->byte_size == 0) + if (not subtype->name.empty() && subtype->byte_size == 0) for (auto const& object_info : process->object_infos) { auto i = object_info->full_types_by_name.find(subtype->name); - if (i != object_info->full_types_by_name.end() - && !i->second->name.empty() && i->second->byte_size) { + if (i != object_info->full_types_by_name.end() && not i->second->name.empty() && i->second->byte_size) { type->full_type = i->second; break; }