forked from Imagelibrary/binutils-gdb
This patch rearranges the DWARF reader so that more work is done in
the background. This is PR symtab/29942.
The idea here is that there is only a small amount of work that must
be done on the main thread when scanning DWARF -- before the main
scan, the only part is mapping the section data.
Currently, the DWARF reader uses the quick_symbol_functions "lazy"
functionality to defer even starting to read. This patch instead
changes the reader to start reading immediately, but doing more in
worker tasks.
Before this patch, "file" on my machine:
(gdb) file /tmp/gdb
2023-10-23 12:29:56.885 - command started
Reading symbols from /tmp/gdb...
2023-10-23 12:29:58.047 - command finished
Command execution time: 5.867228 (cpu), 1.162444 (wall)
After the patch, more work is done in the background and so this takes
a bit less time:
(gdb) file /tmp/gdb
2023-10-23 13:25:51.391 - command started
Reading symbols from /tmp/gdb...
2023-10-23 13:25:51.712 - command finished
Command execution time: 1.894500 (cpu), 0.320306 (wall)
I think this could be further sped up by using the shared library load
map to avoid objfile loops like the one in expand_symtab_containing_pc
-- it seems like the correct objfile could be chosen more directly.
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29942
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30174
133 lines
3.1 KiB
Plaintext
133 lines
3.1 KiB
Plaintext
# Copyright 2020-2023 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/>.
|
|
|
|
# Variant of struct-with-sig.exp where TUs are in .gnu_debugaltlink file.
|
|
|
|
load_lib dwarf.exp
|
|
|
|
# This test can only be run on targets which support DWARF-2 and use gas.
|
|
require dwarf2_support
|
|
|
|
standard_testfile main-foo.c .S .S
|
|
|
|
set build_id [string repeat ff 20]
|
|
|
|
# Make some DWARF for the dwz file.
|
|
set asm_file [standard_output_file $srcfile2]
|
|
Dwarf::assemble $asm_file {
|
|
build_id $::build_id
|
|
|
|
tu {} 0x0000000000000001 the_type_i {
|
|
type_unit {} {
|
|
declare_labels int_type
|
|
|
|
the_type_i: structure_type {
|
|
{name s}
|
|
{byte_size 4 sdata}
|
|
} {
|
|
member {
|
|
{name i}
|
|
{type :$int_type}
|
|
}
|
|
}
|
|
int_type: base_type {
|
|
{name int}
|
|
{encoding @DW_ATE_signed}
|
|
{byte_size 4 sdata}
|
|
}
|
|
}
|
|
}
|
|
|
|
tu {} 0x0000000000000002 the_type_j {
|
|
type_unit {} {
|
|
declare_labels int_type
|
|
|
|
the_type_j: structure_type {
|
|
{name s}
|
|
{byte_size 4 sdata}
|
|
} {
|
|
member {
|
|
{name j}
|
|
{type :$int_type}
|
|
}
|
|
}
|
|
int_type: base_type {
|
|
{name int}
|
|
{encoding @DW_ATE_signed}
|
|
{byte_size 4 sdata}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
# We're using an object instead of executable here to keep cc-with-tweaks.sh
|
|
# from modifying it. It also means we can set the build-id, rather than
|
|
# having to extract it.
|
|
if { [gdb_compile $asm_file $binfile.dwz object {nodebug}] != "" } {
|
|
return -1
|
|
}
|
|
|
|
set host_dwz_file [gdb_remote_download host $binfile.dwz]
|
|
|
|
# Make some DWARF for the executable.
|
|
set asm_file [standard_output_file $srcfile3]
|
|
Dwarf::assemble $asm_file {
|
|
gnu_debugaltlink $::host_dwz_file $::build_id
|
|
|
|
cu {} {
|
|
compile_unit {
|
|
{DW_AT_language @DW_LANG_C}
|
|
{DW_AT_name main.c}
|
|
} {
|
|
structure_type {
|
|
{name s}
|
|
{signature 0x0000000000000001 ref_sig8}
|
|
{declaration 1 flag}
|
|
}
|
|
DW_TAG_subprogram {
|
|
{MACRO_AT_func {main}}
|
|
}
|
|
}
|
|
}
|
|
|
|
cu {} {
|
|
compile_unit {
|
|
{DW_AT_language @DW_LANG_C}
|
|
{DW_AT_name foo.c}
|
|
} {
|
|
structure_type {
|
|
{name s}
|
|
{signature 0x0000000000000002 ref_sig8}
|
|
{declaration 1 flag}
|
|
}
|
|
DW_TAG_subprogram {
|
|
{MACRO_AT_func {foo}}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
save_vars { GDBFLAGS } {
|
|
append GDBFLAGS " -iex \"maint set dwarf synchronous on\""
|
|
|
|
if { [prepare_for_testing "failed to prepare" ${testfile} \
|
|
[list $srcfile $asm_file] {nodebug}] } {
|
|
return -1
|
|
}
|
|
}
|
|
|
|
set re "Dwarf Error: .debug_types section not supported in dwz file"
|
|
gdb_assert { [regexp $re $gdb_file_cmd_msg] } "Dwarf Error message"
|