* dwarf2loc.c (dwarf2_evaluate_loc_desc): Make a cleanup.
(dwarf2_loc_desc_needs_frame): Likewise. * dwarf2expr.h (make_cleanup_free_dwarf_expr_context): Declare. * dwarf2expr.c (free_dwarf_expr_context_cleanup): New function. (make_cleanup_free_dwarf_expr_context): Likewise. * dwarf2-frame.c (execute_stack_op): Make a cleanup.
This commit is contained in:
parent
0d8f9b2ced
commit
4a22739830
5 changed files with 39 additions and 3 deletions
|
@ -1,3 +1,12 @@
|
|||
2009-08-11 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* dwarf2loc.c (dwarf2_evaluate_loc_desc): Make a cleanup.
|
||||
(dwarf2_loc_desc_needs_frame): Likewise.
|
||||
* dwarf2expr.h (make_cleanup_free_dwarf_expr_context): Declare.
|
||||
* dwarf2expr.c (free_dwarf_expr_context_cleanup): New function.
|
||||
(make_cleanup_free_dwarf_expr_context): Likewise.
|
||||
* dwarf2-frame.c (execute_stack_op): Make a cleanup.
|
||||
|
||||
2009-08-10 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* objfiles.c (gdb_bfd_unref): Use the bfd_usrdata accessor.
|
||||
|
|
|
@ -352,8 +352,11 @@ execute_stack_op (gdb_byte *exp, ULONGEST len, int addr_size,
|
|||
{
|
||||
struct dwarf_expr_context *ctx;
|
||||
CORE_ADDR result;
|
||||
struct cleanup *old_chain;
|
||||
|
||||
ctx = new_dwarf_expr_context ();
|
||||
old_chain = make_cleanup_free_dwarf_expr_context (ctx);
|
||||
|
||||
ctx->gdbarch = get_frame_arch (this_frame);
|
||||
ctx->addr_size = addr_size;
|
||||
ctx->baton = this_frame;
|
||||
|
@ -369,7 +372,7 @@ execute_stack_op (gdb_byte *exp, ULONGEST len, int addr_size,
|
|||
if (ctx->in_reg)
|
||||
result = read_reg (this_frame, result);
|
||||
|
||||
free_dwarf_expr_context (ctx);
|
||||
do_cleanups (old_chain);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -61,6 +61,22 @@ free_dwarf_expr_context (struct dwarf_expr_context *ctx)
|
|||
xfree (ctx);
|
||||
}
|
||||
|
||||
/* Helper for make_cleanup_free_dwarf_expr_context. */
|
||||
|
||||
static void
|
||||
free_dwarf_expr_context_cleanup (void *arg)
|
||||
{
|
||||
free_dwarf_expr_context (arg);
|
||||
}
|
||||
|
||||
/* Return a cleanup that calls free_dwarf_expr_context. */
|
||||
|
||||
struct cleanup *
|
||||
make_cleanup_free_dwarf_expr_context (struct dwarf_expr_context *ctx)
|
||||
{
|
||||
return make_cleanup (free_dwarf_expr_context_cleanup, ctx);
|
||||
}
|
||||
|
||||
/* Expand the memory allocated to CTX's stack to contain at least
|
||||
NEED more elements than are currently used. */
|
||||
|
||||
|
|
|
@ -131,6 +131,8 @@ struct dwarf_expr_piece
|
|||
|
||||
struct dwarf_expr_context *new_dwarf_expr_context (void);
|
||||
void free_dwarf_expr_context (struct dwarf_expr_context *ctx);
|
||||
struct cleanup *
|
||||
make_cleanup_free_dwarf_expr_context (struct dwarf_expr_context *ctx);
|
||||
|
||||
void dwarf_expr_push (struct dwarf_expr_context *ctx, CORE_ADDR value);
|
||||
void dwarf_expr_pop (struct dwarf_expr_context *ctx);
|
||||
|
|
|
@ -215,6 +215,7 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame,
|
|||
struct value *retval;
|
||||
struct dwarf_expr_baton baton;
|
||||
struct dwarf_expr_context *ctx;
|
||||
struct cleanup *old_chain;
|
||||
|
||||
if (size == 0)
|
||||
{
|
||||
|
@ -228,6 +229,8 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame,
|
|||
baton.objfile = dwarf2_per_cu_objfile (per_cu);
|
||||
|
||||
ctx = new_dwarf_expr_context ();
|
||||
old_chain = make_cleanup_free_dwarf_expr_context (ctx);
|
||||
|
||||
ctx->gdbarch = get_objfile_arch (baton.objfile);
|
||||
ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
|
||||
ctx->baton = &baton;
|
||||
|
@ -282,7 +285,7 @@ dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame,
|
|||
|
||||
set_value_initialized (retval, ctx->initialized);
|
||||
|
||||
free_dwarf_expr_context (ctx);
|
||||
do_cleanups (old_chain);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
@ -346,10 +349,13 @@ dwarf2_loc_desc_needs_frame (gdb_byte *data, unsigned short size,
|
|||
struct needs_frame_baton baton;
|
||||
struct dwarf_expr_context *ctx;
|
||||
int in_reg;
|
||||
struct cleanup *old_chain;
|
||||
|
||||
baton.needs_frame = 0;
|
||||
|
||||
ctx = new_dwarf_expr_context ();
|
||||
old_chain = make_cleanup_free_dwarf_expr_context (ctx);
|
||||
|
||||
ctx->gdbarch = get_objfile_arch (dwarf2_per_cu_objfile (per_cu));
|
||||
ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
|
||||
ctx->baton = &baton;
|
||||
|
@ -373,7 +379,7 @@ dwarf2_loc_desc_needs_frame (gdb_byte *data, unsigned short size,
|
|||
in_reg = 1;
|
||||
}
|
||||
|
||||
free_dwarf_expr_context (ctx);
|
||||
do_cleanups (old_chain);
|
||||
|
||||
return baton.needs_frame || in_reg;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue