/* DWARF 2 Expression Evaluator.
- Copyright (C) 2001-2017 Free Software Foundation, Inc.
+ Copyright (C) 2001-2020 Free Software Foundation, Inc.
Contributed by Daniel Berlin <dan@dberlin.org>.
struct dwarf_stack_value
{
+ dwarf_stack_value (struct value *value_, int in_stack_memory_)
+ : value (value_), in_stack_memory (in_stack_memory_)
+ {}
+
struct value *value;
/* True if the piece is in memory and is known to be on the program's stack.
struct dwarf_expr_context
{
dwarf_expr_context ();
- virtual ~dwarf_expr_context ();
+ virtual ~dwarf_expr_context () = default;
void push_address (CORE_ADDR value, bool in_stack_memory);
void eval (const gdb_byte *addr, size_t len);
CORE_ADDR fetch_address (int n);
bool fetch_in_stack_memory (int n);
- /* The stack of values, allocated with xmalloc. */
- struct dwarf_stack_value *stack;
-
- /* The number of values currently pushed on the stack, and the
- number of elements allocated to the stack. */
- int stack_len, stack_allocated;
+ /* The stack of values. */
+ std::vector<dwarf_stack_value> stack;
/* Target architecture to use for address operations. */
struct gdbarch *gdbarch;
context and operations depending on DW_FORM_ref_addr are not allowed. */
int ref_addr_size;
- /* Offset used to relocate DW_OP_addr and DW_OP_GNU_addr_index arguments. */
+ /* Offset used to relocate DW_OP_addr, DW_OP_addrx, and
+ DW_OP_GNU_addr_index arguments. */
CORE_ADDR offset;
/* The current depth of dwarf expression recursion, via DW_OP_call*,
subroutine. */
virtual void dwarf_call (cu_offset die_cu_off) = 0;
+ /* Execute "variable value" operation on the DIE at SECT_OFF. */
+ virtual struct value *dwarf_variable_value (sect_offset sect_off) = 0;
+
/* Return the base type given by the indicated DIE at DIE_CU_OFF.
This can throw an exception if the DIE is invalid or does not
represent a base type. SIZE is non-zero if this function should
union call_site_parameter_u kind_u,
int deref_size) = 0;
- /* Return the address indexed by DW_OP_GNU_addr_index.
+ /* Return the address indexed by DW_OP_addrx or DW_OP_GNU_addr_index.
This can throw an exception if the index is out of range. */
virtual CORE_ADDR get_addr_index (unsigned int index) = 0;
private:
struct type *address_type () const;
- void grow_stack (size_t need);
void push (struct value *value, bool in_stack_memory);
bool stack_empty_p () const;
void add_piece (ULONGEST size, ULONGEST offset);