
This rewrites GDB's .debug_names writer. It is now closer to the form imagined in the DWARF spec. In particular, names are emitted exactly as they appear in the original DWARF. In order to make the reader work nicely, some extensions were needed. These were all documented in an earlier patch. Note that in particular this writer solves the "main name" problem by putting a flag into the table. GDB does not use the .debug_names hash table, so it also does not write one. I consider this hash table to be essentially useless in general, due to the name canonicalization problem -- while DWARF says that writers should use the system demangling style, (1) this style varies across systems, so it can't truly be relied on; and (2) at least GCC and one other compiler don't actually follow this part of the spec anyway. It's important to note, though, that even if the hash was somehow useful, GDB probably still would not use it -- a sorted list of names is needed for completion and performs reasonably well for other lookups, so a hash table is just overhead, IMO. String emission is also simplified. There's no need in this writer to ingest the contents of .debug_str. A couple of tests are updated to reflect the fact that they now "fail" because the tests don't include .debug_aranges in the .S file. Arguably the .debug_names writer should also create this section; but I did not implement that in this series, and there is a separate bug about it. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=24820 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=24549
65 lines
2 KiB
Text
65 lines
2 KiB
Text
# Copyright 2010-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 .S -main.c
|
|
|
|
set binfile_stripped ${binfile}-stripped
|
|
|
|
if { [prepare_for_testing "failed to prepare" "${testfile}" \
|
|
[list $srcfile2 $srcfile] {nodebug nopie}] } {
|
|
return -1
|
|
}
|
|
|
|
set break_at ""
|
|
set test "info addr break_at"
|
|
gdb_test_multiple $test $test {
|
|
-re "Symbol \"break_at\" is at (0x\[0-9a-f\]+) in .*\r\n$gdb_prompt $" {
|
|
set break_at $expect_out(1,string)
|
|
pass $test
|
|
}
|
|
}
|
|
|
|
gdb_unload
|
|
|
|
# Strip out any labels there as they could corrupt the `main' name.
|
|
|
|
set objcopy_program [gdb_find_objcopy]
|
|
set command "$objcopy_program -N block_start -N block_end -N break_at ${binfile} ${binfile_stripped}"
|
|
verbose -log "Executing: $command"
|
|
set result [catch "exec $command" output]
|
|
verbose "result is $result"
|
|
verbose "output is $output"
|
|
if {$result != 0} {
|
|
return -1
|
|
}
|
|
|
|
gdb_load ${binfile_stripped}
|
|
|
|
if ![runto "*${break_at}"] {
|
|
return -1
|
|
}
|
|
|
|
set index [have_index $binfile_stripped]
|
|
if {$index == "debug_names"} {
|
|
# This test doesn't include .debug_aranges, so it doesn't cause CU
|
|
# expansion and thus won't work with .debug_names.
|
|
setup_kfail "symtab/31132" *-*-*
|
|
}
|
|
|
|
gdb_test "bt" "#0 (0x\[0-9a-f\]+ in )?func \\(funcparam=<optimized out>\\)\r\n#1 main \\(mainparam=<optimized out>\\)\[^\r\n\]*"
|