mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-03-07 13:39:43 +08:00
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
95 lines
2.4 KiB
Plaintext
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"
|
|
}
|