diff options
author | Alan Modra <amodra@gmail.com> | 2019-11-26 22:32:51 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-11-27 12:06:29 +1030 |
commit | e76790600aeba4939225eda32e59642ed2813ac8 (patch) | |
tree | e94950e51c433cfe5c73ab0dd3224f40451f0c8d /bfd/dwarf2.c | |
parent | 96e2dbda089775359b130e16a337c169d67abc6b (diff) | |
download | gdb-e76790600aeba4939225eda32e59642ed2813ac8.zip gdb-e76790600aeba4939225eda32e59642ed2813ac8.tar.gz gdb-e76790600aeba4939225eda32e59642ed2813ac8.tar.bz2 |
PR23652, Use symbols from debug bfd for _bfd_elf_find_function
Sometimes DWARF info for a function is incomplete, and the function
can be retrieved by examining symbols. However, when separate debug
files are used it may be that the original file is completely
stripped of symbols. This patch teaches BFD to look at symbols from
the debug file in that case.
The patch also removes arm_elf_find_function, instead implementing
elf_backend_maybe_function_sym. arm_elf_find_function was written
before the generic _bfd_elf_find_function called maybe_function_sym.
aarch64 copied arm, so that file gets the same treatment. There is
some chance this will speed up arm and aarch64 lookup of function/line.
PR 23652
* dwarf2.c (_bfd_dwarf2_stash_syms): New function.
(_bfd_dwarf2_find_nearest_line): Use it here, passing syms to
_bfd_elf_find_function. Call _bfd_elf_find_function in cases
where _bfd_elf_find_nearest_line would do so.
* elf.c (_bfd_elf_find_nearest_line): Omit _bfd_elf_find_function
for dwarf2.
* elfxx-mips.c (_bfd_mips_elf_find_nearest_line): Similarly. Tidy.
* elf32-arm.c (elf32_arm_maybe_function_sym): New function.
(elf_backend_maybe_function_sym): Define.
(arm_elf_find_function, elf32_arm_find_nearest_line): Delete.
(bfd_elf32_find_nearest_line): Don't define.
* elfnn-aarch64.c (elfNN_aarch64_maybe_function_sym): New function.
(elf_backend_maybe_function_sym): Define.
(aarch64_elf_find_function, elfNN_aarch64_find_nearest_line): Delete.
(bfd_elfNN_find_nearest_line): Don't define.
Diffstat (limited to 'bfd/dwarf2.c')
-rw-r--r-- | bfd/dwarf2.c | 58 |
1 files changed, 51 insertions, 7 deletions
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c index c3d9ffc..e42483a 100644 --- a/bfd/dwarf2.c +++ b/bfd/dwarf2.c @@ -3894,6 +3894,40 @@ set_debug_vma (bfd *orig_bfd, bfd *debug_bfd) } } +/* If the dwarf2 info was found in a separate debug file, return the + debug file section corresponding to the section in the original file + and the debug file symbols. */ + +static void +_bfd_dwarf2_stash_syms (struct dwarf2_debug *stash, bfd *abfd, + asection **sec, asymbol ***syms) +{ + if (stash->bfd_ptr != abfd) + { + asection *s, *d; + + if (*sec == NULL) + { + *syms = stash->syms; + return; + } + + for (s = abfd->sections, d = stash->bfd_ptr->sections; + s != NULL && d != NULL; + s = s->next, d = d->next) + { + if ((d->flags & SEC_DEBUGGING) != 0) + break; + if (s == *sec + && strcmp (s->name, d->name) == 0) + { + *sec = d; + *syms = stash->syms; + } + } + } +} + /* Unset vmas for adjusted sections in STASH. */ static void @@ -4888,16 +4922,26 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd, } done: - if (function) + if (functionname_ptr && function && function->is_linkage) + *functionname_ptr = function->name; + else if (functionname_ptr + && ((found && !*functionname_ptr) + || (function && !function->is_linkage))) { - if (!function->is_linkage) + asymbol *fun; + asymbol **syms = symbols; + asection *sec = section; + + if (symbols == NULL || *symbols == NULL) + _bfd_dwarf2_stash_syms (stash, abfd, &sec, &syms); + fun = _bfd_elf_find_function (abfd, syms, sec, offset, + *filename_ptr ? NULL : filename_ptr, + functionname_ptr); + + if (function && !function->is_linkage) { - asymbol *fun; bfd_vma sec_vma; - fun = _bfd_elf_find_function (abfd, symbols, section, offset, - *filename_ptr ? NULL : filename_ptr, - functionname_ptr); sec_vma = section->vma; if (section->output_section != NULL) sec_vma = section->output_section->vma + section->output_offset; @@ -4908,8 +4952,8 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd, to stop a repeated search of symbols. */ function->is_linkage = TRUE; } - *functionname_ptr = function->name; } + if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0) unset_sections (stash); |