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]

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


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]