This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: Regression for .debug_types [Re: [patch] Allow dummy CUs created by incremental linker]
> I did not debug it yet but it is a regression for many testcases iff
> .debug_types are used.
Sorry, this patch fixes the problem. In process_psymtab_comp_unit, if
it was scanning a type unit, it was adjusting the info_ptr after my
check for a 0 abbrev code. It turns out that first_die_offset is also
set too early, so I moved the adjustment into
partial_read_comp_unit_head. Running the tests now, with -gdwarf4
explicitly turned on.
-cary
2011-10-20 Cary Coutant <ccoutant@google.com>
* dwarf2read.c (dw2_get_file_names): Move adjustment for type
section to...
(partial_read_comp_unit_head): ...here. Add is_debug_type_section
flag. Adjust all callers.
(process_psymtab_comp_unit): Remove adjustment for type section.
Index: dwarf2read.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2read.c,v
retrieving revision 1.576
diff -u -p -r1.576 dwarf2read.c
--- dwarf2read.c 20 Oct 2011 01:11:34 -0000 1.576
+++ dwarf2read.c 20 Oct 2011 18:40:54 -0000
@@ -1336,7 +1336,8 @@ static gdb_byte *partial_read_comp_unit_
gdb_byte *info_ptr,
gdb_byte *buffer,
unsigned int buffer_size,
- bfd *abfd);
+ bfd *abfd,
+ int is_debug_type_section);
static void init_cu_die_reader (struct die_reader_specs *reader,
struct dwarf2_cu *cu);
@@ -2307,7 +2308,8 @@ dw2_get_file_names (struct objfile *objf
info_ptr = partial_read_comp_unit_head (&cu.header, info_ptr,
buffer, buffer_size,
- abfd);
+ abfd,
+ this_cu->debug_type_section != NULL);
/* Skip dummy compilation units. */
if (info_ptr >= buffer + buffer_size
@@ -2323,8 +2325,6 @@ dw2_get_file_names (struct objfile *objf
dwarf2_read_abbrevs (abfd, &cu);
make_cleanup (dwarf2_free_abbrev_table, &cu);
- if (this_cu->debug_type_section)
- info_ptr += 8 /*signature*/ + cu.header.offset_size;
init_cu_die_reader (&reader_specs, &cu);
read_full_die (&reader_specs, &comp_unit_die, info_ptr,
&has_children);
@@ -2971,7 +2971,7 @@ read_comp_unit_head (struct comp_unit_he
static gdb_byte *
partial_read_comp_unit_head (struct comp_unit_head *header, gdb_byte *info_ptr,
gdb_byte *buffer, unsigned int buffer_size,
- bfd *abfd)
+ bfd *abfd, int is_debug_type_section)
{
gdb_byte *beg_of_comp_unit = info_ptr;
@@ -2979,6 +2979,11 @@ partial_read_comp_unit_head (struct comp
info_ptr = read_comp_unit_head (header, info_ptr, abfd);
+ /* If we're reading a type unit, skip over the signature and
+ type_offset fields. */
+ if (is_debug_type_section)
+ info_ptr += 8 /*signature*/ + header->offset_size;
+
header->first_die_offset = info_ptr - beg_of_comp_unit;
if (header->version != 2 && header->version != 3 && header->version != 4)
@@ -3372,7 +3377,8 @@ process_psymtab_comp_unit (struct objfil
info_ptr = partial_read_comp_unit_head (&cu.header, info_ptr,
buffer, buffer_size,
- abfd);
+ abfd,
+ this_cu->debug_type_section != NULL);
/* Skip dummy compilation units. */
if (info_ptr >= buffer + buffer_size
@@ -3407,8 +3413,6 @@ process_psymtab_comp_unit (struct objfil
make_cleanup (dwarf2_free_abbrev_table, &cu);
/* Read the compilation unit die. */
- if (this_cu->debug_type_section)
- info_ptr += 8 /*signature*/ + cu.header.offset_size;
init_cu_die_reader (&reader_specs, &cu);
info_ptr = read_full_die (&reader_specs, &comp_unit_die, info_ptr,
&has_children);
@@ -3670,7 +3674,7 @@ load_partial_comp_unit (struct dwarf2_pe
info_ptr = partial_read_comp_unit_head (&cu->header, info_ptr,
dwarf2_per_objfile->info.buffer,
dwarf2_per_objfile->info.size,
- abfd);
+ abfd, 0);
/* Skip dummy compilation units. */
if (info_ptr >= (dwarf2_per_objfile->info.buffer