2005-02-25 Mark Kettenis <kettenis@gnu.org>

Committed by Elena Zannoni <ezannoni@redhat.com>

	* dwarf2read.c (dwarf2_build_psymtabs_hard): Adjust
	info_ptr before building psymtabs for included files.
	(create_all_comp_units): Initailize initial length size of
	compilation header to zero.
	(read_initial_length): Complain if both 32-bit and 64-bit DWARF
	sections are encountered within the same compilation header.
	(dwarf_decode_line_header): Pass compilation header in call to
	read_initial_length.
This commit is contained in:
Elena Zannoni
2005-02-26 04:32:56 +00:00
parent 014caf2bf8
commit dd373385f3
2 changed files with 43 additions and 30 deletions

View File

@ -1,3 +1,16 @@
2005-02-25 Mark Kettenis <kettenis@gnu.org>
Committed by Elena Zannoni <ezannoni@redhat.com>
* dwarf2read.c (dwarf2_build_psymtabs_hard): Adjust
info_ptr before building psymtabs for included files.
(create_all_comp_units): Initailize initial length size of
compilation header to zero.
(read_initial_length): Complain if both 32-bit and 64-bit DWARF
sections are encountered within the same compilation header.
(dwarf_decode_line_header): Pass compilation header in call to
read_initial_length.
2005-02-24 Andrew Cagney <cagney@gnu.org> 2005-02-24 Andrew Cagney <cagney@gnu.org>
Add show_VARIABLE functions, update add_setshow call. Add show_VARIABLE functions, update add_setshow call.

View File

@ -1542,6 +1542,9 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
also happen.) This happens in VxWorks. */ also happen.) This happens in VxWorks. */
free_named_symtabs (pst->filename); free_named_symtabs (pst->filename);
info_ptr = beg_of_comp_unit + cu.header.length
+ cu.header.initial_length_size;
if (comp_unit_die.has_stmt_list) if (comp_unit_die.has_stmt_list)
{ {
/* Get the list of files included in the current compilation unit, /* Get the list of files included in the current compilation unit,
@ -1549,9 +1552,6 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
dwarf2_build_include_psymtabs (&cu, &comp_unit_die, pst); dwarf2_build_include_psymtabs (&cu, &comp_unit_die, pst);
} }
info_ptr = beg_of_comp_unit + cu.header.length
+ cu.header.initial_length_size;
do_cleanups (back_to_inner); do_cleanups (back_to_inner);
} }
do_cleanups (back_to); do_cleanups (back_to);
@ -1641,6 +1641,7 @@ create_all_comp_units (struct objfile *objfile)
/* Read just enough information to find out where the next /* Read just enough information to find out where the next
compilation unit is. */ compilation unit is. */
cu_header.initial_length_size = 0;
cu_header.length = read_initial_length (objfile->obfd, info_ptr, cu_header.length = read_initial_length (objfile->obfd, info_ptr,
&cu_header, &bytes_read); &cu_header, &bytes_read);
@ -5860,7 +5861,7 @@ read_address (bfd *abfd, char *buf, struct dwarf2_cu *cu, int *bytes_read)
As a side effect, this function sets the fields initial_length_size As a side effect, this function sets the fields initial_length_size
and offset_size in cu_header to the values appropriate for the and offset_size in cu_header to the values appropriate for the
length field. (The format of the initial length field determines length field. (The format of the initial length field determines
the width of file offsets to be fetched later with fetch_offset().) the width of file offsets to be fetched later with read_offset().)
[ Note: read_initial_length() and read_offset() are based on the [ Note: read_initial_length() and read_offset() are based on the
document entitled "DWARF Debugging Information Format", revision document entitled "DWARF Debugging Information Format", revision
@ -5882,43 +5883,41 @@ static LONGEST
read_initial_length (bfd *abfd, char *buf, struct comp_unit_head *cu_header, read_initial_length (bfd *abfd, char *buf, struct comp_unit_head *cu_header,
int *bytes_read) int *bytes_read)
{ {
LONGEST retval = 0; LONGEST length = bfd_get_32 (abfd, (bfd_byte *) buf);
retval = bfd_get_32 (abfd, (bfd_byte *) buf); if (length == 0xffffffff)
if (retval == 0xffffffff)
{ {
retval = bfd_get_64 (abfd, (bfd_byte *) buf + 4); length = bfd_get_64 (abfd, (bfd_byte *) buf + 4);
*bytes_read = 12; *bytes_read = 12;
if (cu_header != NULL)
{
cu_header->initial_length_size = 12;
cu_header->offset_size = 8;
} }
} else if (length == 0)
else if (retval == 0)
{ {
/* Handle (non-standard) 64-bit DWARF2 formats such as that used /* Handle the (non-standard) 64-bit DWARF2 format used by IRIX. */
by IRIX. */ length = bfd_get_64 (abfd, (bfd_byte *) buf);
retval = bfd_get_64 (abfd, (bfd_byte *) buf);
*bytes_read = 8; *bytes_read = 8;
if (cu_header != NULL)
{
cu_header->initial_length_size = 8;
cu_header->offset_size = 8;
}
} }
else else
{ {
*bytes_read = 4; *bytes_read = 4;
if (cu_header != NULL)
{
cu_header->initial_length_size = 4;
cu_header->offset_size = 4;
}
} }
return retval; if (cu_header)
{
gdb_assert (cu_header->initial_length_size == 0
|| cu_header->initial_length_size == 4
|| cu_header->initial_length_size == 8
|| cu_header->initial_length_size == 12);
if (cu_header->initial_length_size != 0
&& cu_header->initial_length_size != *bytes_read)
complaint (&symfile_complaints,
_("intermixed 32-bit and 64-bit DWARF sections"));
cu_header->initial_length_size = *bytes_read;
cu_header->offset_size = (*bytes_read == 4) ? 4 : 8;
}
return length;
} }
/* Read an offset from the data stream. The size of the offset is /* Read an offset from the data stream. The size of the offset is
@ -6296,7 +6295,8 @@ dwarf_decode_line_header (unsigned int offset, bfd *abfd,
line_ptr = dwarf2_per_objfile->line_buffer + offset; line_ptr = dwarf2_per_objfile->line_buffer + offset;
/* Read in the header. */ /* Read in the header. */
lh->total_length = read_initial_length (abfd, line_ptr, NULL, &bytes_read); lh->total_length =
read_initial_length (abfd, line_ptr, &cu->header, &bytes_read);
line_ptr += bytes_read; line_ptr += bytes_read;
if (line_ptr + lh->total_length > (dwarf2_per_objfile->line_buffer if (line_ptr + lh->total_length > (dwarf2_per_objfile->line_buffer
+ dwarf2_per_objfile->line_size)) + dwarf2_per_objfile->line_size))