From 88bfdde411c988853b8ec9f8699dcb614f7b079a Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 27 May 2010 19:14:35 +0000 Subject: [PATCH] * dwarf2loc.c (struct piece_closure) : New field. (allocate_piece_closure): Initialize refc. (copy_pieced_value_closure): Use refc. (free_pieced_value_closure): Likewise. --- gdb/ChangeLog | 7 +++++++ gdb/dwarf2loc.c | 15 ++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6ce98ba462..fd2c93663e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2010-05-27 Tom Tromey + + * dwarf2loc.c (struct piece_closure) : New field. + (allocate_piece_closure): Initialize refc. + (copy_pieced_value_closure): Use refc. + (free_pieced_value_closure): Likewise. + 2010-05-27 Tom Tromey * arm-tdep.c (push_stack_item): 'contents' now const. diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index a5d10f59de..79d22770d5 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -231,6 +231,9 @@ dwarf_expr_tls_address (void *baton, CORE_ADDR offset) struct piece_closure { + /* Reference count. */ + int refc; + /* The number of pieces used to describe this variable. */ int n_pieces; @@ -250,6 +253,7 @@ allocate_piece_closure (int n_pieces, struct dwarf_expr_piece *pieces, { struct piece_closure *c = XZALLOC (struct piece_closure); + c->refc = 1; c->n_pieces = n_pieces; c->addr_size = addr_size; c->pieces = XCALLOC (n_pieces, struct dwarf_expr_piece); @@ -747,7 +751,8 @@ copy_pieced_value_closure (struct value *v) { struct piece_closure *c = (struct piece_closure *) value_computed_closure (v); - return allocate_piece_closure (c->n_pieces, c->pieces, c->addr_size); + ++c->refc; + return c; } static void @@ -755,8 +760,12 @@ free_pieced_value_closure (struct value *v) { struct piece_closure *c = (struct piece_closure *) value_computed_closure (v); - xfree (c->pieces); - xfree (c); + --c->refc; + if (c->refc == 0) + { + xfree (c->pieces); + xfree (c); + } } /* Functions for accessing a variable described by DW_OP_piece. */