Work around binutils/15021.

* dwarf2read.c (dwarf2_per_cu_data): Split imported_symtabs and
	type_unit_group out of union s.  All uses updated.
	(read_index_from_section): Watch for index version 8.
	(follow_die_sig): If using .gdb_index version <= 7, record the TU as
	an imported symtab.
	(write_psymtabs_to_index): Increment version number to 8.

	doc/
	* gdb.texinfo (Index Section Format): Document .gdb_index version 8.
This commit is contained in:
Doug Evans 2013-01-23 18:47:51 +00:00
parent f5c66ab0f8
commit 796a7ff823
4 changed files with 89 additions and 39 deletions

View File

@ -1,3 +1,13 @@
2013-01-23 Doug Evans <dje@google.com>
Work around binutils/15021.
* dwarf2read.c (dwarf2_per_cu_data): Split imported_symtabs and
type_unit_group out of union s. All uses updated.
(read_index_from_section): Watch for index version 8.
(follow_die_sig): If using .gdb_index version <= 7, record the TU as
an imported symtab.
(write_psymtabs_to_index): Increment version number to 8.
2013-01-22 Pedro Alves <palves@redhat.com> 2013-01-22 Pedro Alves <palves@redhat.com>
* annotate.c (breakpoint_changed): Skip if breakpoint is not * annotate.c (breakpoint_changed): Skip if breakpoint is not

View File

@ -1,3 +1,7 @@
2013-01-23 Doug Evans <dje@google.com>
* gdb.texinfo (Index Section Format): Document .gdb_index version 8.
2013-01-21 Marc Khouzam <marc.khouzam@ericsson.com> 2013-01-21 Marc Khouzam <marc.khouzam@ericsson.com>
* gdb.texinfo (GDB/MI Breakpoint Commands): Document new * gdb.texinfo (GDB/MI Breakpoint Commands): Document new

View File

@ -41050,12 +41050,18 @@ unless otherwise noted:
@enumerate @enumerate
@item @item
The version number, currently 7. Versions 1, 2 and 3 are obsolete. The version number, currently 8. Versions 1, 2 and 3 are obsolete.
Version 4 uses a different hashing function from versions 5 and 6. Version 4 uses a different hashing function from versions 5 and 6.
Version 6 includes symbols for inlined functions, whereas versions 4 Version 6 includes symbols for inlined functions, whereas versions 4
and 5 do not. Version 7 adds attributes to the CU indices in the and 5 do not. Version 7 adds attributes to the CU indices in the
symbol table. @value{GDBN} will only read version 4, 5, or 6 indices symbol table. Version 8 specifies that symbols from DWARF type units
(@samp{DW_TAG_type_unit}) refer to the type unit's symbol table and not the
compilation unit (@samp{DW_TAG_comp_unit}) using the type.
@value{GDBN} will only read version 4, 5, or 6 indices
by specifying @code{set use-deprecated-index-sections on}. by specifying @code{set use-deprecated-index-sections on}.
GDB has a workaround for potentially broken version 7 indices so it is
currently not flagged as deprecated.
@item @item
The offset, from the start of the file, of the CU list. The offset, from the start of the file, of the CU list.

View File

