aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2022-09-06 10:15:01 +0200
committerTom de Vries <tdevries@suse.de>2022-09-06 10:15:01 +0200
commitd878bb39e417fa23b8dc62fed916708e776a9b71 (patch)
treeca07f1e7869b7e8d4b785c8052fd310aaf251569 /gdb
parenta4fac33dc3ab42bd6a5f41c0ceca66e681a7de8b (diff)
downloadfsf-binutils-gdb-d878bb39e417fa23b8dc62fed916708e776a9b71.zip
fsf-binutils-gdb-d878bb39e417fa23b8dc62fed916708e776a9b71.tar.gz
fsf-binutils-gdb-d878bb39e417fa23b8dc62fed916708e776a9b71.tar.bz2
[gdb/symtab] Support .debug_names section with TUs in .debug_info
When running test-case gdb.cp/cpexprs-debug-types.exp on target board cc-with-debug-names/gdb:debug_flags=-gdwarf-5, we get an executable with a .debug_names section, but no .debug_types section. For dwarf-5, the TUs are no longer put in a separate unit, but instead they're put in the .debug_info section. When loading the executable, the .debug_names section is silently ignored because of this check in dwarf2_read_debug_names: ... if (map->tu_count != 0) { /* We can only handle a single .debug_types when we have an index. */ if (per_bfd->types.size () != 1) return false; ... which triggers because per_bfd->types.size () == 0. The intention of the check is to make sure we don't have more that one .debug_types section, as can happen in a object file (see PR12984): ... $ grep "\.debug_types" 11.s .section .debug_types,"G",@progbits,wt.75c042c23a9a07ee,comdat .section .debug_types,"G",@progbits,wt.c59c413bf50a4607,comdat ... Fix this by: - changing the check condition to "per_bfd->types.size () > 1", and - handling per_bfd->types.size () == 0. Tested on x86_64-linux. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29385
Diffstat (limited to 'gdb')
-rw-r--r--gdb/dwarf2/read.c7
-rw-r--r--gdb/testsuite/gdb.dwarf2/debug-names-tu-dwarf5.exp18
-rw-r--r--gdb/testsuite/gdb.dwarf2/debug-names-tu.exp79
-rw-r--r--gdb/testsuite/gdb.dwarf2/debug-names-tu.exp.tcl94
-rw-r--r--gdb/testsuite/lib/dwarf.exp21
5 files changed, 136 insertions, 83 deletions
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 08dd0b7..3ca441c 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -4736,13 +4736,16 @@ dwarf2_read_debug_names (dwarf2_per_objfile *per_objfile)
{
/* We can only handle a single .debug_types when we have an
index. */
- if (per_bfd->types.size () != 1)
+ if (per_bfd->types.size () > 1)
{
per_bfd->all_comp_units.clear ();
return false;
}
- dwarf2_section_info *section = &per_bfd->types[0];
+ dwarf2_section_info *section
+ = (per_bfd->types.size () == 1
+ ? &per_bfd->types[0]
+ : &per_bfd->info);
create_signatured_type_table_from_debug_names
(per_objfile, *map, section, &per_bfd->abbrev);
diff --git a/gdb/testsuite/gdb.dwarf2/debug-names-tu-dwarf5.exp b/gdb/testsuite/gdb.dwarf2/debug-names-tu-dwarf5.exp
new file mode 100644
index 0000000..ac3b459
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/debug-names-tu-dwarf5.exp
@@ -0,0 +1,18 @@
+# Copyright 2022 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/>.
+
+set dwarf_version 5
+
+source $srcdir/$subdir/debug-names-tu.exp.tcl
diff --git a/gdb/testsuite/gdb.dwarf2/debug-names-tu.exp b/gdb/testsuite/gdb.dwarf2/debug-names-tu.exp
index 34fecff..b796a73 100644
--- a/gdb/testsuite/gdb.dwarf2/debug-names-tu.exp
+++ b/gdb/testsuite/gdb.dwarf2/debug-names-tu.exp
@@ -13,81 +13,6 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-load_lib dwarf.exp
+set dwarf_version 4
-# This test can only be run on targets which support DWARF-2 and use gas.
-if {![dwarf2_support]} {
- return 0
-}
-
-standard_testfile _start.c debug-names.S
-
-set func_info_vars \
- [get_func_info _start [list debug additional_flags=-nostartfiles]]
-
-# Create the DWARF.
-set asm_file [standard_output_file $srcfile2]
-Dwarf::assemble {
- filename $asm_file
- add_dummy_cus 0
-} {
- global func_info_vars
- foreach var $func_info_vars {
- global $var
- }
-
- cu { label cu_label } {
- compile_unit {{language @DW_LANG_C}} {
- subprogram {
- {DW_AT_name _start}
- {DW_AT_low_pc $_start_start DW_FORM_addr}
- {DW_AT_high_pc $_start_end DW_FORM_addr}
- }
- }
- }
-
- tu { label tu_label } 0x8ece66f4224fddb3 "" {
- type_unit {} {
- declare_labels int_type
-
- structure_type {
- {name struct_with_int_member}
- {byte_size 4 sdata}
- } {
- member {
- {name member}
- {type :$int_type}
- }
- }
- int_type: base_type {
- {name int}
- {encoding @DW_ATE_signed}
- {byte_size 4 sdata}
- }
- }
- }
-
- debug_names {} {
- cu cu_label
- tu tu_label
- name _start subprogram cu_label 0xEDDB6232
- name struct_with_int_member structure_type tu_label 0x53A2AE86
- }
-}
-
-if [prepare_for_testing "failed to prepare" $testfile "${asm_file} ${srcfile}" \
- [list additional_flags=-nostartfiles]] {
- return -1
-}
-
-# Verify that .debug_names section is not ignored.
-set index [have_index $binfile]
-gdb_assert { [string equal $index "debug_names"] } ".debug_names used"
-
-# Verify that we can find the type in the type unit.
-set re \
- [multi_line \
- "type = struct struct_with_int_member {" \
- " int member;" \
- "}"]
-gdb_test "ptype struct struct_with_int_member" $re
+source $srcdir/$subdir/debug-names-tu.exp.tcl
diff --git a/gdb/testsuite/gdb.dwarf2/debug-names-tu.exp.tcl b/gdb/testsuite/gdb.dwarf2/debug-names-tu.exp.tcl
new file mode 100644
index 0000000..738ecc4
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/debug-names-tu.exp.tcl
@@ -0,0 +1,94 @@
+# Copyright 2022 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/>.
+
+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 _start.c debug-names.S
+
+set func_info_vars \
+ [get_func_info _start [list debug additional_flags=-nostartfiles]]
+
+# Create the DWARF.
+set asm_file [standard_output_file $srcfile2]
+Dwarf::assemble {
+ filename $asm_file
+ add_dummy_cus 0
+} {
+ global dwarf_version
+ global func_info_vars
+ foreach var $func_info_vars {
+ global $var
+ }
+
+ cu { label cu_label version $dwarf_version } {
+ compile_unit {{language @DW_LANG_C}} {
+ subprogram {
+ {DW_AT_name _start}
+ {DW_AT_low_pc $_start_start DW_FORM_addr}
+ {DW_AT_high_pc $_start_end DW_FORM_addr}
+ }
+ }
+ }
+
+ tu { label tu_label version $dwarf_version } 0x8ece66f4224fddb3 "" {
+ type_unit {} {
+ declare_labels int_type
+
+ structure_type {
+ {name struct_with_int_member}
+ {byte_size 4 sdata}
+ } {
+ member {
+ {name member}
+ {type :$int_type}
+ }
+ }
+ int_type: base_type {
+ {name int}
+ {encoding @DW_ATE_signed}
+ {byte_size 4 sdata}
+ }
+ }
+ }
+
+ debug_names {} {
+ cu cu_label
+ tu tu_label
+ name _start subprogram cu_label 0xEDDB6232
+ name struct_with_int_member structure_type tu_label 0x53A2AE86
+ }
+}
+
+if [prepare_for_testing "failed to prepare" $testfile "${asm_file} ${srcfile}" \
+ [list additional_flags=-nostartfiles]] {
+ return -1
+}
+
+# Verify that .debug_names section is not ignored.
+set index [have_index $binfile]
+gdb_assert { [string equal $index "debug_names"] } ".debug_names used"
+
+# Verify that we can find the type in the type unit.
+set re \
+ [multi_line \
+ "type = struct struct_with_int_member {" \
+ " int member;" \
+ "}"]
+gdb_test "ptype struct struct_with_int_member" $re
diff --git a/gdb/testsuite/lib/dwarf.exp b/gdb/testsuite/lib/dwarf.exp
index b0e248c..6db0ed2 100644
--- a/gdb/testsuite/lib/dwarf.exp
+++ b/gdb/testsuite/lib/dwarf.exp
@@ -1563,6 +1563,7 @@ namespace eval Dwarf {
set label ""
foreach { name value } $options {
+ set value [uplevel 1 "subst \"$value\""]
switch -exact -- $name {
is_64 { set is_64 $value }
version { set _cu_version $value }
@@ -1580,9 +1581,12 @@ namespace eval Dwarf {
}
}
set _cu_offset_size [expr { $is_64 ? 8 : 4 }]
+ if { $_cu_version == 5 } {
+ set section ".debug_info"
+ }
if { $_cu_is_fission } {
- set section ".debug_types.dwo"
- set _abbrev_section ".debug_abbrev.dwo"
+ set section "$section.dwo"
+ set _abbrev_section "$section.dwo"
}
_section $section
@@ -1609,8 +1613,17 @@ namespace eval Dwarf {
}
define_label $start_label
_op .2byte $_cu_version Version
- _op_offset $_cu_offset_size $my_abbrevs Abbrevs
- _op .byte $_cu_addr_size "Pointer size"
+
+ # The CU header for DWARF 4 and 5 are slightly different.
+ if { $_cu_version == 5 } {
+ _op .byte 0x2 "DW_UT_type"
+ _op .byte $_cu_addr_size "Pointer size"
+ _op_offset $_cu_offset_size $my_abbrevs Abbrevs
+ } else {
+ _op_offset $_cu_offset_size $my_abbrevs Abbrevs
+ _op .byte $_cu_addr_size "Pointer size"
+ }
+
_op .8byte $signature Signature
if { $type_label != "" } {
uplevel declare_labels $type_label