* 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.
This commit is contained in:
parent
9439a077be
commit
84a146c9d3
6 changed files with 94 additions and 13 deletions
|
@ -1,3 +1,18 @@
|
|||
2012-05-10 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* 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 <tromey@redhat.com>
|
||||
|
||||
* psymtab.c (partial_map_expand_apply): Add assertion.
|
||||
|
|
23
gdb/block.c
23
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. */
|
||||
|
|
18
gdb/block.h
18
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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
|
|
Loading…
Add table
Reference in a new issue