#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 <algorithm>
#include <array>
#include <boost/range/algorithm.hpp>
#include <elfutils/libdw.h>
+#include <elfutils/version.h>
#include <boost/algorithm/string/predicate.hpp>
{DW_FORM_data1, FormClass::Constant}, {DW_FORM_data2, FormClass::Constant},
{DW_FORM_data4, FormClass::Constant}, {DW_FORM_data8, FormClass::Constant},
{DW_FORM_udata, FormClass::Constant}, {DW_FORM_sdata, FormClass::Constant},
+#if _ELFUTILS_PREREQ(0, 171)
{DW_FORM_implicit_const, FormClass::Constant},
+#endif
{DW_FORM_string, FormClass::String}, {DW_FORM_strp, FormClass::String},
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;
info->full_types_by_name[t.name] = &t;
}
-static int mc_anonymous_variable_index = 0;
-
static std::unique_ptr<simgrid::mc::Variable> MC_die_to_variable(simgrid::mc::ObjectInformation* info, Dwarf_Die* die,
const Dwarf_Die* /*unit*/,
const simgrid::mc::Frame* frame, const char* ns)
// 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++;
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);
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<ObjectInformation> createObjectInformation(std::vector<xbt::VmMap> const& maps, const char* name)
{
auto result = std::make_shared<ObjectInformation>();
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);