* dwarf2read.c (struct comp_unit_head): Remove dwarf2_abbrevs array.
(struct dwarf2_cu): Add abbrev_obstack and dwarf2_abbrevs pointer. Update comment about comp_unit_head. (struct abbrev_info): Shorten two int flags. (dwarf_alloc_abbrev): Take a CU argument. (dwarf2_build_psymtabs_hard): Call dwarf2_free_abbrev_table each time through the loop. Update cleanup argument. (psymtab_to_symtab_1): Update cleanup call. (dwarf2_read_abbrevs, dwarf2_alloc_abbrev): Allocate on the abbrev_obstack. (dwarf2_free_abbrev_table): Renamed from dwarf2_empty_abbrev_table. Just call obstack_free and clear the pointer.
This commit is contained in:
parent
b40c7d58b1
commit
f3dd693351
@ -1,3 +1,18 @@
|
||||
2004-03-09 Daniel Jacobowitz <drow@mvista.com>
|
||||
|
||||
* dwarf2read.c (struct comp_unit_head): Remove dwarf2_abbrevs array.
|
||||
(struct dwarf2_cu): Add abbrev_obstack and dwarf2_abbrevs
|
||||
pointer. Update comment about comp_unit_head.
|
||||
(struct abbrev_info): Shorten two int flags.
|
||||
(dwarf_alloc_abbrev): Take a CU argument.
|
||||
(dwarf2_build_psymtabs_hard): Call dwarf2_free_abbrev_table
|
||||
each time through the loop. Update cleanup argument.
|
||||
(psymtab_to_symtab_1): Update cleanup call.
|
||||
(dwarf2_read_abbrevs, dwarf2_alloc_abbrev): Allocate on the
|
||||
abbrev_obstack.
|
||||
(dwarf2_free_abbrev_table): Renamed from dwarf2_empty_abbrev_table.
|
||||
Just call obstack_free and clear the pointer.
|
||||
|
||||
2004-03-09 Daniel Jacobowitz <drow@mvista.com>
|
||||
|
||||
* infrun.c (handle_inferior_event): Remove short-circuit code for
|
||||
|
102
gdb/dwarf2read.c
102
gdb/dwarf2read.c
@ -219,10 +219,6 @@ struct comp_unit_head
|
||||
|
||||
struct comp_unit_head *next;
|
||||
|
||||
/* DWARF abbreviation table associated with this compilation unit */
|
||||
|
||||
struct abbrev_info *dwarf2_abbrevs[ABBREV_HASH_SIZE];
|
||||
|
||||
/* Base address of this compilation unit. */
|
||||
|
||||
CORE_ADDR base_address;
|
||||
@ -241,8 +237,7 @@ struct dwarf2_cu
|
||||
/* The header of the compilation unit.
|
||||
|
||||
FIXME drow/2003-11-10: Some of the things from the comp_unit_head
|
||||
should be moved to the dwarf2_cu structure; for instance the abbrevs
|
||||
hash table. */
|
||||
should logically be moved to the dwarf2_cu structure. */
|
||||
struct comp_unit_head header;
|
||||
|
||||
struct function_range *first_fn, *last_fn, *cached_fn;
|
||||
@ -272,6 +267,12 @@ struct dwarf2_cu
|
||||
FT_NUM_MEMBERS compile time constant, which is the number of predefined
|
||||
fundamental types gdb knows how to construct. */
|
||||
struct type *ftypes[FT_NUM_MEMBERS]; /* Fundamental types */
|
||||
|
||||
/* DWARF abbreviation table associated with this compilation unit. */
|
||||
struct abbrev_info **dwarf2_abbrevs;
|
||||
|
||||
/* Storage for the abbrev table. */
|
||||
struct obstack abbrev_obstack;
|
||||
};
|
||||
|
||||
/* The line number information for a compilation unit (found in the
|
||||
@ -343,8 +344,8 @@ struct abbrev_info
|
||||
{
|
||||
unsigned int number; /* number identifying abbrev */
|
||||
enum dwarf_tag tag; /* dwarf tag */
|
||||
int has_children; /* boolean */
|
||||
unsigned int num_attrs; /* number of attributes */
|
||||
unsigned short has_children; /* boolean */
|
||||
unsigned short num_attrs; /* number of attributes */
|
||||
struct attr_abbrev *attrs; /* an array of attribute descriptions */
|
||||
struct abbrev_info *next; /* next in chain */
|
||||
};
|
||||
@ -686,7 +687,7 @@ char *dwarf2_read_section (struct objfile *, asection *);
|
||||
|
||||
static void dwarf2_read_abbrevs (bfd *abfd, struct dwarf2_cu *cu);
|
||||
|
||||
static void dwarf2_empty_abbrev_table (void *);
|
||||
static void dwarf2_free_abbrev_table (void *);
|
||||
|
||||
static struct abbrev_info *dwarf2_lookup_abbrev (unsigned int,
|
||||
struct dwarf2_cu *);
|
||||
@ -918,7 +919,7 @@ static void dwarf2_free_tmp_obstack (void *);
|
||||
|
||||
static struct dwarf_block *dwarf_alloc_block (void);
|
||||
|
||||
static struct abbrev_info *dwarf_alloc_abbrev (void);
|
||||
static struct abbrev_info *dwarf_alloc_abbrev (struct dwarf2_cu *);
|
||||
|
||||
static struct die_info *dwarf_alloc_die (void);
|
||||
|
||||
@ -1214,6 +1215,7 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
|
||||
left at all should be sufficient. */
|
||||
while (info_ptr < dwarf_info_buffer + dwarf_info_size)
|
||||
{
|
||||
struct cleanup *back_to_inner;
|
||||
struct dwarf2_cu cu;
|
||||
beg_of_comp_unit = info_ptr;
|
||||
|
||||
@ -1251,7 +1253,7 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
|
||||
|
||||
/* Read the abbrevs for this compilation unit into a table */
|
||||
dwarf2_read_abbrevs (abfd, &cu);
|
||||
make_cleanup (dwarf2_empty_abbrev_table, cu.header.dwarf2_abbrevs);
|
||||
back_to_inner = make_cleanup (dwarf2_free_abbrev_table, &cu);
|
||||
|
||||
/* Read the compilation unit die */
|
||||
info_ptr = read_partial_die (&comp_unit_die, abfd, info_ptr,
|
||||
@ -1328,6 +1330,8 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
|
||||
|
||||
info_ptr = beg_of_comp_unit + cu.header.length
|
||||
+ cu.header.initial_length_size;
|
||||
|
||||
do_cleanups (back_to_inner);
|
||||
}
|
||||
do_cleanups (back_to);
|
||||
}
|
||||
@ -1874,7 +1878,7 @@ psymtab_to_symtab_1 (struct partial_symtab *pst)
|
||||
|
||||
/* Read the abbrevs for this compilation unit */
|
||||
dwarf2_read_abbrevs (abfd, &cu);
|
||||
make_cleanup (dwarf2_empty_abbrev_table, cu.header.dwarf2_abbrevs);
|
||||
make_cleanup (dwarf2_free_abbrev_table, &cu);
|
||||
|
||||
cu.header.offset = offset;
|
||||
|
||||
@ -4188,19 +4192,28 @@ dwarf2_read_abbrevs (bfd *abfd, struct dwarf2_cu *cu)
|
||||
struct abbrev_info *cur_abbrev;
|
||||
unsigned int abbrev_number, bytes_read, abbrev_name;
|
||||
unsigned int abbrev_form, hash_number;
|
||||
struct attr_abbrev *cur_attrs;
|
||||
unsigned int allocated_attrs;
|
||||
|
||||
/* Initialize dwarf2 abbrevs */
|
||||
memset (cu_header->dwarf2_abbrevs, 0,
|
||||
ABBREV_HASH_SIZE*sizeof (struct abbrev_info *));
|
||||
obstack_init (&cu->abbrev_obstack);
|
||||
cu->dwarf2_abbrevs = obstack_alloc (&cu->abbrev_obstack,
|
||||
(ABBREV_HASH_SIZE
|
||||
* sizeof (struct abbrev_info *)));
|
||||
memset (cu->dwarf2_abbrevs, 0,
|
||||
ABBREV_HASH_SIZE * sizeof (struct abbrev_info *));
|
||||
|
||||
abbrev_ptr = dwarf_abbrev_buffer + cu_header->abbrev_offset;
|
||||
abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
|
||||
abbrev_ptr += bytes_read;
|
||||
|
||||
allocated_attrs = ATTR_ALLOC_CHUNK;
|
||||
cur_attrs = xmalloc (allocated_attrs * sizeof (struct attr_abbrev));
|
||||
|
||||
/* loop until we reach an abbrev number of 0 */
|
||||
while (abbrev_number)
|
||||
{
|
||||
cur_abbrev = dwarf_alloc_abbrev ();
|
||||
cur_abbrev = dwarf_alloc_abbrev (cu);
|
||||
|
||||
/* read in abbrev header */
|
||||
cur_abbrev->number = abbrev_number;
|
||||
@ -4216,24 +4229,30 @@ dwarf2_read_abbrevs (bfd *abfd, struct dwarf2_cu *cu)
|
||||
abbrev_ptr += bytes_read;
|
||||
while (abbrev_name)
|
||||
{
|
||||
if ((cur_abbrev->num_attrs % ATTR_ALLOC_CHUNK) == 0)
|
||||
if (cur_abbrev->num_attrs == allocated_attrs)
|
||||
{
|
||||
cur_abbrev->attrs = (struct attr_abbrev *)
|
||||
xrealloc (cur_abbrev->attrs,
|
||||
(cur_abbrev->num_attrs + ATTR_ALLOC_CHUNK)
|
||||
* sizeof (struct attr_abbrev));
|
||||
allocated_attrs += ATTR_ALLOC_CHUNK;
|
||||
cur_attrs
|
||||
= xrealloc (cur_attrs, (allocated_attrs
|
||||
* sizeof (struct attr_abbrev)));
|
||||
}
|
||||
cur_abbrev->attrs[cur_abbrev->num_attrs].name = abbrev_name;
|
||||
cur_abbrev->attrs[cur_abbrev->num_attrs++].form = abbrev_form;
|
||||
cur_attrs[cur_abbrev->num_attrs].name = abbrev_name;
|
||||
cur_attrs[cur_abbrev->num_attrs++].form = abbrev_form;
|
||||
abbrev_name = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
|
||||
abbrev_ptr += bytes_read;
|
||||
abbrev_form = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
|
||||
abbrev_ptr += bytes_read;
|
||||
}
|
||||
|
||||
cur_abbrev->attrs = obstack_alloc (&cu->abbrev_obstack,
|
||||
(cur_abbrev->num_attrs
|
||||
* sizeof (struct attr_abbrev)));
|
||||
memcpy (cur_abbrev->attrs, cur_attrs,
|
||||
cur_abbrev->num_attrs * sizeof (struct attr_abbrev));
|
||||
|
||||
hash_number = abbrev_number % ABBREV_HASH_SIZE;
|
||||
cur_abbrev->next = cu_header->dwarf2_abbrevs[hash_number];
|
||||
cu_header->dwarf2_abbrevs[hash_number] = cur_abbrev;
|
||||
cur_abbrev->next = cu->dwarf2_abbrevs[hash_number];
|
||||
cu->dwarf2_abbrevs[hash_number] = cur_abbrev;
|
||||
|
||||
/* Get next abbreviation.
|
||||
Under Irix6 the abbreviations for a compilation unit are not
|
||||
@ -4250,32 +4269,19 @@ dwarf2_read_abbrevs (bfd *abfd, struct dwarf2_cu *cu)
|
||||
if (dwarf2_lookup_abbrev (abbrev_number, cu) != NULL)
|
||||
break;
|
||||
}
|
||||
|
||||
xfree (cur_attrs);
|
||||
}
|
||||
|
||||
/* Empty the abbrev table for a new compilation unit. */
|
||||
/* Release the memory used by the abbrev table for a compilation unit. */
|
||||
|
||||
static void
|
||||
dwarf2_empty_abbrev_table (void *ptr_to_abbrevs_table)
|
||||
dwarf2_free_abbrev_table (void *ptr_to_cu)
|
||||
{
|
||||
int i;
|
||||
struct abbrev_info *abbrev, *next;
|
||||
struct abbrev_info **abbrevs;
|
||||
struct dwarf2_cu *cu = ptr_to_cu;
|
||||
|
||||
abbrevs = (struct abbrev_info **)ptr_to_abbrevs_table;
|
||||
|
||||
for (i = 0; i < ABBREV_HASH_SIZE; ++i)
|
||||
{
|
||||
next = NULL;
|
||||
abbrev = abbrevs[i];
|
||||
while (abbrev)
|
||||
{
|
||||
next = abbrev->next;
|
||||
xfree (abbrev->attrs);
|
||||
xfree (abbrev);
|
||||
abbrev = next;
|
||||
}
|
||||
abbrevs[i] = NULL;
|
||||
}
|
||||
obstack_free (&cu->abbrev_obstack, NULL);
|
||||
cu->dwarf2_abbrevs = NULL;
|
||||
}
|
||||
|
||||
/* Lookup an abbrev_info structure in the abbrev hash table. */
|
||||
@ -4283,12 +4289,11 @@ dwarf2_empty_abbrev_table (void *ptr_to_abbrevs_table)
|
||||
static struct abbrev_info *
|
||||
dwarf2_lookup_abbrev (unsigned int number, struct dwarf2_cu *cu)
|
||||
{
|
||||
struct comp_unit_head *cu_header = &cu->header;
|
||||
unsigned int hash_number;
|
||||
struct abbrev_info *abbrev;
|
||||
|
||||
hash_number = number % ABBREV_HASH_SIZE;
|
||||
abbrev = cu_header->dwarf2_abbrevs[hash_number];
|
||||
abbrev = cu->dwarf2_abbrevs[hash_number];
|
||||
|
||||
while (abbrev)
|
||||
{
|
||||
@ -7603,11 +7608,12 @@ dwarf_alloc_block (void)
|
||||
}
|
||||
|
||||
static struct abbrev_info *
|
||||
dwarf_alloc_abbrev (void)
|
||||
dwarf_alloc_abbrev (struct dwarf2_cu *cu)
|
||||
{
|
||||
struct abbrev_info *abbrev;
|
||||
|
||||
abbrev = (struct abbrev_info *) xmalloc (sizeof (struct abbrev_info));
|
||||
abbrev = (struct abbrev_info *)
|
||||
obstack_alloc (&cu->abbrev_obstack, sizeof (struct abbrev_info));
|
||||
memset (abbrev, 0, sizeof (struct abbrev_info));
|
||||
return (abbrev);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user