[RFA] DWARF multiple comp unit header support - Revision - Part 1

jlw
2002-09-11T16:58:20Z

As Petr Sorfa winds down his work at Caldera and prepares to
move to the west coast, I will be integrating the GDB Fortran 95
pacthes that Petr submitted for GDB 5.1.1 into the top-of-tree
(version 5.3).

Towards that end, I have reworked Petr's latest "DWARF multiple
comp unit header support - Revision - Part 1" patches to
incorporate Jim Blandy's ChangeLog and comment recomendations.

The GDB testsuite result before and after these changes match.

-- John Wolfe (jlw@caldera.com)

2002-09-11 Petr Sorfa <petrs@caldera.com>

From John Wolfe <jlw@caldera.com>
* dwarf2read.c (ABBREV_HASH_SIZE): moved definition forward in
the code to be defined before struct comp_unit_head.
(comp_unit_head): Added new members - offset, cu_head,
begin_die, next and dwarf2_abbrevs.
(dwarf2_abbrevs): Removed single static var; now member of
struct comp_unit_head.
dwarf2_build_psymtabs_hard): Complete new struct comp_unit_head
members.
(psymtab_to_symtab_1): Changed to work with the new
struct comp_unit_head.
(dwarf2_read_abbrevs): Now accepts a cu_header parameter and
constructs the dwarf2_abbrevs[] inside the cu_header.
(dwarf2_empty_abbrev_table): Now expects a ptr to a
dwarf2_abbrev table to clean up.
(dwarf2_lookup_abbrev): Now accepts a cu_header parameter and
handling of dwarf2_abbrevs inside the cu_header.
(read_partial_die): Now supports the call to the new
dwarf2_lookup_abbrev.
(read_full_die): Now supports the call to the new
dwarf2_lookup_abbrev.

Index: dwarf2read.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2read.c,v
retrieving revision 1.66
diff -p -c -r1.66 dwarf2read.c
*** dwarf2read.c 3 Sep 2002 17:32:11 -0000 1.66
--- dwarf2read.c 11 Sep 2002 16:46:22 -0000
*************** unsigned int dwarf_eh_frame_size;
*** 162,167 ****
--- 162,172 ----

/* local data types */

+ /* We hold several abbreviation tables in memory at the same time. */
+ #ifndef ABBREV_HASH_SIZE
+ #define ABBREV_HASH_SIZE 121
+ #endif
+
/* The data in a compilation unit header, after target2host
translation, looks like this. */
struct comp_unit_head
*************** struct comp_unit_head
*** 174,179 ****
--- 179,207 ----
unsigned int offset_size; /* size of file offsets; either 4 or 8 */
unsigned int initial_length_size; /* size of the length field; either
4 or 12 */
+
+ /* Offset to the first byte of this compilation unit header in the
+ * .debug_info section, for resolving relative reference dies. */
+
+ unsigned int offset;
+
+ /* Pointer to this compilation unit header in the .debug_info
+ * section */
+
+ char *cu_head_ptr;
+
+ /* Pointer to the first die of this compilatio unit. This will
+ * be the first byte following the compilation unit header. */
+
+ char *first_die_ptr;
+
+ /* Pointer to the next compilation unit header in the program. */
+
+ struct comp_unit_head *next;
+
+ /* DWARF abbreviation table associated with this compilation unit */
+
+ struct abbrev_info *dwarf2_abbrevs[ABBREV_HASH_SIZE];
};

/* The line number information for a compilation unit (found in the
*************** struct dwarf_block
*** 312,328 ****
char *data;
};

- /* We only hold one compilation unit's abbrevs in
- memory at any one time. */
- #ifndef ABBREV_HASH_SIZE
- #define ABBREV_HASH_SIZE 121
- #endif
#ifndef ATTR_ALLOC_CHUNK
#define ATTR_ALLOC_CHUNK 4
#endif

