From 0494dbecdfa0b0b9065393755a1ac64431997da1 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 23 Oct 2019 09:46:25 -0600 Subject: [PATCH] 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 * 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) : 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 --- gdb/ChangeLog | 13 +++++++++++++ gdb/dbxread.c | 27 ++------------------------- gdb/dwarf2read.c | 20 +------------------- gdb/mdebugread.c | 19 +------------------ gdb/psympriv.h | 3 +++ gdb/psymtab.c | 26 ++++++++++++++++++++++++++ gdb/xcoffread.c | 30 ++---------------------------- 7 files changed, 48 insertions(+), 90 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c6a0251e8db..69f26892bcf 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,16 @@ +2020-01-26 Tom Tromey + + * 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) : 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 * xcoffread.c (xcoff_psymtab_to_symtab_1): Change argument order. diff --git a/gdb/dbxread.c b/gdb/dbxread.c index 2711ea86b85..99f47c0c917 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -2068,33 +2068,10 @@ dbx_end_psymtab (struct objfile *objfile, legacy_psymtab *pst, static void dbx_psymtab_to_symtab_1 (legacy_psymtab *pst, struct objfile *objfile) { - int i; - - if (pst->readin) - { - fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in. " - "Shouldn't happen.\n", - pst->filename); - return; - } + gdb_assert (!pst->readin); /* Read in all partial symtabs on which this one is dependent. */ - for (i = 0; i < pst->number_of_dependencies; i++) - 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); - } + pst->read_dependencies (objfile); if (LDSYMLEN (pst)) /* Otherwise it's a dummy. */ { diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index c3e0866f37d..dafe01d94a0 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -9663,29 +9663,11 @@ void dwarf2_psymtab::expand_psymtab (struct objfile *objfile) { struct dwarf2_per_cu_data *per_cu; - int i; if (readin) return; - for (i = 0; i < number_of_dependencies; i++) - 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); - } + read_dependencies (objfile); per_cu = per_cu_data; diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index 1d0a0fcdf8f..5d2fbcd2749 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -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. NOTE that we do have circular dependencies, sigh. We solved that by setting pst->readin before this point. */ - - 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); - } + pst->read_dependencies (objfile); /* Do nothing if this is a dummy psymtab. */ diff --git a/gdb/psympriv.h b/gdb/psympriv.h index ae98a69bcc6..e4b23301e9c 100644 --- a/gdb/psympriv.h +++ b/gdb/psympriv.h @@ -134,6 +134,9 @@ struct partial_symtab expand_psymtab can be made. */ 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. */ CORE_ADDR raw_text_low () const { diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 6abc829e2ee..c020d15721c 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -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 psymtab_storage::discard_psymtab (struct partial_symtab *pst) { diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index 1c0db67f05b..b7da3f944c7 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -1819,36 +1819,10 @@ find_linenos (struct bfd *abfd, struct bfd_section *asect, void *vpinfo) static void xcoff_psymtab_to_symtab_1 (legacy_psymtab *pst, struct objfile *objfile) { - int i; - - if (!pst) - return; - - if (pst->readin) - { - fprintf_unfiltered - (gdb_stderr, "Psymtab for %s already read in. Shouldn't happen.\n", - pst->filename); - return; - } + gdb_assert (!pst->readin); /* Read in all partial symtabs on which this one is dependent. */ - for (i = 0; i < pst->number_of_dependencies; i++) - 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); - } + pst->read_dependencies (objfile); if (((struct symloc *) pst->read_symtab_private)->numsyms != 0) {