diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 14ed147db2c..4ce4fc01fba 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2018-02-06 Miloš Stojanović <milos.stojanovic@rt-rk.com> + + PR 22789 + * elfxx-mips.c (_bfd_mips_elf_find_nearest_line): If the dwarf + functions failed to find the function name, try the generic elf + find function instead. + 2018-02-06 Sergio Durigan Junior <sergiodj@redhat.com> * coff-rs6000.c (xcoff_write_archive_contents_old): Use diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index ab65894e92b..246d51c9ccf 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -12666,13 +12666,29 @@ _bfd_mips_elf_find_nearest_line (bfd *abfd, asymbol **symbols, line_ptr, discriminator_ptr, dwarf_debug_sections, ABI_64_P (abfd) ? 8 : 0, - &elf_tdata (abfd)->dwarf2_find_line_info)) - return TRUE; + &elf_tdata (abfd)->dwarf2_find_line_info) + || _bfd_dwarf1_find_nearest_line (abfd, symbols, section, offset, + filename_ptr, functionname_ptr, + line_ptr)) + { + /* PR 22789: If the function name or filename was not found through + the debug information, then try an ordinary lookup instead. */ + if ((functionname_ptr != NULL && *functionname_ptr == NULL) + || (filename_ptr != NULL && *filename_ptr == NULL)) + { + /* Do not override already discovered names. */ + if (functionname_ptr != NULL && *functionname_ptr != NULL) + functionname_ptr = NULL; - if (_bfd_dwarf1_find_nearest_line (abfd, symbols, section, offset, - filename_ptr, functionname_ptr, - line_ptr)) - return TRUE; + if (filename_ptr != NULL && *filename_ptr != NULL) + filename_ptr = NULL; + + _bfd_elf_find_function (abfd, symbols, section, offset, + filename_ptr, functionname_ptr); + } + + return TRUE; + } msec = bfd_get_section_by_name (abfd, ".mdebug"); if (msec != NULL)