aboutsummaryrefslogtreecommitdiff
path: root/bfd/dwarf2.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-11-26 22:32:51 +1030
committerAlan Modra <amodra@gmail.com>2019-11-27 12:06:29 +1030
commite76790600aeba4939225eda32e59642ed2813ac8 (patch)
treee94950e51c433cfe5c73ab0dd3224f40451f0c8d /bfd/dwarf2.c
parent96e2dbda089775359b130e16a337c169d67abc6b (diff)
downloadgdb-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.c58
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);