aboutsummaryrefslogtreecommitdiff
path: root/bfd/dwarf2.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-11-27 18:00:59 +1030
committerAlan Modra <amodra@gmail.com>2019-11-27 19:10:11 +1030
commit7f3bf38453acbabf7286dd7f8ce2688282e7b9cd (patch)
treef8f2436c5e8dc4e5deb7089b7418f76a72aab57f /bfd/dwarf2.c
parente76790600aeba4939225eda32e59642ed2813ac8 (diff)
downloadfsf-binutils-gdb-7f3bf38453acbabf7286dd7f8ce2688282e7b9cd.zip
fsf-binutils-gdb-7f3bf38453acbabf7286dd7f8ce2688282e7b9cd.tar.gz
fsf-binutils-gdb-7f3bf38453acbabf7286dd7f8ce2688282e7b9cd.tar.bz2
PR23652, Use symbols from debug bfd for _bfd_elf_find_function properly
There were a number of problems with the previous patch. Firstly, _bfd_dwarf2_stash_syms didn't do anything when the original file had dynamic symbols, and secondly, info found by the symbol search didn't make it out of _bfd_elf_find_nearest_line except in the case of DWARF functions without external linkage. PR 23652 * dwarf2.c (_bfd_dwarf2_stash_syms): Break out of loop on finding matching section. (_bfd_dwarf2_find_nearest_line): Return an int, with value 2 when returning info from the symbol table. Do the _bfd_elf_find_function search also when !found. Call _bfd_dwarf2_stash_syms regardless of symbols. * elf64-alpha.c (elf64_alpha_find_nearest_line): Accept dwarf2 result of 1 only. * elfxx-mips.c (_bfd_mips_elf_find_nearest_line): Likewise. * libbfd-in.h (_bfd_dwarf2_find_nearest_line): Update prototype. * libbfd.h: Regenerate.
Diffstat (limited to 'bfd/dwarf2.c')
-rw-r--r--bfd/dwarf2.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
index e42483a..a25f76a 100644
--- a/bfd/dwarf2.c
+++ b/bfd/dwarf2.c
@@ -3923,6 +3923,7 @@ _bfd_dwarf2_stash_syms (struct dwarf2_debug *stash, bfd *abfd,
{
*sec = d;
*syms = stash->syms;
+ break;
}
}
}
@@ -4692,15 +4693,19 @@ _bfd_dwarf2_find_symbol_bias (asymbol ** symbols, void ** pinfo)
/* Find the source code location of SYMBOL. If SYMBOL is NULL
then find the nearest source code location corresponding to
the address SECTION + OFFSET.
- Returns TRUE if the line is found without error and fills in
+ Returns 1 if the line is found without error and fills in
FILENAME_PTR and LINENUMBER_PTR. In the case where SYMBOL was
NULL the FUNCTIONNAME_PTR is also filled in.
+ Returns 2 if partial information from _bfd_elf_find_function is
+ returned (function and maybe file) by looking at symbols. DWARF2
+ info is present but not regarding the requested code location.
+ Returns 0 otherwise.
SYMBOLS contains the symbol table for ABFD.
DEBUG_SECTIONS contains the name of the dwarf debug sections.
field and in the abbreviation offset, or zero to indicate that the
default value should be used. */
-bfd_boolean
+int
_bfd_dwarf2_find_nearest_line (bfd *abfd,
asymbol **symbols,
asymbol *symbol,
@@ -4726,7 +4731,7 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd,
bfd_vma addr;
struct comp_unit* each;
struct funcinfo *function = NULL;
- bfd_boolean found = FALSE;
+ int found = FALSE;
bfd_boolean do_line;
*filename_ptr = NULL;
@@ -4925,19 +4930,21 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd,
if (functionname_ptr && function && function->is_linkage)
*functionname_ptr = function->name;
else if (functionname_ptr
- && ((found && !*functionname_ptr)
+ && (!*functionname_ptr
|| (function && !function->is_linkage)))
{
asymbol *fun;
asymbol **syms = symbols;
asection *sec = section;
- if (symbols == NULL || *symbols == NULL)
- _bfd_dwarf2_stash_syms (stash, abfd, &sec, &syms);
+ _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 (!found && fun != NULL)
+ found = 2;
+
if (function && !function->is_linkage)
{
bfd_vma sec_vma;