Code cleanup.
	* dwarf2-frame.c (dwarf2_frame_ctx_funcs): New.
	(execute_stack_op): Use dwarf2_frame_ctx_funcs
	* dwarf2expr.c (dwarf_get_base_type): Access get_base_type via funcs.
	(execute_stack_op): Access read_reg, get_frame_base, read_mem,
	get_frame_cfa, get_tls_address and dwarf_call via funcs.
	* dwarf2expr.h (struct dwarf_expr_context): New forward declaration.
	(struct dwarf_expr_context_funcs): New, move here methods from ...
	(struct dwarf_expr_context): ... here.  New fields funcs.
	* dwarf2loc.c (dwarf_expr_dwarf_call): Access get_frame_pc via funcs.
	(dwarf_expr_ctx_funcs): New.
	(dwarf2_evaluate_loc_desc_full): Use dwarf_expr_ctx_funcs.
	(needs_frame_dwarf_call): Access get_frame_pc via funcs.
	(needs_frame_ctx_funcs): New.
	(dwarf2_loc_desc_needs_frame): Use needs_frame_ctx_funcs.
This commit is contained in:
Jan Kratochvil
2011-07-15 20:54:32 +00:00
parent e9ea266294
commit 9e8b7a03dd
5 changed files with 127 additions and 78 deletions

View File

@@ -283,7 +283,7 @@ dwarf_expr_dwarf_call (struct dwarf_expr_context *ctx, size_t die_offset)
struct dwarf_expr_baton *debaton = ctx->baton;
per_cu_dwarf_call (ctx, die_offset, debaton->per_cu,
ctx->get_frame_pc, ctx->baton);
ctx->funcs->get_frame_pc, ctx->baton);
}
/* Callback function for dwarf2_evaluate_loc_desc. */
@@ -1072,6 +1072,20 @@ invalid_synthetic_pointer (void)
"referenced via synthetic pointer"));
}
/* Virtual method table for dwarf2_evaluate_loc_desc_full below. */
static const struct dwarf_expr_context_funcs dwarf_expr_ctx_funcs =
{
dwarf_expr_read_reg,
dwarf_expr_read_mem,
dwarf_expr_frame_base,
dwarf_expr_frame_cfa,
dwarf_expr_frame_pc,
dwarf_expr_tls_address,
dwarf_expr_dwarf_call,
dwarf_expr_get_base_type
};
/* Evaluate a location description, starting at DATA and with length
SIZE, to find the current location of variable of TYPE in the
context of FRAME. BYTE_OFFSET is applied after the contents are
@@ -1107,14 +1121,7 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame,
ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
ctx->offset = dwarf2_per_cu_text_offset (per_cu);
ctx->baton = &baton;
ctx->read_reg = dwarf_expr_read_reg;
ctx->read_mem = dwarf_expr_read_mem;
ctx->get_frame_base = dwarf_expr_frame_base;
ctx->get_frame_cfa = dwarf_expr_frame_cfa;
ctx->get_frame_pc = dwarf_expr_frame_pc;
ctx->get_tls_address = dwarf_expr_tls_address;
ctx->dwarf_call = dwarf_expr_dwarf_call;
ctx->get_base_type = dwarf_expr_get_base_type;
ctx->funcs = &dwarf_expr_ctx_funcs;
TRY_CATCH (ex, RETURN_MASK_ERROR)
{
@@ -1341,9 +1348,23 @@ needs_frame_dwarf_call (struct dwarf_expr_context *ctx, size_t die_offset)
struct needs_frame_baton *nf_baton = ctx->baton;
per_cu_dwarf_call (ctx, die_offset, nf_baton->per_cu,
ctx->get_frame_pc, ctx->baton);
ctx->funcs->get_frame_pc, ctx->baton);
}
/* Virtual method table for dwarf2_loc_desc_needs_frame below. */
static const struct dwarf_expr_context_funcs needs_frame_ctx_funcs =
{
needs_frame_read_reg,
needs_frame_read_mem,
needs_frame_frame_base,
needs_frame_frame_cfa,
needs_frame_frame_cfa, /* get_frame_pc */
needs_frame_tls_address,
needs_frame_dwarf_call,
NULL /* get_base_type */
};
/* Return non-zero iff the location expression at DATA (length SIZE)
requires a frame to evaluate. */
@@ -1368,13 +1389,7 @@ dwarf2_loc_desc_needs_frame (const gdb_byte *data, unsigned short size,
ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
ctx->offset = dwarf2_per_cu_text_offset (per_cu);
ctx->baton = &baton;
ctx->read_reg = needs_frame_read_reg;
ctx->read_mem = needs_frame_read_mem;
ctx->get_frame_base = needs_frame_frame_base;
ctx->get_frame_cfa = needs_frame_frame_cfa;
ctx->get_frame_pc = needs_frame_frame_cfa;
ctx->get_tls_address = needs_frame_tls_address;
ctx->dwarf_call = needs_frame_dwarf_call;
ctx->funcs = &needs_frame_ctx_funcs;
dwarf_expr_eval (ctx, data, size);