示例#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());
}
示例#2
0
文件: Type.hpp 项目: adegomme/simgrid
 /** Whether the member is at a fixed offset from the base address */
 bool has_offset_location() const
 {
   // Recognize the expression `DW_OP_plus_uconst(offset)`:
   return location_expression.size() == 1 &&
     location_expression[0].atom == DW_OP_plus_uconst;
 }
示例#3
0
inline
void execute(simgrid::dwarf::DwarfExpression const& expression,
  ExpressionContext const& context, ExpressionStack& stack)
{
  execute(expression.data(), expression.size(), context, stack);
}