From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9799 invoked by alias); 11 Sep 2002 16:58:20 -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 9792 invoked from network); 11 Sep 2002 16:58:18 -0000 Received: from unknown (HELO sapphire.nj.caldera.com) (63.124.204.226) by sources.redhat.com with SMTP; 11 Sep 2002 16:58:18 -0000 Received: (from jlw@localhost) by sapphire.nj.caldera.com (8.9.3/UW7.1.1) id MAA02858; Wed, 11 Sep 2002 12:57:43 -0400 (EDT) Message-Id: <200209111657.MAA02858@sapphire.nj.caldera.com> From: jlw@caldera.com To: gdb-patches@sources.redhat.com Date: Wed, 11 Sep 2002 09:58:00 -0000 Subject: [RFA] DWARF multiple comp unit header support - Revision - Part 1 Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2002-09/txt/msg00181.txt.bz2 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);