binutils-gdb/gdb/testsuite/gdb.dwarf2/debug-names-bad-cu-index.exp
Tom Tromey b371f07c47 Rewrite .debug_names reader
This rewrites the .debug_names reader to follow the spec.

Since it was first written, gdb's .debug_names writer has been
incorrect -- while the form of the section has been ok, the contents
have been very gdb-specific.

This patch fixes the reader side of this equation, rewriting the
reader to create a cooked index internally -- an important detail
because it allows for the deletion of a lot of code, and it means the
various readers will agree more often.

This reader checks for a new augmentation string.  For the time being,
all other producers are ignored -- the old GDB ones because they are
wrong, and clang because it does not emit DW_IDX_parent.  (If there
are any other producers, I'm unaware of them.)

While the new reader mostly runs in a worker thread, it does not try
to distribute its work.  This could be done by partitioning the name
table.  The parent computations could also be done in parallel after
all names have been read.  I haven't attempted this.

Note that this patch temporarily regresses gdb.base/gdb-index-err.exp.
This test writes an index using gdb -- but at this particular stage,
gdb cannot read the indexes it creates.  Rather than merge the patches
into a mega-patch, I've chosen to just accept this temporary
regression.

In v1 of this patch, I made the new reader more strict about requiring
.debug_aranges.  In v2, I've backed this out and kept the previous
logic.  This solved a few test failures, though it's arguably not the
right approach.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=25950
2024-01-18 08:20:17 -07:00

95 lines
2.4 KiB
Plaintext

# Copyright 2022-2024 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.
require dwarf2_support
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-1 0xEDDB6232
name struct_with_int_member structure_type tu_label 0x53A2AE86
}
}
if {[build_executable ${testfile}.exp $testfile "${asm_file} ${srcfile}" \
[list additional_flags=-nostartfiles]] == -1} {
return -1
}
clean_restart
with_complaints 1 {
gdb_test_no_output "maint set dwarf synchronous on"
gdb_load $binfile
# Verify that .debug_names section is not ignored.
set index [have_index $binfile]
gdb_assert { [string equal $index "debug_names"] } ".debug_names used"
set re "During symbol reading: .debug_names entry has bad CU index 1 "
gdb_assert {[regexp $re.* $gdb_file_cmd_msg]} "saw complaint"
}