PR gdb/13498:
* dwarf2read.c (dw2_expand_symtabs_matching): Only visit a particular set of file names once. (dw2_map_symbol_filenames): Likewise.
This commit is contained in:
parent
854ac8ba3b
commit
24c79950cf
|
@ -1,3 +1,10 @@
|
||||||
|
2012-02-20 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
|
PR gdb/13498:
|
||||||
|
* dwarf2read.c (dw2_expand_symtabs_matching): Only visit a
|
||||||
|
particular set of file names once.
|
||||||
|
(dw2_map_symbol_filenames): Likewise.
|
||||||
|
|
||||||
2012-02-20 Jan Kratochvil <jan.kratochvil@redhat.com>
|
2012-02-20 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
Code cleanup.
|
Code cleanup.
|
||||||
|
|
105
gdb/dwarf2read.c
105
gdb/dwarf2read.c
|
@ -2700,32 +2700,63 @@ dw2_expand_symtabs_matching
|
||||||
index = dwarf2_per_objfile->index_table;
|
index = dwarf2_per_objfile->index_table;
|
||||||
|
|
||||||
if (file_matcher != NULL)
|
if (file_matcher != NULL)
|
||||||
for (i = 0; i < (dwarf2_per_objfile->n_comp_units
|
{
|
||||||
+ dwarf2_per_objfile->n_type_units); ++i)
|
struct cleanup *cleanup;
|
||||||
{
|
htab_t visited_found, visited_not_found;
|
||||||
int j;
|
|
||||||
struct dwarf2_per_cu_data *per_cu = dw2_get_cu (i);
|
|
||||||
struct quick_file_names *file_data;
|
|
||||||
|
|
||||||
per_cu->v.quick->mark = 0;
|
visited_found = htab_create_alloc (10,
|
||||||
|
htab_hash_pointer, htab_eq_pointer,
|
||||||
|
NULL, xcalloc, xfree);
|
||||||
|
cleanup = make_cleanup_htab_delete (visited_found);
|
||||||
|
visited_not_found = htab_create_alloc (10,
|
||||||
|
htab_hash_pointer, htab_eq_pointer,
|
||||||
|
NULL, xcalloc, xfree);
|
||||||
|
make_cleanup_htab_delete (visited_not_found);
|
||||||
|
|
||||||
/* We only need to look at symtabs not already expanded. */
|
for (i = 0; i < (dwarf2_per_objfile->n_comp_units
|
||||||
if (per_cu->v.quick->symtab)
|
+ dwarf2_per_objfile->n_type_units); ++i)
|
||||||
continue;
|
{
|
||||||
|
int j;
|
||||||
|
struct dwarf2_per_cu_data *per_cu = dw2_get_cu (i);
|
||||||
|
struct quick_file_names *file_data;
|
||||||
|
void **slot;
|
||||||
|
|
||||||
file_data = dw2_get_file_names (objfile, per_cu);
|
per_cu->v.quick->mark = 0;
|
||||||
if (file_data == NULL)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
for (j = 0; j < file_data->num_file_names; ++j)
|
/* We only need to look at symtabs not already expanded. */
|
||||||
{
|
if (per_cu->v.quick->symtab)
|
||||||
if (file_matcher (file_data->file_names[j], data))
|
continue;
|
||||||
{
|
|
||||||
per_cu->v.quick->mark = 1;
|
file_data = dw2_get_file_names (objfile, per_cu);
|
||||||
break;
|
if (file_data == NULL)
|
||||||
}
|
continue;
|
||||||
}
|
|
||||||
}
|
if (htab_find (visited_not_found, file_data) != NULL)
|
||||||
|
continue;
|
||||||
|
else if (htab_find (visited_found, file_data) != NULL)
|
||||||
|
{
|
||||||
|
per_cu->v.quick->mark = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0; j < file_data->num_file_names; ++j)
|
||||||
|
{
|
||||||
|
if (file_matcher (file_data->file_names[j], data))
|
||||||
|
{
|
||||||
|
per_cu->v.quick->mark = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
slot = htab_find_slot (per_cu->v.quick->mark
|
||||||
|
? visited_found
|
||||||
|
: visited_not_found,
|
||||||
|
file_data, INSERT);
|
||||||
|
*slot = file_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
do_cleanups (cleanup);
|
||||||
|
}
|
||||||
|
|
||||||
for (iter = 0; iter < index->symbol_table_slots; ++iter)
|
for (iter = 0; iter < index->symbol_table_slots; ++iter)
|
||||||
{
|
{
|
||||||
|
@ -2787,15 +2818,35 @@ dw2_map_symbol_filenames (struct objfile *objfile, symbol_filename_ftype *fun,
|
||||||
void *data, int need_fullname)
|
void *data, int need_fullname)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
struct cleanup *cleanup;
|
||||||
|
htab_t visited = htab_create_alloc (10, htab_hash_pointer, htab_eq_pointer,
|
||||||
|
NULL, xcalloc, xfree);
|
||||||
|
|
||||||
|
cleanup = make_cleanup_htab_delete (visited);
|
||||||
dw2_setup (objfile);
|
dw2_setup (objfile);
|
||||||
|
|
||||||
|
/* We can ignore file names coming from already-expanded CUs. */
|
||||||
|
for (i = 0; i < (dwarf2_per_objfile->n_comp_units
|
||||||
|
+ dwarf2_per_objfile->n_type_units); ++i)
|
||||||
|
{
|
||||||
|
struct dwarf2_per_cu_data *per_cu = dw2_get_cu (i);
|
||||||
|
|
||||||
|
if (per_cu->v.quick->symtab)
|
||||||
|
{
|
||||||
|
void **slot = htab_find_slot (visited, per_cu->v.quick->file_names,
|
||||||
|
INSERT);
|
||||||
|
|
||||||
|
*slot = per_cu->v.quick->file_names;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < (dwarf2_per_objfile->n_comp_units
|
for (i = 0; i < (dwarf2_per_objfile->n_comp_units
|
||||||
+ dwarf2_per_objfile->n_type_units); ++i)
|
+ dwarf2_per_objfile->n_type_units); ++i)
|
||||||
{
|
{
|
||||||
int j;
|
int j;
|
||||||
struct dwarf2_per_cu_data *per_cu = dw2_get_cu (i);
|
struct dwarf2_per_cu_data *per_cu = dw2_get_cu (i);
|
||||||
struct quick_file_names *file_data;
|
struct quick_file_names *file_data;
|
||||||
|
void **slot;
|
||||||
|
|
||||||
/* We only need to look at symtabs not already expanded. */
|
/* We only need to look at symtabs not already expanded. */
|
||||||
if (per_cu->v.quick->symtab)
|
if (per_cu->v.quick->symtab)
|
||||||
|
@ -2805,6 +2856,14 @@ dw2_map_symbol_filenames (struct objfile *objfile, symbol_filename_ftype *fun,
|
||||||
if (file_data == NULL)
|
if (file_data == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
slot = htab_find_slot (visited, file_data, INSERT);
|
||||||
|
if (*slot)
|
||||||
|
{
|
||||||
|
/* Already visited. */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
*slot = file_data;
|
||||||
|
|
||||||
for (j = 0; j < file_data->num_file_names; ++j)
|
for (j = 0; j < file_data->num_file_names; ++j)
|
||||||
{
|
{
|
||||||
const char *this_real_name;
|
const char *this_real_name;
|
||||||
|
@ -2816,6 +2875,8 @@ dw2_map_symbol_filenames (struct objfile *objfile, symbol_filename_ftype *fun,
|
||||||
(*fun) (file_data->file_names[j], this_real_name, data);
|
(*fun) (file_data->file_names[j], this_real_name, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do_cleanups (cleanup);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
Loading…
Reference in New Issue