Consolidate partial symtab dependency reading

Most of the symbol readers have code to iterate over a partial symtabs
dependencies, expanding each one and optionally printing a message.
Now that the "second-stage" psymtab expansion is available as a
method, these implementations can all be merged.

This patch also changes a couple more warnings into assertions.

gdb/ChangeLog
2020-01-26  Tom Tromey  <tom@tromey.com>

	* xcoffread.c (xcoff_psymtab_to_symtab_1): Call
	read_dependencies.  Add assert.
	* psymtab.c (partial_symtab::read_dependencies): New method.
	* psympriv.h (struct partial_symtab) <read_dependencies>: New
	method.
	* mdebugread.c (psymtab_to_symtab_1): Call read_dependencies.
	* dwarf2read.c (dwarf2_psymtab::expand_psymtab): Call
	read_dependencies.
	* dbxread.c (dbx_psymtab_to_symtab_1): Call read_dependencies.
	Add assert.

Change-Id: I8151e05677794e90223edc1a4cb70f7f69137d46
This commit is contained in:
Tom Tromey 2019-10-23 09:46:25 -06:00
parent 8566b89b73
commit 0494dbecdf
7 changed files with 48 additions and 90 deletions

View File

@ -1,3 +1,16 @@
2020-01-26 Tom Tromey <tom@tromey.com>
* xcoffread.c (xcoff_psymtab_to_symtab_1): Call
read_dependencies. Add assert.
* psymtab.c (partial_symtab::read_dependencies): New method.
* psympriv.h (struct partial_symtab) <read_dependencies>: New
method.
* mdebugread.c (psymtab_to_symtab_1): Call read_dependencies.
* dwarf2read.c (dwarf2_psymtab::expand_psymtab): Call
read_dependencies.
* dbxread.c (dbx_psymtab_to_symtab_1): Call read_dependencies.
Add assert.
2020-01-26 Tom Tromey <tom@tromey.com> 2020-01-26 Tom Tromey <tom@tromey.com>
* xcoffread.c (xcoff_psymtab_to_symtab_1): Change argument order. * xcoffread.c (xcoff_psymtab_to_symtab_1): Change argument order.

View File

