X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/eee53ac79bc015ef6ca6ee17ab02e3b96d13ede5..6c686f5c734739033f848b8009c9b825b7aa9c1d:/src/mc/mc_dwarf_expression.cpp diff --git a/src/mc/mc_dwarf_expression.cpp b/src/mc/mc_dwarf_expression.cpp index 5f9e1622cf..7bf23355d3 100644 --- a/src/mc/mc_dwarf_expression.cpp +++ b/src/mc/mc_dwarf_expression.cpp @@ -10,7 +10,7 @@ #include #include -#include "mc_dwarf.hpp" +#include "mc_object_info.h" #include "mc_private.h" #include "mc_location.h" #include "mc/AddressSpace.hpp" @@ -101,12 +101,12 @@ static int mc_dwarf_register_to_libunwind(int dwarf_register) #endif } -int mc_dwarf_execute_expression(size_t n, const simgrid::mc::DwarfInstruction* ops, +int mc_dwarf_execute_expression(size_t n, const Dwarf_Op * ops, mc_expression_state_t state) { for (size_t i = 0; i != n; ++i) { int error = 0; - const simgrid::mc::DwarfInstruction *op = ops + i; + const Dwarf_Op *op = ops + i; uint8_t atom = op->atom; switch (atom) { @@ -540,4 +540,36 @@ void *mc_find_frame_base(simgrid::mc::Frame* frame, simgrid::mc::ObjectInformati } } +void mc_dwarf_location_list_init( + simgrid::mc::LocationList* list, simgrid::mc::ObjectInformation* info, + Dwarf_Die * die, Dwarf_Attribute * attr) +{ + list->clear(); + + ptrdiff_t offset = 0; + Dwarf_Addr base, start, end; + Dwarf_Op *ops; + size_t len; + + while (1) { + + offset = dwarf_getlocations(attr, offset, &base, &start, &end, &ops, &len); + if (offset == 0) + return; + else if (offset == -1) + xbt_die("Error while loading location list"); + + simgrid::mc::LocationListEntry entry; + entry.expression = simgrid::mc::DwarfExpression(ops, ops + len); + + void *base = info->base_address(); + // If start == 0, this is not a location list: + entry.lowpc = start == 0 ? NULL : (char *) base + start; + entry.highpc = start == 0 ? NULL : (char *) base + end; + + list->push_back(std::move(entry)); + } + +} + }