Refactor: Move some generic code out of .gdb_index code

Preparation for the next patch.

gdb/ChangeLog
2017-12-08  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* dwarf2read.c (create_cu_from_index_list): New from ...
	(create_cus_from_index_list): ... this function, use it.
	(dw_expand_symtabs_matching_file_matcher)
	(dw2_expand_symtabs_matching_one): New from ...
	(dw2_expand_symtabs_matching): ... this function, use them.
This commit is contained in:
Jan Kratochvil
2017-12-08 22:44:11 +00:00
committed by Pedro Alves
parent abccd1e7b7
commit 4b514bc808
2 changed files with 142 additions and 92 deletions

View File

@ -1,3 +1,11 @@
2017-12-08 Jan Kratochvil <jan.kratochvil@redhat.com>
* dwarf2read.c (create_cu_from_index_list): New from ...
(create_cus_from_index_list): ... this function, use it.
(dw_expand_symtabs_matching_file_matcher)
(dw2_expand_symtabs_matching_one): New from ...
(dw2_expand_symtabs_matching): ... this function, use them.
2017-12-08 Jan Kratochvil <jan.kratochvil@redhat.com> 2017-12-08 Jan Kratochvil <jan.kratochvil@redhat.com>
* defs.h (elf_sym_fns_lazy_psyms, elf_sym_fns_gdb_index): Move here * defs.h (elf_sym_fns_lazy_psyms, elf_sym_fns_gdb_index): Move here

View File

