+ a single piece, so that callers need not distinguish between the
+ no-DW_OP_piece and one-DW_OP_piece cases. But expressions with
+ no DW_OP_piece operations have no value to place in a piece's
+ 'size' field; the size comes from the surrounding data. So the
+ two cases need to be handled separately.) */
+ std::vector<dwarf_expr_piece> pieces;
+
+ /* Return the value of register number REGNUM (a DWARF register number),
+ read as an address. */
+ virtual CORE_ADDR read_addr_from_reg (int regnum) = 0;
+
+ /* Return a value of type TYPE, stored in register number REGNUM
+ of the frame associated to the given BATON.
+
+ REGNUM is a DWARF register number. */
+ virtual struct value *get_reg_value (struct type *type, int regnum) = 0;
+
+ /* Read LENGTH bytes at ADDR into BUF. */
+ virtual void read_mem (gdb_byte *buf, CORE_ADDR addr, size_t length) = 0;
+
+ /* Return the location expression for the frame base attribute, in
+ START and LENGTH. The result must be live until the current
+ expression evaluation is complete. */
+ virtual void get_frame_base (const gdb_byte **start, size_t *length) = 0;
+
+ /* Return the CFA for the frame. */
+ virtual CORE_ADDR get_frame_cfa () = 0;
+
+ /* Return the PC for the frame. */
+ virtual CORE_ADDR get_frame_pc ()
+ {
+ error (_("%s is invalid in this context"), "DW_OP_implicit_pointer");
+ }
+
+ /* Return the thread-local storage address for
+ DW_OP_GNU_push_tls_address or DW_OP_form_tls_address. */
+ virtual CORE_ADDR get_tls_address (CORE_ADDR offset) = 0;
+
+ /* Execute DW_AT_location expression for the DWARF expression
+ subroutine in the DIE at DIE_CU_OFF in the CU. Do not touch
+ STACK while it being passed to and returned from the called DWARF
+ 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
+ verify that the resulting type has the correct size. */
+ virtual struct type *get_base_type (cu_offset die_cu_off, int size)
+ {
+ /* Anything will do. */
+ return builtin_type (this->gdbarch)->builtin_int;
+ }
+
+ /* Push on DWARF stack an entry evaluated for DW_TAG_call_site's
+ parameter matching KIND and KIND_U at the caller of specified BATON.
+ If DEREF_SIZE is not -1 then use DW_AT_call_data_value instead of
+ DW_AT_call_value. */
+ virtual void push_dwarf_reg_entry_value (enum call_site_parameter_kind kind,
+ union call_site_parameter_u kind_u,
+ int deref_size) = 0;
+
+ /* 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;
+
+ /* Return the `object address' for DW_OP_push_object_address. */
+ virtual CORE_ADDR get_object_address () = 0;
+
+private:
+
+ struct type *address_type () const;
+ void push (struct value *value, bool in_stack_memory);
+ bool stack_empty_p () const;
+ void add_piece (ULONGEST size, ULONGEST offset);
+ void execute_stack_op (const gdb_byte *op_ptr, const gdb_byte *op_end);
+ void pop ();