struct dwarf_expr_context
{
dwarf_expr_context ();
- ~dwarf_expr_context ();
+ virtual ~dwarf_expr_context ();
void push_address (CORE_ADDR value, int in_stack_memory);
void eval (const gdb_byte *addr, size_t len);
/* 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)
- {
- error (_("%s is invalid in this context"), "DW_OP_fbreg");
- }
+ 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 ()
- {
- error (_("%s is invalid in this context"), "DW_OP_call_frame_cfa");
- }
+ virtual CORE_ADDR get_frame_cfa () = 0;
/* Return the PC for the frame. */
virtual CORE_ADDR get_frame_pc ()
/* 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)
- {
- error (_("%s is invalid in this context"), "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_OFFSET 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_offset)
- {
- error (_("%s is invalid in this context"), "DW_OP_call*");
- }
+ virtual void dwarf_call (cu_offset die_offset) = 0;
/* Return the base type given by the indicated DIE. This can throw
an exception if the DIE is invalid or does not represent a base
- type. If can also be NULL in the special case where the
- callbacks are not performing evaluation, and thus it is
- meaningful to substitute a stub type of the correct size. */
- virtual struct type *impl_get_base_type (cu_offset die)
+ 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, int size)
{
/* Anything will do. */
return builtin_type (this->gdbarch)->builtin_int;
DW_AT_GNU_call_site_value. */
virtual void push_dwarf_reg_entry_value (enum call_site_parameter_kind kind,
union call_site_parameter_u kind_u,
- int deref_size)
- {
- internal_error (__FILE__, __LINE__,
- _("Support for DW_OP_GNU_entry_value is unimplemented"));
- }
+ int deref_size) = 0;
/* Return the address indexed by 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)
- {
- error (_("%s is invalid in this context"), "DW_OP_GNU_addr_index");
- }
+ 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 ()
- {
- internal_error (__FILE__, __LINE__,
- _("Support for DW_OP_push_object_address "
- "is unimplemented"));
- }
+ virtual CORE_ADDR get_object_address () = 0;
private:
void push (struct value *value, int in_stack_memory);
int stack_empty_p () const;
void add_piece (ULONGEST size, ULONGEST offset);
- struct type *get_base_type (cu_offset die, int size);
void execute_stack_op (const gdb_byte *op_ptr, const gdb_byte *op_end);
void pop ();
};