From 84a146c9d3fdfcd4a45b12f88735bd77d4f8d729 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 10 May 2012 19:59:12 +0000 Subject: [PATCH] * jv-lang.c (get_java_class_symtab): Use allocate_global_block, set_block_symtab. * jit.c (finalize_symtab): Use allocate_global_block, set_block_symtab. * buildsym.c (finish_block_internal): New function, from old finish_block. (finish_block): Rewrite. (end_symtab): Use finish_block_internal, set_block_symtab. * block.h (struct global_block): New. (allocate_global_block, set_block_symtab): Declare. * block.c (allocate_global_block, set_block_symtab): New functions. --- gdb/ChangeLog | 15 +++++++++++++++ gdb/block.c | 23 +++++++++++++++++++++++ gdb/block.h | 18 ++++++++++++++++++ gdb/buildsym.c | 39 ++++++++++++++++++++++++++++----------- gdb/jit.c | 9 ++++++++- gdb/jv-lang.c | 3 ++- 6 files changed, 94 insertions(+), 13 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 151c515a6db..9e04f3493e9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,18 @@ +2012-05-10 Tom Tromey + + * jv-lang.c (get_java_class_symtab): Use allocate_global_block, + set_block_symtab. + * jit.c (finalize_symtab): Use allocate_global_block, + set_block_symtab. + * buildsym.c (finish_block_internal): New function, from old + finish_block. + (finish_block): Rewrite. + (end_symtab): Use finish_block_internal, set_block_symtab. + * block.h (struct global_block): New. + (allocate_global_block, set_block_symtab): Declare. + * block.c (allocate_global_block, set_block_symtab): New + functions. + 2012-05-10 Tom Tromey * psymtab.c (partial_map_expand_apply): Add assertion. diff --git a/gdb/block.c b/gdb/block.c index 3318cb4377d..d3bc5ea9592 100644 --- a/gdb/block.c +++ b/gdb/block.c @@ -370,6 +370,29 @@ allocate_block (struct obstack *obstack) return bl; } +/* Allocate a global block. */ + +struct block * +allocate_global_block (struct obstack *obstack) +{ + struct global_block *bl = OBSTACK_ZALLOC (obstack, struct global_block); + + return &bl->block; +} + +/* Set the symtab of the global block. */ + +void +set_block_symtab (struct block *block, struct symtab *symtab) +{ + struct global_block *gb; + + gdb_assert (BLOCK_SUPERBLOCK (block) == NULL); + gb = (struct global_block *) block; + gdb_assert (gb->symtab == NULL); + gb->symtab = symtab; +} + /* See block.h. */ diff --git a/gdb/block.h b/gdb/block.h index 2eec346b392..de674a86653 100644 --- a/gdb/block.h +++ b/gdb/block.h @@ -99,6 +99,21 @@ struct block language_specific; }; +/* The global block is singled out so that we can provide a back-link + to the primary symtab. */ + +struct global_block +{ + /* The block. */ + + struct block block; + + /* This holds a pointer to the primary symtab holding this + block. */ + + struct symtab *symtab; +}; + #define BLOCK_START(bl) (bl)->startaddr #define BLOCK_END(bl) (bl)->endaddr #define BLOCK_FUNCTION(bl) (bl)->function @@ -161,6 +176,9 @@ extern const struct block *block_global_block (const struct block *block); extern struct block *allocate_block (struct obstack *obstack); +extern struct block *allocate_global_block (struct obstack *obstack); + +extern void set_block_symtab (struct block *, struct symtab *); /* A block iterator. This structure should be treated as though it were opaque; it is only defined here because we want to support diff --git a/gdb/buildsym.c b/gdb/buildsym.c index 58c2693e112..ae7f90e976a 100644 --- a/gdb/buildsym.c +++ b/gdb/buildsym.c @@ -214,11 +214,12 @@ free_pending_blocks (void) the order the symbols have in the list (reversed from the input file). Put the block on the list of pending blocks. */ -struct block * -finish_block (struct symbol *symbol, struct pending **listhead, - struct pending_block *old_blocks, - CORE_ADDR start, CORE_ADDR end, - struct objfile *objfile) +static struct block * +finish_block_internal (struct symbol *symbol, struct pending **listhead, + struct pending_block *old_blocks, + CORE_ADDR start, CORE_ADDR end, + struct objfile *objfile, + int is_global) { struct gdbarch *gdbarch = get_objfile_arch (objfile); struct pending *next, *next1; @@ -226,7 +227,9 @@ finish_block (struct symbol *symbol, struct pending **listhead, struct pending_block *pblock; struct pending_block *opblock; - block = allocate_block (&objfile->objfile_obstack); + block = (is_global + ? allocate_global_block (&objfile->objfile_obstack) + : allocate_block (&objfile->objfile_obstack)); if (symbol) { @@ -241,9 +244,6 @@ finish_block (struct symbol *symbol, struct pending **listhead, BLOCK_START (block) = start; BLOCK_END (block) = end; - /* Superblock filled in when containing block is made. */ - BLOCK_SUPERBLOCK (block) = NULL; - BLOCK_NAMESPACE (block) = NULL; /* Put the block in as the value of the symbol that names it. */ @@ -387,6 +387,15 @@ finish_block (struct symbol *symbol, struct pending **listhead, return block; } +struct block * +finish_block (struct symbol *symbol, struct pending **listhead, + struct pending_block *old_blocks, + CORE_ADDR start, CORE_ADDR end, + struct objfile *objfile) +{ + return finish_block_internal (symbol, listhead, old_blocks, + start, end, objfile, 0); +} /* Record BLOCK on the list of all blocks in the file. Put it after OPBLOCK, or at the beginning if opblock is NULL. This puts the @@ -1017,8 +1026,8 @@ end_symtab (CORE_ADDR end_addr, struct objfile *objfile, int section) blockvector. */ finish_block (0, &file_symbols, 0, last_source_start_addr, end_addr, objfile); - finish_block (0, &global_symbols, 0, last_source_start_addr, - end_addr, objfile); + finish_block_internal (0, &global_symbols, 0, last_source_start_addr, + end_addr, objfile, 1); blockvector = make_blockvector (objfile); } @@ -1158,6 +1167,14 @@ end_symtab (CORE_ADDR end_addr, struct objfile *objfile, int section) if (symtab) { symtab->primary = 1; + + if (symtab->blockvector) + { + struct block *b = BLOCKVECTOR_BLOCK (symtab->blockvector, + GLOBAL_BLOCK); + + set_block_symtab (b, symtab); + } } /* Default any symbols without a specified symtab to the primary diff --git a/gdb/jit.c b/gdb/jit.c index 24ab0169067..a76cca1f1df 100644 --- a/gdb/jit.c +++ b/gdb/jit.c @@ -695,7 +695,11 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) block_iter = NULL; for (i = 0; i < FIRST_LOCAL_BLOCK; i++) { - struct block *new_block = allocate_block (&objfile->objfile_obstack); + struct block *new_block; + + new_block = (i == GLOBAL_BLOCK + ? allocate_global_block (&objfile->objfile_obstack) + : allocate_block (&objfile->objfile_obstack)); BLOCK_DICT (new_block) = dict_create_linear (&objfile->objfile_obstack, NULL); BLOCK_SUPERBLOCK (new_block) = block_iter; @@ -705,6 +709,9 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) BLOCK_END (new_block) = (CORE_ADDR) end; BLOCKVECTOR_BLOCK (symtab->blockvector, i) = new_block; + + if (i == GLOBAL_BLOCK) + set_block_symtab (new_block, symtab); } /* Fill up the superblock fields for the real blocks, using the diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c index c3c5298f717..a7cfb76369f 100644 --- a/gdb/jv-lang.c +++ b/gdb/jv-lang.c @@ -158,8 +158,9 @@ get_java_class_symtab (struct gdbarch *gdbarch) BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK) = bl; /* Allocate GLOBAL_BLOCK. */ - bl = allocate_block (&objfile->objfile_obstack); + bl = allocate_global_block (&objfile->objfile_obstack); BLOCK_DICT (bl) = dict_create_hashed_expandable (); + set_block_symtab (bl, class_symtab); BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK) = bl; /* Arrange to free the dict. */ -- 2.30.2