From 4a22739830aea21ec5de7756676a9ce7c3821001 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 11 Aug 2009 20:36:49 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 9 +++++++++ gdb/dwarf2-frame.c | 5 ++++- gdb/dwarf2expr.c | 16 ++++++++++++++++ gdb/dwarf2expr.h | 2 ++ gdb/dwarf2loc.c | 10 ++++++++-- 5 files changed, 39 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6355f7bec63..c81b7f5758c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2009-08-11 Tom Tromey + + * 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 * objfiles.c (gdb_bfd_unref): Use the bfd_usrdata accessor. diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c index 0f6da4052b4..427f58f5cd4 100644 --- a/gdb/dwarf2-frame.c +++ b/gdb/dwarf2-frame.c @@ -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; } diff --git a/gdb/dwarf2expr.c b/gdb/dwarf2expr.c index 8dbf97694b6..2721065b307 100644 --- a/gdb/dwarf2expr.c +++ b/gdb/dwarf2expr.c @@ -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. */ diff --git a/gdb/dwarf2expr.h b/gdb/dwarf2expr.h index 70479221d74..2306e490348 100644 --- a/gdb/dwarf2expr.h +++ b/gdb/dwarf2expr.h @@ -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); diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index 071b5ac14a6..1df6a9f05c4 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -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; } -- 2.30.2