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:
parent
f5c66ab0f8
commit
796a7ff823
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
104
gdb/dwarf2read.c
104
gdb/dwarf2read.c
|
@ -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. */
|
||||||
|
|
Loading…
Reference in New Issue