diff options
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/buildsym.c | 32 | ||||
-rw-r--r-- | gdb/buildsym.h | 16 |
3 files changed, 40 insertions, 19 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b3b0261..fc2678a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2012-12-10 Tom Tromey <tromey@redhat.com> + + * buildsym.c (struct pending_block): Move from buildsym.h. + (pending_blocks): Likewise; now static. + (pending_block_obstack): New global. + (free_pending_blocks): Free blocks. + (record_pending_block): Use pending_block_obstack. + * buildsym.h (struct pending_block): Move definition to + buildsym.c. + (pending_blocks): Don't declare. + 2012-12-10 Pedro Alves <palves@redhat.com> * solib-svr4.c (svr4_solib_create_inferior_hook) [_SCO_DS]: Remove diff --git a/gdb/buildsym.c b/gdb/buildsym.c index 8f2e732..c3e8516 100644 --- a/gdb/buildsym.c +++ b/gdb/buildsym.c @@ -83,6 +83,25 @@ static struct obstack pending_addrmap_obstack; the end, then we just toss the addrmap. */ static int pending_addrmap_interesting; +/* An obstack used for allocating pending blocks. */ + +static struct obstack pending_block_obstack; + +/* List of blocks already made (lexical contexts already closed). + This is used at the end to make the blockvector. */ + +struct pending_block + { + struct pending_block *next; + struct block *block; + }; + +/* Pointer to the head of a linked list of symbol blocks which have + already been finalized (lexical contexts already closed) and which + are just waiting to be built into a blockvector when finalizing the + associated symtab. */ + +static struct pending_block *pending_blocks; static int compare_line_numbers (const void *ln1p, const void *ln2p); @@ -205,9 +224,11 @@ really_free_pendings (void *dummy) void free_pending_blocks (void) { - /* The links are made in the objfile_obstack, so we only need to - reset PENDING_BLOCKS. */ - pending_blocks = NULL; + if (pending_blocks != NULL) + { + obstack_free (&pending_block_obstack, NULL); + pending_blocks = NULL; + } } /* Take one of the lists of symbols and make a block from it. Keep @@ -418,8 +439,11 @@ record_pending_block (struct objfile *objfile, struct block *block, { struct pending_block *pblock; + if (pending_blocks == NULL) + obstack_init (&pending_block_obstack); + pblock = (struct pending_block *) - obstack_alloc (&objfile->objfile_obstack, sizeof (struct pending_block)); + obstack_alloc (&pending_block_obstack, sizeof (struct pending_block)); pblock->block = block; if (opblock) { diff --git a/gdb/buildsym.h b/gdb/buildsym.h index 0db96bf..b7d4a76 100644 --- a/gdb/buildsym.h +++ b/gdb/buildsym.h @@ -37,6 +37,7 @@ struct addrmap; this technique. */ struct block; +struct pending_block; #ifndef EXTERN #define EXTERN extern @@ -177,21 +178,6 @@ EXTERN int context_stack_size; EXTERN int within_function; -/* List of blocks already made (lexical contexts already closed). - This is used at the end to make the blockvector. */ - -struct pending_block - { - struct pending_block *next; - struct block *block; - }; - -/* Pointer to the head of a linked list of symbol blocks which have - already been finalized (lexical contexts already closed) and which - are just waiting to be built into a blockvector when finalizing the - associated symtab. */ - -EXTERN struct pending_block *pending_blocks; struct subfile_stack |