@ -3061,6 +3061,29 @@ dw2_get_cu (int index)
return dwarf2_per_objfile->all_comp_units[index]; return dwarf2_per_objfile->all_comp_units[index];
} }
/* Return a new dwarf2_per_cu_data allocated on OBJFILE's
objfile_obstack, and constructed with the specified field
values. */
static dwarf2_per_cu_data *
create_cu_from_index_list (struct objfile *objfile,
struct dwarf2_section_info *section,
int is_dwz,
sect_offset sect_off, ULONGEST length)
{
dwarf2_per_cu_data *the_cu
= OBSTACK_ZALLOC (&objfile->objfile_obstack,
struct dwarf2_per_cu_data);
the_cu->sect_off = sect_off;
the_cu->length = length;
the_cu->objfile = objfile;
the_cu->section = section;
the_cu->v.quick = OBSTACK_ZALLOC (&objfile->objfile_obstack,
struct dwarf2_per_cu_quick_data);
the_cu->is_dwz = is_dwz;
return the_cu;
}
/* A helper for create_cus_from_index that handles a given list of /* A helper for create_cus_from_index that handles a given list of
CUs. */ CUs. */
@ -3082,17 +3105,8 @@ create_cus_from_index_list (struct objfile *objfile,
ULONGEST length = extract_unsigned_integer (cu_list + 8, 8, BFD_ENDIAN_LITTLE); ULONGEST length = extract_unsigned_integer (cu_list + 8, 8, BFD_ENDIAN_LITTLE);
cu_list += 2 * 8; cu_list += 2 * 8;
dwarf2_per_cu_data *the_cu dwarf2_per_objfile->all_comp_units[base_offset + i / 2]
= OBSTACK_ZALLOC (&objfile->objfile_obstack, = create_cu_from_index_list (objfile, section, is_dwz, sect_off, length);
struct dwarf2_per_cu_data);
the_cu->sect_off = sect_off;
the_cu->length = length;
the_cu->objfile = objfile;
the_cu->section = section;
the_cu->v.quick = OBSTACK_ZALLOC (&objfile->objfile_obstack,
struct dwarf2_per_cu_quick_data);
the_cu->is_dwz = is_dwz;
dwarf2_per_objfile->all_comp_units[base_offset + i / 2] = the_cu;
} }
} }
@ -4939,6 +4953,31 @@ run_test ()
#endif /* GDB_SELF_TEST */ #endif /* GDB_SELF_TEST */
/* If FILE_MATCHER is NULL or if PER_CU has
dwarf2_per_cu_quick_data::MARK set (see
dw_expand_symtabs_matching_file_matcher), expand the CU and call
EXPANSION_NOTIFY on it. */
static void
dw2_expand_symtabs_matching_one
(struct dwarf2_per_cu_data *per_cu,
gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher,
gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify)
{
if (file_matcher == NULL || per_cu->v.quick->mark)
{
bool symtab_was_null
= (per_cu->v.quick->compunit_symtab == NULL);
dw2_instantiate_symtab (per_cu);
if (expansion_notify != NULL
&& symtab_was_null
&& per_cu->v.quick->compunit_symtab != NULL)
expansion_notify (per_cu->v.quick->compunit_symtab);
}
}
/* Helper for dw2_expand_matching symtabs. Called on each symbol /* Helper for dw2_expand_matching symtabs. Called on each symbol
matched, to expand corresponding CUs that were marked. IDX is the matched, to expand corresponding CUs that were marked. IDX is the
index of the symbol name that matched. */ index of the symbol name that matched. */
@ -5016,18 +5055,91 @@ dw2_expand_marked_cus
} }
per_cu = dw2_get_cutu (cu_index); per_cu = dw2_get_cutu (cu_index);
if (file_matcher == NULL || per_cu->v.quick->mark) dw2_expand_symtabs_matching_one (per_cu, file_matcher,
expansion_notify);
}
}
/* If FILE_MATCHER is non-NULL, set all the
dwarf2_per_cu_quick_data::MARK of the current DWARF2_PER_OBJFILE
that match FILE_MATCHER. */
static void
dw_expand_symtabs_matching_file_matcher
(gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher)
{
if (file_matcher == NULL)
return;
objfile *const objfile = dwarf2_per_objfile->objfile;
htab_up visited_found (htab_create_alloc (10, htab_hash_pointer,
htab_eq_pointer,
NULL, xcalloc, xfree));
htab_up visited_not_found (htab_create_alloc (10, htab_hash_pointer,
htab_eq_pointer,
NULL, xcalloc, xfree));
/* The rule is CUs specify all the files, including those used by
any TU, so there's no need to scan TUs here. */
for (int i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
{
int j;
struct dwarf2_per_cu_data *per_cu = dw2_get_cu (i);
struct quick_file_names *file_data;
void **slot;
QUIT;
per_cu->v.quick->mark = 0;
/* We only need to look at symtabs not already expanded. */
if (per_cu->v.quick->compunit_symtab)
continue;
file_data = dw2_get_file_names (per_cu);
if (file_data == NULL)
continue;
if (htab_find (visited_not_found.get (), file_data) != NULL)
continue;
else if (htab_find (visited_found.get (), file_data) != NULL)
{ {
int symtab_was_null = per_cu->v.quick->mark = 1;
(per_cu->v.quick->compunit_symtab == NULL); continue;
dw2_instantiate_symtab (per_cu);
if (expansion_notify != NULL
&& symtab_was_null
&& per_cu->v.quick->compunit_symtab != NULL)
expansion_notify (per_cu->v.quick->compunit_symtab);
} }
for (j = 0; j < file_data->num_file_names; ++j)
{
const char *this_real_name;
if (file_matcher (file_data->file_names[j], false))
{
per_cu->v.quick->mark = 1;
break;
}
/* Before we invoke realpath, which can get expensive when many
files are involved, do a quick comparison of the basenames. */
if (!basenames_may_differ
&& !file_matcher (lbasename (file_data->file_names[j]),
true))
continue;
this_real_name = dw2_get_real_path (objfile, file_data, j);
if (file_matcher (this_real_name, false))
{
per_cu->v.quick->mark = 1;
break;
}
}
slot = htab_find_slot (per_cu->v.quick->mark
? visited_found.get ()
: visited_not_found.get (),
file_data, INSERT);
*slot = file_data;
} }
} }
@ -5048,77 +5160,7 @@ dw2_expand_symtabs_matching
if (!dwarf2_per_objfile->index_table) if (!dwarf2_per_objfile->index_table)
return; return;
if (file_matcher != NULL) dw_expand_symtabs_matching_file_matcher (file_matcher);
{
htab_up visited_found (htab_create_alloc (10, htab_hash_pointer,
htab_eq_pointer,
NULL, xcalloc, xfree));
htab_up visited_not_found (htab_create_alloc (10, htab_hash_pointer,
htab_eq_pointer,
NULL, xcalloc, xfree));
/* The rule is CUs specify all the files, including those used by
any TU, so there's no need to scan TUs here. */
for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
{
int j;
struct dwarf2_per_cu_data *per_cu = dw2_get_cu (i);
struct quick_file_names *file_data;
void **slot;
QUIT;
per_cu->v.quick->mark = 0;
/* We only need to look at symtabs not already expanded. */
if (per_cu->v.quick->compunit_symtab)
continue;
file_data = dw2_get_file_names (per_cu);
if (file_data == NULL)
continue;
if (htab_find (visited_not_found.get (), file_data) != NULL)
continue;
else if (htab_find (visited_found.get (), file_data) != NULL)
{
per_cu->v.quick->mark = 1;
continue;
}
for (j = 0; j < file_data->num_file_names; ++j)
{
const char *this_real_name;
if (file_matcher (file_data->file_names[j], false))
{
per_cu->v.quick->mark = 1;
break;
}
/* Before we invoke realpath, which can get expensive when many
files are involved, do a quick comparison of the basenames. */
if (!basenames_may_differ
&& !file_matcher (lbasename (file_data->file_names[j]),
true))
continue;
this_real_name = dw2_get_real_path (objfile, file_data, j);
if (file_matcher (this_real_name, false))
{
per_cu->v.quick->mark = 1;
break;
}
}
slot = htab_find_slot (per_cu->v.quick->mark
? visited_found.get ()
: visited_not_found.get (),
file_data, INSERT);
*slot = file_data;
}
}
mapped_index &index = *dwarf2_per_objfile->index_table; mapped_index &index = *dwarf2_per_objfile->index_table;