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

Jim Blandy
2002-10-09T04:47:42Z

I've committed this patch --- thanks!

Would you like to add yourself to the Write After Approval list?
You'll need an account on sourceware; write to Chris Faylor
<cgf@redhat.com> for that.

(This is the first time I've recommended someone for WAA; if you think
I'm doing it wrong, please jump in...)

jlw@caldera.com writes:

> 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);