Exemplo n.º 1
0
/** Resolve a location expression */
Location resolve(
                      simgrid::dwarf::DwarfExpression const& expression,
                      simgrid::mc::ObjectInformation* object_info,
                      unw_cursor_t * c,
                      void *frame_pointer_address,
                      simgrid::mc::AddressSpace* address_space, int process_index)
{
  simgrid::dwarf::ExpressionContext context;
  context.frame_base = frame_pointer_address;
  context.cursor = c;
  context.address_space = address_space;
  context.object_info = object_info;
  context.process_index = process_index;

  if (!expression.empty()
      && expression[0].atom >= DW_OP_reg0
      && expression[0].atom <= DW_OP_reg31) {
    int dwarf_register = expression[0].atom - DW_OP_reg0;
    xbt_assert(c,
      "Missing frame context for register operation DW_OP_reg%i",
      dwarf_register);
    return Location(dwarf_register_to_libunwind(dwarf_register));
  }

  simgrid::dwarf::ExpressionStack stack;
  simgrid::dwarf::execute(expression, context, stack);
  return Location((void*) stack.top());
}