This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


John, I was wrong --- Caldera's blanket assignment covers you as an
individual.  So there are no copyright issues blocking this patch any
more.  It just needs review.

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]