From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20250 invoked by alias); 9 Oct 2002 04:03:35 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 20239 invoked from network); 9 Oct 2002 04:03:32 -0000 Received: from unknown (HELO zenia.red-bean.com) (66.244.67.22) by sources.redhat.com with SMTP; 9 Oct 2002 04:03:32 -0000 Received: (from jimb@localhost) by zenia.red-bean.com (8.11.6/8.11.6) id g993kSb10801; Tue, 8 Oct 2002 22:46:28 -0500 To: jlw@caldera.com Cc: gdb-patches@sources.redhat.com Subject: Re: [RFA] DWARF multiple comp unit header support - Revision - Part 1 References: <200209111657.MAA02858@sapphire.nj.caldera.com> From: Jim Blandy Date: Tue, 08 Oct 2002 21:03:00 -0000 In-Reply-To: <200209111657.MAA02858@sapphire.nj.caldera.com> Message-ID: User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2.90 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2002-10/txt/msg00202.txt.bz2 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 > > From John Wolfe > * 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);