aboutsummaryrefslogtreecommitdiff
path: root/gdb/dwarf2expr.h
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2016-09-26 08:59:13 -0600
committerTom Tromey <tom@tromey.com>2016-10-21 14:17:38 -0600
commit192ca6d8eac4a5538036ef200b95d6ef3dbe9511 (patch)
treee08b28a382817a8a1d639d7775dfa9442452eb46 /gdb/dwarf2expr.h
parent595d2e303c0ef1a5cd5af8868c1d41db0050eb29 (diff)
downloadgdb-192ca6d8eac4a5538036ef200b95d6ef3dbe9511.zip
gdb-192ca6d8eac4a5538036ef200b95d6ef3dbe9511.tar.gz
gdb-192ca6d8eac4a5538036ef200b95d6ef3dbe9511.tar.bz2
Convert dwarf_expr_context_funcs to methods
This patch converts the function pointers in dwarf_expr_context_funcs into methods on dwarf_expr_context, and then updates the various implementations and callers to follow. NB this patch uses "override" (which caught a couple of renaming bugs during development) -- but this is C++11, so this patch at least has to wait for Pedro's patch that adds the OVERRIDE macro. After this patch it would be possible to do one more, that makes various members of dwarf_expr_context "protected"; but I haven't done this. 2016-10-21 Tom Tromey <tom@tromey.com> * dwarf2loc.c (struct dwarf_expr_context_funcs): Don't declare. (dwarf_expr_read_addr_from_reg, dwarf_expr_get_reg_value) (dwarf_expr_read_mem, dwarf_expr_frame_base): Rename; turn into methods. (get_frame_pc_for_per_cu_dwarf_call): New function. (dwarf_expr_frame_cfa, dwarf_expr_frame_pc) (dwarf_expr_tls_address): Rename; turn into methods. (per_cu_dwarf_call): Remove arguments. Use get_frame_pc_for_per_cu_dwarf_call. (dwarf_evaluate_loc_desc): New class. (dwarf_expr_dwarf_call, dwarf_expr_context) (dwarf_expr_push_dwarf_reg_entry_value) (dwarf_expr_get_addr_index, dwarf_expr_get_obj_addr): Rename; turn into methods. (dwarf_expr_ctx_funcs): Remove. (dwarf2_evaluate_loc_desc_full): Update. (dwarf2_locexpr_baton_eval): Update. (symbol_needs_eval_context): New class. (symbol_needs_read_addr_from_reg, symbol_needs_get_reg_value) (symbol_needs_read_mem, symbol_needs_frame_base) (symbol_needs_frame_cfa, symbol_needs_tls_address) (symbol_needs_dwarf_call, needs_dwarf_reg_entry_value): Rename; turn into methods. (needs_get_addr_index, needs_get_obj_addr): Remove; turn into methods. (symbol_needs_ctx_funcs): Remove. (dwarf2_loc_desc_get_symbol_read_needs): Update. * dwarf2expr.h (struct dwarf_expr_context_funcs): Remove; turn contents into methods. (struct dwarf_expr_context) <baton, funcs>: Remove. <read_addr_from_reg, get_reg_value, read_mem, get_frame_base, get_frame_cfa, get_frame_pc, get_tls_address, dwarf_call, impl_get_base_type, push_dwarf_block_entry_value, get_addr_index, get_object_address>: Declare new methods. (ctx_no_get_frame_base, ctx_no_get_frame_cfa) (ctx_no_get_frame_pc, ctx_no_get_tls_address, ctx_no_dwarf_call) (ctx_no_get_base_type, ctx_no_push_dwarf_reg_entry_value) (ctx_no_get_addr_index): Don't declare. * dwarf2expr.c (get_base_type): Use impl_get_base_type. (execute_stack_op): Update. (ctx_no_get_frame_base, ctx_no_get_frame_cfa) (ctx_no_get_frame_pc, ctx_no_get_tls_address, ctx_no_dwarf_call) (ctx_no_get_base_type, ctx_no_push_dwarf_reg_entry_value) (ctx_no_get_addr_index): Remove; now methods on dwarf_expr_context. * dwarf2-frame.c (read_addr_from_reg): Take a frame_info, not a baton. (class dwarf_expr_executor): New class. (get_reg_value, read_mem): Rename, turn into methods. (execute_stack_op): Use dwarf_expr_executor.
Diffstat (limited to 'gdb/dwarf2expr.h')
-rw-r--r--gdb/dwarf2expr.h173
1 files changed, 87 insertions, 86 deletions
diff --git a/gdb/dwarf2expr.h b/gdb/dwarf2expr.h
index 4706bb3..63bdc6e 100644
--- a/gdb/dwarf2expr.h
+++ b/gdb/dwarf2expr.h
@@ -25,69 +25,6 @@
#include "leb128.h"
#include "gdbtypes.h"
-struct dwarf_expr_context;
-
-/* Virtual method table for struct dwarf_expr_context below. */
-
-struct dwarf_expr_context_funcs
-{
- /* Return the value of register number REGNUM (a DWARF register number),
- read as an address. */
- CORE_ADDR (*read_addr_from_reg) (void *baton, int regnum);
-
- /* 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. */
- struct value *(*get_reg_value) (void *baton, struct type *type, int regnum);
-
- /* Read LENGTH bytes at ADDR into BUF. */
- void (*read_mem) (void *baton, gdb_byte *buf, CORE_ADDR addr, size_t length);
-
- /* 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. */
- void (*get_frame_base) (void *baton, const gdb_byte **start, size_t *length);
-
- /* Return the CFA for the frame. */
- CORE_ADDR (*get_frame_cfa) (void *baton);
-
- /* Return the PC for the frame. */
- CORE_ADDR (*get_frame_pc) (void *baton);
-
- /* Return the thread-local storage address for
- DW_OP_GNU_push_tls_address or DW_OP_form_tls_address. */
- CORE_ADDR (*get_tls_address) (void *baton, CORE_ADDR offset);
-
- /* Execute DW_AT_location expression for the DWARF expression subroutine in
- the DIE at DIE_OFFSET in the CU from CTX. Do not touch STACK while it
- being passed to and returned from the called DWARF subroutine. */
- void (*dwarf_call) (struct dwarf_expr_context *ctx, cu_offset die_offset);
-
- /* 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. */
- struct type *(*get_base_type) (struct dwarf_expr_context *ctx, cu_offset die);
-
- /* Push on DWARF stack an entry evaluated for DW_TAG_GNU_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_GNU_call_site_data_value instead of
- DW_AT_GNU_call_site_value. */
- void (*push_dwarf_reg_entry_value) (struct dwarf_expr_context *ctx,
- enum call_site_parameter_kind kind,
- union call_site_parameter_u kind_u,
- int deref_size);
-
- /* Return the address indexed by DW_OP_GNU_addr_index.
- This can throw an exception if the index is out of range. */
- CORE_ADDR (*get_addr_index) (void *baton, unsigned int index);
-
- /* Return the `object address' for DW_OP_push_object_address. */
- CORE_ADDR (*get_object_address) (void *baton);
-};
-
/* The location of a value. */
enum dwarf_value_location
{
@@ -159,13 +96,6 @@ struct dwarf_expr_context
/* Offset used to relocate DW_OP_addr and DW_OP_GNU_addr_index arguments. */
CORE_ADDR offset;
- /* An opaque argument provided by the caller, which will be passed
- to all of the callback functions. */
- void *baton;
-
- /* Callback functions. */
- const struct dwarf_expr_context_funcs *funcs;
-
/* The current depth of dwarf expression recursion, via DW_OP_call*,
DW_OP_fbreg, DW_OP_push_object_address, etc., and the maximum
depth we'll tolerate before raising an error. */
@@ -210,6 +140,93 @@ struct dwarf_expr_context
int num_pieces;
struct 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)
+ {
+ error (_("%s is invalid in this context"), "DW_OP_fbreg");
+ }
+
+ /* Return the CFA for the frame. */
+ virtual CORE_ADDR get_frame_cfa ()
+ {
+ error (_("%s is invalid in this context"), "DW_OP_call_frame_cfa");
+ }
+
+ /* Return the PC for the frame. */
+ virtual CORE_ADDR get_frame_pc ()
+ {
+ error (_("%s is invalid in this context"), "DW_OP_GNU_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)
+ {
+ error (_("%s is invalid in this context"), "DW_OP_form_tls_address");
+ }
+
+ /* 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*");
+ }
+
+ /* 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)
+ {
+ /* Anything will do. */
+ return builtin_type (this->gdbarch)->builtin_int;
+ }
+
+ /* Push on DWARF stack an entry evaluated for DW_TAG_GNU_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_GNU_call_site_data_value instead of
+ 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"));
+ }
+
+ /* 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");
+ }
+
+ /* 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"));
+ }
+
private:
struct type *address_type () const;
@@ -273,22 +290,6 @@ struct dwarf_expr_piece
void dwarf_expr_require_composition (const gdb_byte *, const gdb_byte *,
const char *);
-/* Stub dwarf_expr_context_funcs implementations. */
-
-void ctx_no_get_frame_base (void *baton, const gdb_byte **start,
- size_t *length);
-CORE_ADDR ctx_no_get_frame_cfa (void *baton);
-CORE_ADDR ctx_no_get_frame_pc (void *baton);
-CORE_ADDR ctx_no_get_tls_address (void *baton, CORE_ADDR offset);
-void ctx_no_dwarf_call (struct dwarf_expr_context *ctx, cu_offset die_offset);
-struct type *ctx_no_get_base_type (struct dwarf_expr_context *ctx,
- cu_offset die);
-void ctx_no_push_dwarf_reg_entry_value (struct dwarf_expr_context *ctx,
- enum call_site_parameter_kind kind,
- union call_site_parameter_u kind_u,
- int deref_size);
-CORE_ADDR ctx_no_get_addr_index (void *baton, unsigned int index);
-
int dwarf_block_to_dwarf_reg (const gdb_byte *buf, const gdb_byte *buf_end);
int dwarf_block_to_dwarf_reg_deref (const gdb_byte *buf,