From: Tom de Vries Date: Tue, 6 Jul 2021 08:58:43 +0000 (+0200) Subject: [gdb/symtab] Fix skipping of import of C++ CU X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=752e419362eae28f7fcf6347b333347e472bc10f;p=binutils-gdb.git [gdb/symtab] Fix skipping of import of C++ CU Tom Tromey observed that when changing the language in gdb.dwarf2/imported-unit-bp.exp from c to c++, the test failed. This is due to this code in process_imported_unit_die: ... /* We're importing a C++ compilation unit with tag DW_TAG_compile_unit into another compilation unit, at root level. Regard this as a hint, and ignore it. */ if (die->parent && die->parent->parent == NULL && per_cu->unit_type == DW_UT_compile && per_cu->lang == language_cplus) return; ... which should have a partial symtabs counterpart. Add the missing counterpart in process_psymtab_comp_unit. Tested on x86_64-linux (openSUSE Leap 15.2), no regressions for config: - using default gcc version 7.5.0 (with 5 unexpected FAILs) - gcc 10.3.0 and target board unix/-flto/-O0/-flto-partition=none/-ffat-lto-objects (with 1000 unexpected FAILs) gdb/ChangeLog: 2021-07-06 Tom de Vries * dwarf2/read.c (scan_partial_symbols): Skip top-level imports of c++ CU. * testsuite/gdb.dwarf2/imported-unit-bp.exp: Moved to ... * testsuite/gdb.dwarf2/imported-unit-bp.exp.tcl: ... here. * testsuite/gdb.dwarf2/imported-unit-bp-c++.exp: New test. * testsuite/gdb.dwarf2/imported-unit-bp-c.exp: New test. * testsuite/gdb.dwarf2/imported-unit.exp: Update. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f7a6ccc6d9e..f1071a71d2e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2021-07-06 Tom de Vries + + * dwarf2/read.c (scan_partial_symbols): Skip top-level imports of + c++ CU. + * testsuite/gdb.dwarf2/imported-unit-bp.exp: Moved to ... + * testsuite/gdb.dwarf2/imported-unit-bp.exp.tcl: ... here. + * testsuite/gdb.dwarf2/imported-unit-bp-c++.exp: New test. + * testsuite/gdb.dwarf2/imported-unit-bp-c.exp: New test. + * testsuite/gdb.dwarf2/imported-unit.exp: Update. + 2021-07-03 Joel Brobecker * NEWS: Create a new section for the next release branch. diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index fe82175990e..a13a53ebc46 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -7639,6 +7639,13 @@ scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc, process_psymtab_comp_unit (per_cu, cu->per_objfile, true, cu->per_cu->lang); + if (pdi->die_parent == nullptr + && per_cu->unit_type == DW_UT_compile + && per_cu->lang == language_cplus) + /* Regard import as hint. See corresponding code in + process_imported_unit_die. */ + break; + cu->per_cu->imported_symtabs_push (per_cu); } break; diff --git a/gdb/testsuite/gdb.dwarf2/imported-unit-bp-c++.exp b/gdb/testsuite/gdb.dwarf2/imported-unit-bp-c++.exp new file mode 100644 index 00000000000..c376113d5e0 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/imported-unit-bp-c++.exp @@ -0,0 +1,18 @@ +# Copyright 2021 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 . + +set lang DW_LANG_C_plus_plus + +source $srcdir/$subdir/imported-unit-bp.exp.tcl diff --git a/gdb/testsuite/gdb.dwarf2/imported-unit-bp-c.exp b/gdb/testsuite/gdb.dwarf2/imported-unit-bp-c.exp new file mode 100644 index 00000000000..6f9c3ad8f41 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/imported-unit-bp-c.exp @@ -0,0 +1,18 @@ +# Copyright 2021 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 . + +set lang DW_LANG_C + +source $srcdir/$subdir/imported-unit-bp.exp.tcl diff --git a/gdb/testsuite/gdb.dwarf2/imported-unit-bp.exp b/gdb/testsuite/gdb.dwarf2/imported-unit-bp.exp deleted file mode 100644 index b6a0f25d2ce..00000000000 --- a/gdb/testsuite/gdb.dwarf2/imported-unit-bp.exp +++ /dev/null @@ -1,128 +0,0 @@ -# Copyright 2020-2021 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 . - -# Test that "break /absolute/file:line" works ok with imported CUs. - -load_lib dwarf.exp - -# This test can only be run on targets which support DWARF-2 and use gas. -if {![dwarf2_support]} { - return 0 -} - -# The .c files use __attribute__. -if [get_compiler_info] { - return -1 -} -if !$gcc_compiled { - return 0 -} - -standard_testfile imported-unit-bp-alt.c .S imported-unit-bp-main.c - -set build_options {nodebug optimize=-O1} - -set asm_file [standard_output_file $srcfile2] -Dwarf::assemble $asm_file { - global srcdir subdir srcfile srcfile - global build_options - declare_labels lines_label callee_subprog_label cu_label - - get_func_info func "$build_options additional_flags=-DWITHMAIN" - - cu {} { - compile_unit { - {language @DW_LANG_C} - {name ""} - } { - imported_unit { - {import %$cu_label} - } - } - } - - cu {} { - cu_label: compile_unit { - {producer "gcc"} - {language @DW_LANG_C} - {name ${srcfile}} - {comp_dir "/tmp"} - {low_pc 0 addr} - {stmt_list ${lines_label} DW_FORM_sec_offset} - } { - callee_subprog_label: subprogram { - {external 1 flag} - {name callee} - {inline 3 data1} - } - subprogram { - {external 1 flag} - {name func} - {low_pc $func_start addr} - {high_pc "$func_start + $func_len" addr} - } { - } - } - } - - lines {version 2 default_is_stmt 1} lines_label { - include_dir "/tmp" - file_name "$srcfile" 1 - - program { - {DW_LNE_set_address line_label_1} - {DW_LNS_advance_line 15} - {DW_LNS_copy} - - {DW_LNE_set_address line_label_2} - {DW_LNS_advance_line 1} - {DW_LNS_copy} - - {DW_LNE_set_address line_label_3} - {DW_LNS_advance_line 4} - {DW_LNS_copy} - - {DW_LNE_set_address line_label_4} - {DW_LNS_advance_line 1} - {DW_LNS_copy} - - {DW_LNS_advance_line -4} - {DW_LNS_negate_stmt} - {DW_LNS_copy} - - {DW_LNE_set_address line_label_5} - {DW_LNS_advance_line 1} - {DW_LNS_copy} - - {DW_LNE_set_address line_label_6} - {DW_LNS_advance_line 1} - {DW_LNS_negate_stmt} - {DW_LNS_copy} - - {DW_LNE_set_address line_label_7} - {DW_LNE_end_sequence} - } - } -} - -if { [prepare_for_testing "failed to prepare" ${testfile} \ - [list $srcfile $asm_file $srcfile3] $build_options] } { - return -1 -} - -gdb_reinitialize_dir /tmp - -# Using an absolute path is important to see the bug. -gdb_test "break /tmp/${srcfile}:19" "Breakpoint .* file $srcfile, line .*" diff --git a/gdb/testsuite/gdb.dwarf2/imported-unit-bp.exp.tcl b/gdb/testsuite/gdb.dwarf2/imported-unit-bp.exp.tcl new file mode 100644 index 00000000000..83bca7d8e7a --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/imported-unit-bp.exp.tcl @@ -0,0 +1,129 @@ +# Copyright 2020-2021 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 . + +# Test that "break /absolute/file:line" works ok with imported CUs. + +load_lib dwarf.exp + +# This test can only be run on targets which support DWARF-2 and use gas. +if {![dwarf2_support]} { + return 0 +} + +# The .c files use __attribute__. +if [get_compiler_info] { + return -1 +} +if !$gcc_compiled { + return 0 +} + +standard_testfile imported-unit-bp-alt.c .S imported-unit-bp-main.c + +set build_options {nodebug optimize=-O1} + +set asm_file [standard_output_file $srcfile2] +Dwarf::assemble $asm_file { + global srcdir subdir srcfile srcfile + global build_options + global lang + declare_labels lines_label callee_subprog_label cu_label + + get_func_info func "$build_options additional_flags=-DWITHMAIN" + + cu {} { + compile_unit { + {language @$lang} + {name ""} + } { + imported_unit { + {import %$cu_label} + } + } + } + + cu {} { + cu_label: compile_unit { + {producer "gcc"} + {language @$lang} + {name ${srcfile}} + {comp_dir "/tmp"} + {low_pc 0 addr} + {stmt_list ${lines_label} DW_FORM_sec_offset} + } { + callee_subprog_label: subprogram { + {external 1 flag} + {name callee} + {inline 3 data1} + } + subprogram { + {external 1 flag} + {name func} + {low_pc $func_start addr} + {high_pc "$func_start + $func_len" addr} + } { + } + } + } + + lines {version 2 default_is_stmt 1} lines_label { + include_dir "/tmp" + file_name "$srcfile" 1 + + program { + {DW_LNE_set_address line_label_1} + {DW_LNS_advance_line 15} + {DW_LNS_copy} + + {DW_LNE_set_address line_label_2} + {DW_LNS_advance_line 1} + {DW_LNS_copy} + + {DW_LNE_set_address line_label_3} + {DW_LNS_advance_line 4} + {DW_LNS_copy} + + {DW_LNE_set_address line_label_4} + {DW_LNS_advance_line 1} + {DW_LNS_copy} + + {DW_LNS_advance_line -4} + {DW_LNS_negate_stmt} + {DW_LNS_copy} + + {DW_LNE_set_address line_label_5} + {DW_LNS_advance_line 1} + {DW_LNS_copy} + + {DW_LNE_set_address line_label_6} + {DW_LNS_advance_line 1} + {DW_LNS_negate_stmt} + {DW_LNS_copy} + + {DW_LNE_set_address line_label_7} + {DW_LNE_end_sequence} + } + } +} + +if { [prepare_for_testing "failed to prepare" ${testfile} \ + [list $srcfile $asm_file $srcfile3] $build_options] } { + return -1 +} + +gdb_reinitialize_dir /tmp + +# Using an absolute path is important to see the bug. +gdb_test "break /tmp/${srcfile}:19" "Breakpoint .* file $srcfile, line .*" diff --git a/gdb/testsuite/gdb.dwarf2/imported-unit.exp b/gdb/testsuite/gdb.dwarf2/imported-unit.exp index 2bd72a60f40..efce3a03a2e 100644 --- a/gdb/testsuite/gdb.dwarf2/imported-unit.exp +++ b/gdb/testsuite/gdb.dwarf2/imported-unit.exp @@ -136,15 +136,14 @@ gdb_test_no_output "set language c++" set psymtabs_p [psymtabs_p] -# Verify that the partial symtab for the unit importing the partial unit does -# not contain the static partial symbol int, which is defined in the partial -# unit. Test-case for PR25646. +# Verify that the partial symtab for CU "" does +# not contain the static partial symbol int, which is defined in the +# CU "imported_unit.c". Test-case for PR25646. set test "no static partial symbols in importing unit" if { $psymtabs_p } { gdb_test "main print psymbols" \ [multi_line \ - " Depends on 1 other partial symtabs\." \ - "\[^\r\n\]*" \ + " Depends on 0 other partial symtabs\." \ " Global partial symbols:" \ " `main', function, $hex" \ "" \