This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[RFA] DWARF multiple comp unit header support - Revision - Part 1
- From: Petr Sorfa <petrs at caldera dot com>
- To: "gdb-patches at sources dot redhat dot com" <gdb-patches at sources dot redhat dot com>
- Date: Fri, 12 Jul 2002 13:13:51 -0400
- Subject: [RFA] DWARF multiple comp unit header support - Revision - Part 1
- Organization: Caldera
Hi,
Following Jim's suggestion I have split my original rather large
multiple comp unit header patch into several parts. Here is the first
one which moves the DWARF abbreviation table into the comp unit header
structure with several relevant changes. Note that some changes may seem
overkill, but they are place makers for the subsequent parts.
2002-07-12 Petr Sorfa (petrs@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 several new members,
some are being used with this patch, some not.
offset - Offset of the cu_header in .debug_info
begin_offset - Base offset of cu_header into program
next - Next comp unit head in program
dwarf2_abbrevs - abbreviation tables associated with
comp unit header.
(dwarf2_abbrevs): Removed from global var space to
comp unit header struct.
(dwarf2_read_abbrevs): Now accepts a cu_header
parameter and to handle the dwarf2_abbrevs inside
the cu_header.
(dwarf2_lookup_abbrev): Now accepts a cu_header
parameter and handling of dwarf2_abbrevs inside
the cu_header.
(dwarf2_build_psymtabs_hard): Changed to support
the new comp unit header.
(psymtab_to_symtab_1): Changed to support the
new comp unit header.
(dwarf2_empty_abbrev_table): Now expects a ptr
to a dwarf2_abbrev table to clean up.
(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.61
diff -c -p -r1.61 dwarf2read.c
*** dwarf2read.c 12 Jul 2002 15:23:10 -0000 1.61
--- dwarf2read.c 12 Jul 2002 16:32:34 -0000
*************** unsigned int dwarf_eh_frame_size;
*** 162,167 ****
--- 162,172 ----
/* local data types */
+ /* We hold several abbreviation tables at the same time in memory */
+ #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,194 ----
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 */
+
+ /* New information for the comp unit head so as to keep a list
+ of available ones for a program. */
+ unsigned int offset; /* Offset of the cu_header in .debug_info */
+ char *base_offset; /* Base offset after cu_header into program */
+ char *begin_offset; /* Base offset of cu_header into program */
+ struct comp_unit_head *next; /* Next comp unit head in program */
+
+ struct abbrev_info *dwarf2_abbrevs[ABBREV_HASH_SIZE]; /* DWARF abbrev
+ table */
};
/* 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
--- 327,336 ----
*************** static void psymtab_to_symtab_1 (struct
*** 682,692 ****
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 *,
--- 690,701 ----
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
*** 1201,1208 ****
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,
--- 1210,1221 ----
return;
}
/* Read the abbrevs for this compilation unit into a table */
! dwarf2_read_abbrevs (abfd, &cu_header);
!
! cu_header.offset = beg_of_comp_unit - dwarf_info_buffer;
! cu_header.base_offset = info_ptr;
! cu_header.begin_offset = beg_of_comp_unit;
! 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
*** 1549,1556 ****
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);
--- 1562,1569 ----
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
*** 3287,3306 ****
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;
/* loop until we reach an abbrev number of 0 */
while (abbrev_number)
{
--- 3300,3320 ----
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;
! abbrev_ptr = dwarf_abbrev_buffer + cu_header->abbrev_offset;
abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
abbrev_ptr += bytes_read;
+ /* Initialize dwarf2 abbrevs */
+ memset (cu_header->dwarf2_abbrevs, 0,
+ ABBREV_HASH_SIZE*sizeof (struct abbrev_info *));
+
/* loop until we reach an abbrev number of 0 */
while (abbrev_number)
{
*************** dwarf2_read_abbrevs (bfd *abfd, unsigned
*** 3336,3343 ****
}
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
--- 3350,3357 ----
}
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
*** 3351,3357 ****
break;
abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
abbrev_ptr += bytes_read;
! if (dwarf2_lookup_abbrev (abbrev_number) != NULL)
break;
}
}
--- 3365,3371 ----
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
*** 3360,3374 ****
/* 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;
--- 3374,3390 ----
/* ARGSUSED */
static void
! dwarf2_empty_abbrev_table (PTR ptr_to_abbrevs_table)
{
int i;
! struct abbrev_info *abbrev, *next, **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)
*** 3376,3395 ****
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)
{
--- 3392,3411 ----
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
*** 3421,3427 ****
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);
--- 3437,3443 ----
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
*** 3552,3558 ****
return info_ptr;
}
! abbrev = dwarf2_lookup_abbrev (abbrev_number);
if (!abbrev)
{
error ("Dwarf Error: could not find abbrev number %d.", abbrev_number);
--- 3568,3574 ----
return info_ptr;
}
! abbrev = dwarf2_lookup_abbrev (abbrev_number, cu_header);
if (!abbrev)
{
error ("Dwarf Error: could not find abbrev number %d.", abbrev_number);