dwarf_expr_context::read_mem (gdb_byte *buf, CORE_ADDR addr,
size_t length)
{
+ if (length == 0)
+ return;
+
+ /* Prefer the passed-in memory, if it exists. */
+ CORE_ADDR offset = addr - this->obj_address;
+
+ if (offset < this->data_view.size ()
+ && offset + length <= this->data_view.size ())
+ {
+ memcpy (buf, this->data_view.data (), length);
+ return;
+ }
+
read_memory (addr, buf, length);
}
case DW_OP_push_object_address:
/* Return the address of the object we are currently observing. */
- result = this->get_object_address ();
- result_val = value_from_ulongest (address_type, result);
+ if (this->data_view.data () == nullptr
+ && this->obj_address == 0)
+ error (_("Location address is not set."));
+
+ result_val = value_from_ulongest (address_type, this->obj_address);
break;
default:
/* Object address used for the evaluation. */
CORE_ADDR obj_address = 0;
- /* Read LENGTH bytes at ADDR into BUF. */
- virtual void read_mem (gdb_byte *buf, CORE_ADDR addr, size_t length);
-
- /* Return the `object address' for DW_OP_push_object_address. */
- virtual CORE_ADDR get_object_address ()
- {
- if (obj_address == 0)
- error (_("Location address is not set."));
- return obj_address;
- }
+ /* The data that was passed in. */
+ gdb::array_view<const gdb_byte> data_view;
private:
void push_dwarf_reg_entry_value (call_site_parameter_kind kind,
call_site_parameter_u kind_u,
int deref_size);
+
+ /* Read LENGTH bytes at ADDR into BUF. This method also handles the
+ case where a caller of the evaluator passes in some data,
+ but with the address being 0. In this situation, we arrange for
+ memory reads to come from the passed-in buffer. */
+ void read_mem (gdb_byte *buf, CORE_ADDR addr, size_t length);
};
/* Return the value of register number REG (a DWARF register number),
per_objfile, NULL, 0);
}
-/* A specialization of dwarf_expr_context that is used by
- dwarf2_locexpr_baton_eval. This subclass exists to handle the case
- where a caller of dwarf2_locexpr_baton_eval passes in some data,
- but with the address being 0. In this situation, we arrange for
- memory reads to come from the passed-in buffer. */
-
-struct evaluate_for_locexpr_baton : public dwarf_expr_context
-{
- evaluate_for_locexpr_baton (dwarf2_per_objfile *per_objfile)
- : dwarf_expr_context (per_objfile)
- {}
-
- /* The data that was passed in. */
- gdb::array_view<const gdb_byte> data_view;
-
- CORE_ADDR get_object_address () override
- {
- if (data_view.data () == nullptr && obj_address == 0)
- error (_("Location address is not set."));
- return obj_address;
- }
-
- void read_mem (gdb_byte *buf, CORE_ADDR addr, size_t len) override
- {
- if (len == 0)
- return;
-
- /* Prefer the passed-in memory, if it exists. */
- CORE_ADDR offset = addr - obj_address;
- if (offset < data_view.size () && offset + len <= data_view.size ())
- {
- memcpy (buf, data_view.data (), len);
- return;
- }
-
- read_memory (addr, buf, len);
- }
-};
-
/* Evaluates a dwarf expression and stores the result in VAL,
expecting that the dwarf expression only produces a single
CORE_ADDR. FRAME is the frame in which the expression is
return 0;
dwarf2_per_objfile *per_objfile = dlbaton->per_objfile;
- evaluate_for_locexpr_baton ctx (per_objfile);
+ dwarf_expr_context ctx (per_objfile);
ctx.frame = frame;
ctx.per_cu = dlbaton->per_cu;
- if (addr_stack == nullptr)
- ctx.obj_address = 0;
- else
+ if (addr_stack != nullptr)
{
ctx.obj_address = addr_stack->addr;
ctx.data_view = addr_stack->valaddr;