@ -566,19 +566,29 @@ struct dwarf2_per_cu_data
struct dwarf2_per_cu_quick_data *quick; struct dwarf2_per_cu_quick_data *quick;
} v; } v;
union /* The CUs we import using DW_TAG_imported_unit. This is filled in
{ while reading psymtabs, used to compute the psymtab dependencies,
/* The CUs we import using DW_TAG_imported_unit. This is filled in and then cleared. Then it is filled in again while reading full
while reading psymtabs, used to compute the psymtab dependencies, symbols, and only deleted when the objfile is destroyed.
and then cleared. Then it is filled in again while reading full
symbols, and only deleted when the objfile is destroyed. */
VEC (dwarf2_per_cu_ptr) *imported_symtabs;
/* Type units are grouped by their DW_AT_stmt_list entry so that they This is also used to work around a difference between the way gold
can share them. If this is a TU, this points to the containing generates .gdb_index version <=7 and the way gdb does. Arguably this
symtab. */ is a gold bug. For symbols coming from TUs, gold records in the index
struct type_unit_group *type_unit_group; the CU that includes the TU instead of the TU itself. This breaks
} s; dw2_lookup_symbol: It assumes that if the index says symbol X lives
in CU/TU Y, then one need only expand Y and a subsequent lookup in Y
will find X. Alas TUs live in their own symtab, so after expanding CU Y
we need to look in TU Z to find X. Fortunately, this is akin to
DW_TAG_imported_unit, so we just use the same mechanism: For
.gdb_index version <=7 this also records the TUs that the CU referred
to. Concurrently with this change gdb was modified to emit version 8
indices so we only pay a price for gold generated indices. */
VEC (dwarf2_per_cu_ptr) *imported_symtabs;
/* Type units are grouped by their DW_AT_stmt_list entry so that they
can share them. If this is a TU, this points to the containing
symtab. */
struct type_unit_group *type_unit_group;
}; };
/* Entry in the signatured_types hash table. */ /* Entry in the signatured_types hash table. */
@ -2690,9 +2700,14 @@ to use the section anyway."),
} }
return 0; return 0;
} }
/* Version 7 indices generated by gold refer to the CU for a symbol instead
of the TU (for symbols coming from TUs). It's just a performance bug, and
we can't distinguish gdb-generated indices from gold-generated ones, so
nothing to do here. */
/* Indexes with higher version than the one supported by GDB may be no /* Indexes with higher version than the one supported by GDB may be no
longer backward compatible. */ longer backward compatible. */
if (version > 7) if (version > 8)
return 0; return 0;
map->version = version; map->version = version;
@ -2929,7 +2944,7 @@ dw2_get_file_names (struct objfile *objfile,
DWO file. */ DWO file. */
if (this_cu->is_debug_types) if (this_cu->is_debug_types)
{ {
struct type_unit_group *tu_group = this_cu->s.type_unit_group; struct type_unit_group *tu_group = this_cu->type_unit_group;
init_cutu_and_read_dies (tu_group->t.first_tu, NULL, 0, 0, init_cutu_and_read_dies (tu_group->t.first_tu, NULL, 0, 0,
dw2_get_file_names_reader, tu_group); dw2_get_file_names_reader, tu_group);
@ -4959,10 +4974,10 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
(objfile->static_psymbols.list + pst->statics_offset); (objfile->static_psymbols.list + pst->statics_offset);
sort_pst_symbols (objfile, pst); sort_pst_symbols (objfile, pst);
if (!VEC_empty (dwarf2_per_cu_ptr, cu->per_cu->s.imported_symtabs)) if (!VEC_empty (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs))
{ {
int i; int i;
int len = VEC_length (dwarf2_per_cu_ptr, cu->per_cu->s.imported_symtabs); int len = VEC_length (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs);
struct dwarf2_per_cu_data *iter; struct dwarf2_per_cu_data *iter;
/* Fill in 'dependencies' here; we fill in 'users' in a /* Fill in 'dependencies' here; we fill in 'users' in a
@ -4971,12 +4986,12 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
pst->dependencies = obstack_alloc (&objfile->objfile_obstack, pst->dependencies = obstack_alloc (&objfile->objfile_obstack,
len * sizeof (struct symtab *)); len * sizeof (struct symtab *));
for (i = 0; for (i = 0;
VEC_iterate (dwarf2_per_cu_ptr, cu->per_cu->s.imported_symtabs, VEC_iterate (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs,
i, iter); i, iter);
++i) ++i)
pst->dependencies[i] = iter->v.psymtab; pst->dependencies[i] = iter->v.psymtab;
VEC_free (dwarf2_per_cu_ptr, cu->per_cu->s.imported_symtabs); VEC_free (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs);
} }
/* Get the list of files included in the current compilation unit, /* Get the list of files included in the current compilation unit,
@ -5074,7 +5089,7 @@ create_type_unit_group (struct dwarf2_cu *cu, sect_offset line_offset_struct)
per_cu = &tu_group->per_cu; per_cu = &tu_group->per_cu;
per_cu->objfile = objfile; per_cu->objfile = objfile;
per_cu->is_debug_types = 1; per_cu->is_debug_types = 1;
per_cu->s.type_unit_group = tu_group; per_cu->type_unit_group = tu_group;
if (dwarf2_per_objfile->using_index) if (dwarf2_per_objfile->using_index)
{ {
@ -5411,7 +5426,7 @@ build_type_psymtab_dependencies (void **slot, void *info)
++i) ++i)
{ {
pst->dependencies[i] = iter->v.psymtab; pst->dependencies[i] = iter->v.psymtab;
iter->s.type_unit_group = tu_group; iter->type_unit_group = tu_group;
} }
VEC_free (dwarf2_per_cu_ptr, tu_group->t.tus); VEC_free (dwarf2_per_cu_ptr, tu_group->t.tus);
@ -5732,7 +5747,7 @@ scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc,
process_psymtab_comp_unit (per_cu, 1); process_psymtab_comp_unit (per_cu, 1);
VEC_safe_push (dwarf2_per_cu_ptr, VEC_safe_push (dwarf2_per_cu_ptr,
cu->per_cu->s.imported_symtabs, per_cu); cu->per_cu->imported_symtabs, per_cu);
} }
break; break;
default: default:
@ -6866,7 +6881,7 @@ recursively_compute_inclusions (VEC (dwarf2_per_cu_ptr) **result,
VEC_safe_push (dwarf2_per_cu_ptr, *result, per_cu); VEC_safe_push (dwarf2_per_cu_ptr, *result, per_cu);
for (ix = 0; for (ix = 0;
VEC_iterate (dwarf2_per_cu_ptr, per_cu->s.imported_symtabs, ix, iter); VEC_iterate (dwarf2_per_cu_ptr, per_cu->imported_symtabs, ix, iter);
++ix) ++ix)
recursively_compute_inclusions (result, all_children, iter); recursively_compute_inclusions (result, all_children, iter);
} }
@ -6879,7 +6894,7 @@ compute_symtab_includes (struct dwarf2_per_cu_data *per_cu)
{ {
gdb_assert (! per_cu->is_debug_types); gdb_assert (! per_cu->is_debug_types);
if (!VEC_empty (dwarf2_per_cu_ptr, per_cu->s.imported_symtabs)) if (!VEC_empty (dwarf2_per_cu_ptr, per_cu->imported_symtabs))
{ {
int ix, len; int ix, len;
struct dwarf2_per_cu_data *iter; struct dwarf2_per_cu_data *iter;
@ -6895,13 +6910,14 @@ compute_symtab_includes (struct dwarf2_per_cu_data *per_cu)
NULL, xcalloc, xfree); NULL, xcalloc, xfree);
for (ix = 0; for (ix = 0;
VEC_iterate (dwarf2_per_cu_ptr, per_cu->s.imported_symtabs, VEC_iterate (dwarf2_per_cu_ptr, per_cu->imported_symtabs,
ix, iter); ix, iter);
++ix) ++ix)
recursively_compute_inclusions (&result_children, all_children, iter); recursively_compute_inclusions (&result_children, all_children, iter);
/* Now we have a transitive closure of all the included CUs, so /* Now we have a transitive closure of all the included CUs, and
we can convert it to a list of symtabs. */ for .gdb_index version 7 the included TUs, so we can convert it
to a list of symtabs. */
len = VEC_length (dwarf2_per_cu_ptr, result_children); len = VEC_length (dwarf2_per_cu_ptr, result_children);
symtab->includes symtab->includes
= obstack_alloc (&dwarf2_per_objfile->objfile->objfile_obstack, = obstack_alloc (&dwarf2_per_objfile->objfile->objfile_obstack,
@ -6984,7 +7000,7 @@ process_full_comp_unit (struct dwarf2_per_cu_data *per_cu,
static_block static_block
= end_symtab_get_static_block (highpc + baseaddr, objfile, 0, = end_symtab_get_static_block (highpc + baseaddr, objfile, 0,
per_cu->s.imported_symtabs != NULL); per_cu->imported_symtabs != NULL);
/* If the comp unit has DW_AT_ranges, it may have discontiguous ranges. /* If the comp unit has DW_AT_ranges, it may have discontiguous ranges.
Also, DW_AT_ranges may record ranges not belonging to any child DIEs Also, DW_AT_ranges may record ranges not belonging to any child DIEs
@ -7080,10 +7096,10 @@ process_full_type_unit (struct dwarf2_per_cu_data *per_cu,
If this is the first TU to use this symtab, complete the construction If this is the first TU to use this symtab, complete the construction
of it with end_expandable_symtab. Otherwise, complete the addition of of it with end_expandable_symtab. Otherwise, complete the addition of
this TU's symbols to the existing symtab. */ this TU's symbols to the existing symtab. */
if (per_cu->s.type_unit_group->primary_symtab == NULL) if (per_cu->type_unit_group->primary_symtab == NULL)
{ {
symtab = end_expandable_symtab (0, objfile, SECT_OFF_TEXT (objfile)); symtab = end_expandable_symtab (0, objfile, SECT_OFF_TEXT (objfile));
per_cu->s.type_unit_group->primary_symtab = symtab; per_cu->type_unit_group->primary_symtab = symtab;
if (symtab != NULL) if (symtab != NULL)
{ {
@ -7098,8 +7114,8 @@ process_full_type_unit (struct dwarf2_per_cu_data *per_cu,
else else
{ {
augment_type_symtab (objfile, augment_type_symtab (objfile,
per_cu->s.type_unit_group->primary_symtab); per_cu->type_unit_group->primary_symtab);
symtab = per_cu->s.type_unit_group->primary_symtab; symtab = per_cu->type_unit_group->primary_symtab;
} }
if (dwarf2_per_objfile->using_index) if (dwarf2_per_objfile->using_index)
@ -7145,7 +7161,7 @@ process_imported_unit_die (struct die_info *die, struct dwarf2_cu *cu)
if (maybe_queue_comp_unit (cu, per_cu, cu->language)) if (maybe_queue_comp_unit (cu, per_cu, cu->language))
load_full_comp_unit (per_cu, cu->language); load_full_comp_unit (per_cu, cu->language);
VEC_safe_push (dwarf2_per_cu_ptr, cu->per_cu->s.imported_symtabs, VEC_safe_push (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs,
per_cu); per_cu);
} }
} }
@ -8036,9 +8052,9 @@ setup_type_unit_groups (struct die_info *die, struct dwarf2_cu *cu)
/* If we're using .gdb_index (includes -readnow) then /* If we're using .gdb_index (includes -readnow) then
per_cu->s.type_unit_group may not have been set up yet. */ per_cu->s.type_unit_group may not have been set up yet. */
if (per_cu->s.type_unit_group == NULL) if (per_cu->type_unit_group == NULL)
per_cu->s.type_unit_group = get_type_unit_group (cu, attr); per_cu->type_unit_group = get_type_unit_group (cu, attr);
tu_group = per_cu->s.type_unit_group; tu_group = per_cu->type_unit_group;
/* If we've already processed this stmt_list there's no real need to /* If we've already processed this stmt_list there's no real need to
do it again, we could fake it and just recreate the part we need do it again, we could fake it and just recreate the part we need
@ -17588,6 +17604,16 @@ follow_die_sig (struct die_info *src_die, struct attribute *attr,
temp_die.offset.sect_off); temp_die.offset.sect_off);
if (die) if (die)
{ {
/* For .gdb_index version 7 keep track of included TUs.
http://sourceware.org/bugzilla/show_bug.cgi?id=15021. */
if (dwarf2_per_objfile->index_table != NULL
&& dwarf2_per_objfile->index_table->version <= 7)
{
VEC_safe_push (dwarf2_per_cu_ptr,
(*ref_cu)->per_cu->imported_symtabs,
sig_cu->per_cu);
}
*ref_cu = sig_cu; *ref_cu = sig_cu;
return die; return die;
} }
@ -19638,7 +19664,11 @@ dwarf2_per_objfile_free (struct objfile *objfile, void *d)
for (ix = 0; ix < dwarf2_per_objfile->n_comp_units; ++ix) for (ix = 0; ix < dwarf2_per_objfile->n_comp_units; ++ix)
VEC_free (dwarf2_per_cu_ptr, VEC_free (dwarf2_per_cu_ptr,
dwarf2_per_objfile->all_comp_units[ix]->s.imported_symtabs); dwarf2_per_objfile->all_comp_units[ix]->imported_symtabs);
for (ix = 0; ix < dwarf2_per_objfile->n_type_units; ++ix)
VEC_free (dwarf2_per_cu_ptr,
dwarf2_per_objfile->all_type_units[ix]->per_cu.imported_symtabs);
VEC_free (dwarf2_section_info_def, data->types); VEC_free (dwarf2_section_info_def, data->types);
@ -20460,7 +20490,7 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir)
total_len = size_of_contents; total_len = size_of_contents;
/* The version number. */ /* The version number. */
val = MAYBE_SWAP (7); val = MAYBE_SWAP (8);
obstack_grow (&contents, &val, sizeof (val)); obstack_grow (&contents, &val, sizeof (val));
/* The offset of the CU list from the start of the file. */ /* The offset of the CU list from the start of the file. */