@ -2068,33 +2068,10 @@ dbx_end_psymtab (struct objfile *objfile, legacy_psymtab *pst,
static void static void
dbx_psymtab_to_symtab_1 (legacy_psymtab *pst, struct objfile *objfile) dbx_psymtab_to_symtab_1 (legacy_psymtab *pst, struct objfile *objfile)
{ {
int i; gdb_assert (!pst->readin);
if (pst->readin)
{
fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in. "
"Shouldn't happen.\n",
pst->filename);
return;
}
/* Read in all partial symtabs on which this one is dependent. */ /* Read in all partial symtabs on which this one is dependent. */
for (i = 0; i < pst->number_of_dependencies; i++) pst->read_dependencies (objfile);
if (!pst->dependencies[i]->readin)
{
/* Inform about additional files that need to be read in. */
if (info_verbose)
{
fputs_filtered (" ", gdb_stdout);
wrap_here ("");
fputs_filtered ("and ", gdb_stdout);
wrap_here ("");
printf_filtered ("%s...", pst->dependencies[i]->filename);
wrap_here (""); /* Flush output. */
gdb_flush (gdb_stdout);
}
pst->dependencies[i]->expand_psymtab (objfile);
}
if (LDSYMLEN (pst)) /* Otherwise it's a dummy. */ if (LDSYMLEN (pst)) /* Otherwise it's a dummy. */
{ {

View File

@ -9663,29 +9663,11 @@ void
dwarf2_psymtab::expand_psymtab (struct objfile *objfile) dwarf2_psymtab::expand_psymtab (struct objfile *objfile)
{ {
struct dwarf2_per_cu_data *per_cu; struct dwarf2_per_cu_data *per_cu;
int i;
if (readin) if (readin)
return; return;
for (i = 0; i < number_of_dependencies; i++) read_dependencies (objfile);
if (!dependencies[i]->readin
&& dependencies[i]->user == NULL)
{
/* Inform about additional files that need to be read in. */
if (info_verbose)
{
/* FIXME: i18n: Need to make this a single string. */
fputs_filtered (" ", gdb_stdout);
wrap_here ("");
fputs_filtered ("and ", gdb_stdout);
wrap_here ("");
printf_filtered ("%s...", dependencies[i]->filename);
wrap_here (""); /* Flush output. */
gdb_flush (gdb_stdout);
}
dependencies[i]->expand_psymtab (objfile);
}
per_cu = per_cu_data; per_cu = per_cu_data;

View File

@ -3856,24 +3856,7 @@ psymtab_to_symtab_1 (legacy_psymtab *pst, struct objfile *objfile)
/* Read in all partial symtabs on which this one is dependent. /* Read in all partial symtabs on which this one is dependent.
NOTE that we do have circular dependencies, sigh. We solved NOTE that we do have circular dependencies, sigh. We solved
that by setting pst->readin before this point. */ that by setting pst->readin before this point. */
pst->read_dependencies (objfile);
for (i = 0; i < pst->number_of_dependencies; i++)
if (!pst->dependencies[i]->readin)
{
/* Inform about additional files to be read in. */
if (info_verbose)
{
fputs_filtered (" ", gdb_stdout);
wrap_here ("");
fputs_filtered ("and ", gdb_stdout);
wrap_here ("");
printf_filtered ("%s...",
pst->dependencies[i]->filename);
wrap_here (""); /* Flush output */
gdb_flush (gdb_stdout);
}
pst->dependencies[i]->expand_psymtab (objfile);
}
/* Do nothing if this is a dummy psymtab. */ /* Do nothing if this is a dummy psymtab. */

View File

@ -134,6 +134,9 @@ struct partial_symtab
expand_psymtab can be made. */ expand_psymtab can be made. */
virtual void expand_psymtab (struct objfile *) = 0; virtual void expand_psymtab (struct objfile *) = 0;
/* Ensure that all the dependencies are read in. */
void read_dependencies (struct objfile *);
/* Return the raw low text address of this partial_symtab. */ /* Return the raw low text address of this partial_symtab. */
CORE_ADDR raw_text_low () const CORE_ADDR raw_text_low () const
{ {

View File

@ -1682,6 +1682,32 @@ partial_symtab::partial_symtab (const char *filename_, struct objfile *objfile)
} }
} }
/* See psympriv.h. */
void
partial_symtab::read_dependencies (struct objfile *objfile)
{
for (int i = 0; i < number_of_dependencies; ++i)
{
if (!dependencies[i]->readin)
{
/* Inform about additional files to be read in. */
if (info_verbose)
{
fputs_filtered (" ", gdb_stdout);
wrap_here ("");
fputs_filtered ("and ", gdb_stdout);
wrap_here ("");
printf_filtered ("%s...", dependencies[i]->filename);
wrap_here (""); /* Flush output */
gdb_flush (gdb_stdout);
}
dependencies[i]->expand_psymtab (objfile);
}
}
}
void void
psymtab_storage::discard_psymtab (struct partial_symtab *pst) psymtab_storage::discard_psymtab (struct partial_symtab *pst)
{ {

View File

@ -1819,36 +1819,10 @@ find_linenos (struct bfd *abfd, struct bfd_section *asect, void *vpinfo)
static void static void
xcoff_psymtab_to_symtab_1 (legacy_psymtab *pst, struct objfile *objfile) xcoff_psymtab_to_symtab_1 (legacy_psymtab *pst, struct objfile *objfile)
{ {
int i; gdb_assert (!pst->readin);
if (!pst)
return;
if (pst->readin)
{
fprintf_unfiltered
(gdb_stderr, "Psymtab for %s already read in. Shouldn't happen.\n",
pst->filename);
return;
}
/* Read in all partial symtabs on which this one is dependent. */ /* Read in all partial symtabs on which this one is dependent. */
for (i = 0; i < pst->number_of_dependencies; i++) pst->read_dependencies (objfile);
if (!pst->dependencies[i]->readin)
{
/* Inform about additional files that need to be read in. */
if (info_verbose)
{
fputs_filtered (" ", gdb_stdout);
wrap_here ("");
fputs_filtered ("and ", gdb_stdout);
wrap_here ("");
printf_filtered ("%s...", pst->dependencies[i]->filename);
wrap_here (""); /* Flush output */
gdb_flush (gdb_stdout);
}
pst->dependencies[i]->expand_psymtab (objfile);
}
if (((struct symloc *) pst->read_symtab_private)->numsyms != 0) if (((struct symloc *) pst->read_symtab_private)->numsyms != 0)
{ {