diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 89940c658e..3f1cce59e7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2020-04-22 Tom de Vries + + PR symtab/25700 + * dwarf2/read.c (dwarf2_build_psymtabs_hard): Don't create psymtab for + CU if already created. + 2020-04-21 Tankut Baris Aktemur * infrun.c (displaced_step_fixup): Switch to the event_thread diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 41db511c85..450c53b519 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -7779,7 +7779,12 @@ dwarf2_build_psymtabs_hard (struct dwarf2_per_objfile *dwarf2_per_objfile) addrmap_create_mutable (&temp_obstack)); for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units) - process_psymtab_comp_unit (per_cu, false, language_minimal); + { + if (per_cu->v.psymtab != NULL) + /* In case a forward DW_TAG_imported_unit has read the CU already. */ + continue; + process_psymtab_comp_unit (per_cu, false, language_minimal); + } /* This has to wait until we read the CUs, we need the list of DWOs. */ process_skeletonless_type_units (dwarf2_per_objfile); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 10c2a01b4b..f6c52c8e42 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2020-04-22 Tom de Vries + + PR symtab/25700 + * gdb.dwarf2/imported-unit.exp: Verify that there's only one partial + symtab for imported_unit.c. + 2020-04-21 Gary Benson * gdb.base/advance.c (func): New argument, to match call site. diff --git a/gdb/testsuite/gdb.dwarf2/imported-unit.exp b/gdb/testsuite/gdb.dwarf2/imported-unit.exp index 41a7505459..d7b3d4c539 100644 --- a/gdb/testsuite/gdb.dwarf2/imported-unit.exp +++ b/gdb/testsuite/gdb.dwarf2/imported-unit.exp @@ -168,6 +168,24 @@ if { $psymtabs_p } { } else { unsupported $test } + +# Verify that there's only one partial symtab for imported_unit.c. Test-case +# for PR25700. +set test "no duplicate psymtab for imported_unit.c" +if { $psymtabs_p } { + set line "Partial symtab for source file imported_unit.c" + gdb_test_multiple "maint print psymbols" $test { + -re -wrap "$line.*$line.*" { + fail $gdb_test_name + } + -re -wrap "$line.*" { + pass $gdb_test_name + } + } +} else { + unsupported $test +} + # Sanity check gdb_test "ptype main" "= int \\(void\\)"