diff options
-rw-r--r-- | gdb/ChangeLog | 15 | ||||
-rw-r--r-- | gdb/dwarf2/read.c | 37 | ||||
-rw-r--r-- | gdb/psympriv.h | 22 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/dw2-symtab-includes.exp | 80 |
5 files changed, 141 insertions, 18 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8c9fbe3..b054372 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,18 @@ +2020-04-14 Simon Marchi <simon.marchi@polymtl.ca> + Tom de Vries <tdevries@suse.de> + + PR symtab/25718 + * psympriv.h (struct partial_symtab::read_symtab) + (struct partial_symtab::expand_psymtab) + (struct partial_symtab::read_dependencies): Update comments. + * dwarf2/read.c (struct dwarf2_include_psymtab::read_symtab): Call + read_symtab for includer. + (struct dwarf2_include_psymtab::expand_psymtab): Assert false. + (struct dwarf2_include_psymtab::readin_p): Call readin_p () for includer. + (struct dwarf2_include_psymtab::m_readin): Remove. + (struct dwarf2_include_psymtab::includer): New member function. + (dwarf2_psymtab::expand_psymtab): Assert !readin. + 2020-04-14 Tom de Vries <tdevries@suse.de> PR symtab/25720 diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 9fa4970..4910c9b 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -5917,22 +5917,31 @@ struct dwarf2_include_psymtab : public partial_symtab void read_symtab (struct objfile *objfile) override { - expand_psymtab (objfile); + /* It's an include file, no symbols to read for it. + Everything is in the includer symtab. */ + + /* The expansion of a dwarf2_include_psymtab is just a trigger for + expansion of the includer psymtab. We use the dependencies[0] field to + model the includer. But if we go the regular route of calling + expand_psymtab here, and having expand_psymtab call expand_dependencies + to expand the includer, we'll only use expand_psymtab on the includer + (making it a non-toplevel psymtab), while if we expand the includer via + another path, we'll use read_symtab (making it a toplevel psymtab). + So, don't pretend a dwarf2_include_psymtab is an actual toplevel + psymtab, and trigger read_symtab on the includer here directly. */ + includer ()->read_symtab (objfile); } void expand_psymtab (struct objfile *objfile) override { - if (m_readin) - return; - /* It's an include file, no symbols to read for it. - Everything is in the parent symtab. */ - expand_dependencies (objfile); - m_readin = true; + /* This is not called by read_symtab, and should not be called by any + expand_dependencies. */ + gdb_assert (false); } bool readin_p () const override { - return m_readin; + return includer ()->readin_p (); } struct compunit_symtab *get_compunit_symtab () const override @@ -5941,8 +5950,13 @@ struct dwarf2_include_psymtab : public partial_symtab } private: - - bool m_readin = false; + partial_symtab *includer () const + { + /* An include psymtab has exactly one dependency: the psymtab that + includes it. */ + gdb_assert (this->number_of_dependencies == 1); + return this->dependencies[0]; + } }; /* Allocate a new partial symtab for file named NAME and mark this new @@ -8858,8 +8872,7 @@ process_queue (struct dwarf2_per_objfile *dwarf2_per_objfile) void dwarf2_psymtab::expand_psymtab (struct objfile *objfile) { - if (readin) - return; + gdb_assert (!readin); expand_dependencies (objfile); diff --git a/gdb/psympriv.h b/gdb/psympriv.h index 9bc960a..fdcee99 100644 --- a/gdb/psympriv.h +++ b/gdb/psympriv.h @@ -124,16 +124,26 @@ struct partial_symtab { } - /* Read the full symbol table corresponding to this partial symbol - table. */ + /* Psymtab expansion is done in two steps: + - a call to read_symtab + - while that call is in progress, calls to expand_psymtab can be made, + both for this psymtab, and its dependencies. + This makes a distinction between a toplevel psymtab (for which both + read_symtab and expand_psymtab will be called) and a non-toplevel + psymtab (for which only expand_psymtab will be called). The + distinction can be used f.i. to do things before and after all + dependencies of a top-level psymtab have been expanded. + + Read the full symbol table corresponding to this partial symbol + table. Typically calls expand_psymtab. */ virtual void read_symtab (struct objfile *) = 0; - /* Psymtab expansion is done in two steps. The first step is a call - to read_symtab; but while that is in progress, calls to - expand_psymtab can be made. */ + /* Expand the full symbol table for this partial symbol table. Typically + calls expand_dependencies. */ virtual void expand_psymtab (struct objfile *) = 0; - /* Ensure that all the dependencies are read in. */ + /* Ensure that all the dependencies are read in. Calls + expand_psymtab for each non-shared dependency. */ void expand_dependencies (struct objfile *); /* Return true if the symtab corresponding to this psymtab has been diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 73931c5..7259e05 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2020-04-14 Tom de Vries <tdevries@suse.de> + PR symtab/25718 + * gdb.dwarf2/dw2-symtab-includes.exp: New file. + +2020-04-14 Tom de Vries <tdevries@suse.de> + PR symtab/25720 * gdb.base/maint-expand-symbols-header-file.c: New test. * gdb.base/maint-expand-symbols-header-file.exp: New file. diff --git a/gdb/testsuite/gdb.dwarf2/dw2-symtab-includes.exp b/gdb/testsuite/gdb.dwarf2/dw2-symtab-includes.exp new file mode 100644 index 0000000..1eaaf4a --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-symtab-includes.exp @@ -0,0 +1,80 @@ +# Copyright 2020 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# Check that symtab user and includes are present after symtab expansion +# triggered by an include file. + +load_lib dwarf.exp + +# This test can only be run on targets which support DWARF-2 and use gas. +if {![dwarf2_support]} { + return 0 +} + +standard_testfile main.c .S + +# Create the DWARF. +set asm_file [standard_output_file $srcfile2] +Dwarf::assemble $asm_file { + declare_labels partial_label lines_label + global srcdir subdir srcfile + + extern main + + cu {} { + partial_label: partial_unit {} { + } + } + + cu {} { + compile_unit { + {language @DW_LANG_C} + {stmt_list ${lines_label} DW_FORM_sec_offset} + } { + imported_unit { + {import $partial_label ref_addr} + } + } + } + + lines {version 2} lines_label { + include_dir "${srcdir}/${subdir}" + file_name "dw2-symtab-includes.h" 1 + program { + {DW_LNS_advance_line 1} + } + } +} + +if { [prepare_for_testing "failed to prepare" $testfile \ + "${asm_file} ${srcfile}" {}] } { + return -1 +} + +# Check that no symtabs are expanded. +set test "no symtabs expanded" +if { [readnow] } { + unsupported $test + return -1 +} +gdb_test_no_output "maint info symtabs" $test + +# Expand dw2-symtab-includes.h symtab +gdb_test "maint expand-symtab dw2-symtab-includes.h" + +# Check that there are includes. +gdb_test "maint info symtabs" \ + "\r\n \\( includes\r\n.*" \ + "check symtab includes" |