- static struct abbrev_info *dwarf2_abbrevs[ABBREV_HASH_SIZE];
-
/* A hash table of die offsets for following references. */
#ifndef REF_HASH_SIZE
#define REF_HASH_SIZE 1021
--- 340,349 ----
*************** static void psymtab_to_symtab_1 (struct
*** 686,696 ****

char *dwarf2_read_section (struct objfile *, file_ptr, unsigned int);

! static void dwarf2_read_abbrevs (bfd *, unsigned int);

static void dwarf2_empty_abbrev_table (PTR);

! static struct abbrev_info *dwarf2_lookup_abbrev (unsigned int);

static char *read_partial_die (struct partial_die_info *,
bfd *, char *,
--- 707,718 ----

char *dwarf2_read_section (struct objfile *, file_ptr, unsigned int);

! static void dwarf2_read_abbrevs (bfd *abfd, struct comp_unit_head *cu_header);

static void dwarf2_empty_abbrev_table (PTR);

! static struct abbrev_info *dwarf2_lookup_abbrev (unsigned int,
! const struct comp_unit_head *cu_header);

static char *read_partial_die (struct partial_die_info *,
bfd *, char *,
*************** dwarf2_build_psymtabs_hard (struct objfi
*** 1211,1219 ****
(long) (beg_of_comp_unit - dwarf_info_buffer));
return;
}
/* Read the abbrevs for this compilation unit into a table */
! dwarf2_read_abbrevs (abfd, cu_header.abbrev_offset);
! make_cleanup (dwarf2_empty_abbrev_table, NULL);

/* Read the compilation unit die */
info_ptr = read_partial_die (&comp_unit_die, abfd, info_ptr,
--- 1233,1246 ----
(long) (beg_of_comp_unit - dwarf_info_buffer));
return;
}
+ /* Complete the cu_header */
+ cu_header.offset = beg_of_comp_unit - dwarf_info_buffer;
+ cu_header.first_die_ptr = info_ptr;
+ cu_header.cu_head_ptr = beg_of_comp_unit;
+
/* Read the abbrevs for this compilation unit into a table */
! dwarf2_read_abbrevs (abfd, &cu_header);
! make_cleanup (dwarf2_empty_abbrev_table, cu_header.dwarf2_abbrevs);

/* Read the compilation unit die */
info_ptr = read_partial_die (&comp_unit_die, abfd, info_ptr,
*************** psymtab_to_symtab_1 (struct partial_symt
*** 1560,1567 ****
info_ptr = read_comp_unit_head (&cu_header, info_ptr, abfd);

/* Read the abbrevs for this compilation unit */
! dwarf2_read_abbrevs (abfd, cu_header.abbrev_offset);
! make_cleanup (dwarf2_empty_abbrev_table, NULL);

dies = read_comp_unit (info_ptr, abfd, &cu_header);

--- 1587,1594 ----
info_ptr = read_comp_unit_head (&cu_header, info_ptr, abfd);

/* Read the abbrevs for this compilation unit */
! dwarf2_read_abbrevs (abfd, &cu_header);
! make_cleanup (dwarf2_empty_abbrev_table, cu_header.dwarf2_abbrevs);

dies = read_comp_unit (info_ptr, abfd, &cu_header);

*************** dwarf2_read_section (struct objfile *obj
*** 3345,3361 ****
in a hash table. */

static void
! dwarf2_read_abbrevs (bfd *abfd, unsigned int offset)
{
char *abbrev_ptr;
struct abbrev_info *cur_abbrev;
unsigned int abbrev_number, bytes_read, abbrev_name;
unsigned int abbrev_form, hash_number;

! /* empty the table */
! dwarf2_empty_abbrev_table (NULL);

! abbrev_ptr = dwarf_abbrev_buffer + offset;
abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
abbrev_ptr += bytes_read;

--- 3372,3389 ----
in a hash table. */

static void
! dwarf2_read_abbrevs (bfd *abfd, struct comp_unit_head *cu_header)
{
char *abbrev_ptr;
struct abbrev_info *cur_abbrev;
unsigned int abbrev_number, bytes_read, abbrev_name;
unsigned int abbrev_form, hash_number;

! /* Initialize dwarf2 abbrevs */
! memset (cu_header->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;

*************** dwarf2_read_abbrevs (bfd *abfd, unsigned
*** 3394,3401 ****
}

hash_number = abbrev_number % ABBREV_HASH_SIZE;
! cur_abbrev->next = dwarf2_abbrevs[hash_number];
! dwarf2_abbrevs[hash_number] = cur_abbrev;

/* Get next abbreviation.
Under Irix6 the abbreviations for a compilation unit are not
--- 3422,3429 ----
}

hash_number = abbrev_number % ABBREV_HASH_SIZE;
! cur_abbrev->next = cu_header->dwarf2_abbrevs[hash_number];
! cu_header->dwarf2_abbrevs[hash_number] = cur_abbrev;

/* Get next abbreviation.
Under Irix6 the abbreviations for a compilation unit are not
*************** dwarf2_read_abbrevs (bfd *abfd, unsigned
*** 3409,3415 ****
break;
abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
abbrev_ptr += bytes_read;
! if (dwarf2_lookup_abbrev (abbrev_number) != NULL)
break;
}
}
--- 3437,3443 ----
break;
abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
abbrev_ptr += bytes_read;
! if (dwarf2_lookup_abbrev (abbrev_number, cu_header) != NULL)
break;
}
}
*************** dwarf2_read_abbrevs (bfd *abfd, unsigned
*** 3418,3432 ****

/* ARGSUSED */
static void
! dwarf2_empty_abbrev_table (PTR ignore)
{
int i;
struct abbrev_info *abbrev, *next;

for (i = 0; i < ABBREV_HASH_SIZE; ++i)
{
next = NULL;
! abbrev = dwarf2_abbrevs[i];
while (abbrev)
{
next = abbrev->next;
--- 3446,3463 ----

/* ARGSUSED */
static void
! dwarf2_empty_abbrev_table (PTR ptr_to_abbrevs_table)
{
int i;
struct abbrev_info *abbrev, *next;
+ struct abbrev_info **abbrevs;
+
+ 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;
*************** dwarf2_empty_abbrev_table (PTR ignore)
*** 3434,3453 ****
xfree (abbrev);
abbrev = next;
}
! dwarf2_abbrevs[i] = NULL;
}
}

/* Lookup an abbrev_info structure in the abbrev hash table. */

static struct abbrev_info *
! dwarf2_lookup_abbrev (unsigned int number)
{
unsigned int hash_number;
struct abbrev_info *abbrev;

hash_number = number % ABBREV_HASH_SIZE;
! abbrev = dwarf2_abbrevs[hash_number];

while (abbrev)
{
--- 3465,3484 ----
xfree (abbrev);
abbrev = next;
}
! abbrevs[i] = NULL;
}
}

/* Lookup an abbrev_info structure in the abbrev hash table. */

static struct abbrev_info *
! dwarf2_lookup_abbrev (unsigned int number, const struct comp_unit_head *cu_header)
{
unsigned int hash_number;
struct abbrev_info *abbrev;

hash_number = number % ABBREV_HASH_SIZE;
! abbrev = cu_header->dwarf2_abbrevs[hash_number];

while (abbrev)
{
*************** read_partial_die (struct partial_die_inf
*** 3479,3485 ****
if (!abbrev_number)
return info_ptr;

! abbrev = dwarf2_lookup_abbrev (abbrev_number);
if (!abbrev)
{
error ("Dwarf Error: Could not find abbrev number %d.", abbrev_number);
--- 3510,3516 ----
if (!abbrev_number)
return info_ptr;

! abbrev = dwarf2_lookup_abbrev (abbrev_number, cu_header);
if (!abbrev)
{
error ("Dwarf Error: Could not find abbrev number %d.", abbrev_number);
*************** read_full_die (struct die_info **diep, b
*** 3623,3629 ****
return info_ptr;
}

! abbrev = dwarf2_lookup_abbrev (abbrev_number);
if (!abbrev)
{
error ("Dwarf Error: could not find abbrev number %d.", abbrev_number);
--- 3654,3660 ----
return info_ptr;
}

! abbrev = dwarf2_lookup_abbrev (abbrev_number, cu_header);
if (!abbrev)
{
error ("Dwarf Error: could not find abbrev number %d.", abbrev_number);