Make some dwarf_expr_context methods pure virtual

This patch changes some dwarf_expr_context to be pure virtual, as
mentioned during the discussion of an earlier patch in this series.

2016-10-21  Tom Tromey  <tom@tromey.com>

	* dwarf2expr.h (class dwarf_expr_context)
	<get_frame_base, get_frame_cfa, get_tls_address, dwarf_call,
	push_dwarf_block_entry_value, get_addr_index, get_object_address>:
	Now pure virtual.
	* dwarf2-frame.c (class dwarf_expr_executor)
	<get_frame_base, get_frame_cfa, get_tls_address, dwarf_call,
	push_dwarf_block_entry_value, get_addr_index, get_object_address>:
	New methods.
	<invalid>: New method.
This commit is contained in:
Tom Tromey
2016-10-19 21:38:38 -06:00
parent ce6c454e5a
commit befbff861e
3 changed files with 63 additions and 31 deletions

View File

@ -1,3 +1,15 @@
2016-10-21 Tom Tromey <tom@tromey.com>
* dwarf2expr.h (class dwarf_expr_context)
<get_frame_base, get_frame_cfa, get_tls_address, dwarf_call,
push_dwarf_block_entry_value, get_addr_index, get_object_address>:
Now pure virtual.
* dwarf2-frame.c (class dwarf_expr_executor)
<get_frame_base, get_frame_cfa, get_tls_address, dwarf_call,
push_dwarf_block_entry_value, get_addr_index, get_object_address>:
New methods.
<invalid>: New method.
2016-10-21 Tom Tromey <tom@tromey.com> 2016-10-21 Tom Tromey <tom@tromey.com>
* minsyms.h (minimal_symbol_reader::record_full): "copy_name" now * minsyms.h (minimal_symbol_reader::record_full): "copy_name" now

View File

@ -351,6 +351,50 @@ class dwarf_expr_executor : public dwarf_expr_context
{ {
read_memory (addr, buf, len); read_memory (addr, buf, len);
} }
void get_frame_base (const gdb_byte **start, size_t *length) OVERRIDE
{
invalid ("DW_OP_fbreg");
}
void push_dwarf_reg_entry_value (enum call_site_parameter_kind kind,
union call_site_parameter_u kind_u,
int deref_size) OVERRIDE
{
invalid ("DW_OP_GNU_entry_value");
}
CORE_ADDR get_object_address () OVERRIDE
{
invalid ("DW_OP_push_object_address");
}
CORE_ADDR get_frame_cfa () OVERRIDE
{
invalid ("DW_OP_call_frame_cfa");
}
CORE_ADDR get_tls_address (CORE_ADDR offset) OVERRIDE
{
invalid ("DW_OP_form_tls_address");
}
void dwarf_call (cu_offset die_offset) OVERRIDE
{
invalid ("DW_OP_call*");
}
CORE_ADDR get_addr_index (unsigned int index)
{
invalid ("DW_OP_GNU_addr_index");
}
private:
void invalid (const char *op) ATTRIBUTE_NORETURN
{
error (_("%s is invalid in this context"), op);
}
}; };
static CORE_ADDR static CORE_ADDR

View File

@ -156,16 +156,10 @@ struct dwarf_expr_context
/* Return the location expression for the frame base attribute, in /* Return the location expression for the frame base attribute, in
START and LENGTH. The result must be live until the current START and LENGTH. The result must be live until the current
expression evaluation is complete. */ expression evaluation is complete. */
virtual void get_frame_base (const gdb_byte **start, size_t *length) virtual void get_frame_base (const gdb_byte **start, size_t *length) = 0;
{
error (_("%s is invalid in this context"), "DW_OP_fbreg");
}
/* Return the CFA for the frame. */ /* Return the CFA for the frame. */
virtual CORE_ADDR get_frame_cfa () virtual CORE_ADDR get_frame_cfa () = 0;
{
error (_("%s is invalid in this context"), "DW_OP_call_frame_cfa");
}
/* Return the PC for the frame. */ /* Return the PC for the frame. */
virtual CORE_ADDR get_frame_pc () virtual CORE_ADDR get_frame_pc ()
@ -175,19 +169,13 @@ struct dwarf_expr_context
/* Return the thread-local storage address for /* Return the thread-local storage address for
DW_OP_GNU_push_tls_address or DW_OP_form_tls_address. */ DW_OP_GNU_push_tls_address or DW_OP_form_tls_address. */
virtual CORE_ADDR get_tls_address (CORE_ADDR offset) virtual CORE_ADDR get_tls_address (CORE_ADDR offset) = 0;
{
error (_("%s is invalid in this context"), "DW_OP_form_tls_address");
}
/* Execute DW_AT_location expression for the DWARF expression /* Execute DW_AT_location expression for the DWARF expression
subroutine in the DIE at DIE_OFFSET in the CU. Do not touch 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 STACK while it being passed to and returned from the called DWARF
subroutine. */ subroutine. */
virtual void dwarf_call (cu_offset die_offset) virtual void dwarf_call (cu_offset die_offset) = 0;
{
error (_("%s is invalid in this context"), "DW_OP_call*");
}
/* Return the base type given by the indicated DIE. This can throw /* 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 an exception if the DIE is invalid or does not represent a base
@ -206,26 +194,14 @@ struct dwarf_expr_context
DW_AT_GNU_call_site_value. */ DW_AT_GNU_call_site_value. */
virtual void push_dwarf_reg_entry_value (enum call_site_parameter_kind kind, virtual void push_dwarf_reg_entry_value (enum call_site_parameter_kind kind,
union call_site_parameter_u kind_u, union call_site_parameter_u kind_u,
int deref_size) int deref_size) = 0;
{
internal_error (__FILE__, __LINE__,
_("Support for DW_OP_GNU_entry_value is unimplemented"));
}
/* Return the address indexed by DW_OP_GNU_addr_index. /* Return the address indexed by DW_OP_GNU_addr_index.
This can throw an exception if the index is out of range. */ This can throw an exception if the index is out of range. */
virtual CORE_ADDR get_addr_index (unsigned int index) virtual CORE_ADDR get_addr_index (unsigned int index) = 0;
{
error (_("%s is invalid in this context"), "DW_OP_GNU_addr_index");
}
/* Return the `object address' for DW_OP_push_object_address. */ /* Return the `object address' for DW_OP_push_object_address. */
virtual CORE_ADDR get_object_address () virtual CORE_ADDR get_object_address () = 0;
{
internal_error (__FILE__, __LINE__,
_("Support for DW_OP_push_object_address "
"is unimplemented"));
}
private: private: