From 6119d2522e8a598e50cb2ed05bf523e0ecedad3f Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Fri, 21 Sep 2007 07:58:03 +0000 Subject: * syms.c (_bfd_stab_section_find_nearest_line): Look at the specific SOM sections for stabs if the regular ones are not found. * som.h (struct somdata): Add a line_info field, to be used by som_find_nearest_line. * som.c (som_find_nearest_line): Implement using the bfd stabs function above. --- bfd/ChangeLog | 10 ++++++++++ bfd/som.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++-------- bfd/som.h | 1 + bfd/syms.c | 15 +++++++++++---- 4 files changed, 72 insertions(+), 12 deletions(-) (limited to 'bfd') diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 38eef54..22461e9 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2007-09-21 Olivier Hainque + Tristan Gingold + + * syms.c (_bfd_stab_section_find_nearest_line): Look at the + specific SOM sections for stabs if the regular ones are not found. + * som.h (struct somdata): Add a line_info field, to be used by + som_find_nearest_line. + * som.c (som_find_nearest_line): Implement using the bfd stabs + function above. + 2007-09-19 Daniel Jacobowitz * elfxx-mips.c (_bfd_mips_elf_finish_dynamic_sections): Make sure .got diff --git a/bfd/som.c b/bfd/som.c index e267658..f36e3bc 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -5331,15 +5331,57 @@ som_set_arch_mach (bfd *abfd, } static bfd_boolean -som_find_nearest_line (bfd *abfd ATTRIBUTE_UNUSED, - asection *section ATTRIBUTE_UNUSED, - asymbol **symbols ATTRIBUTE_UNUSED, - bfd_vma offset ATTRIBUTE_UNUSED, - const char **filename_ptr ATTRIBUTE_UNUSED, - const char **functionname_ptr ATTRIBUTE_UNUSED, - unsigned int *line_ptr ATTRIBUTE_UNUSED) +som_find_nearest_line (bfd *abfd, + asection *section, + asymbol **symbols, + bfd_vma offset, + const char **filename_ptr, + const char **functionname_ptr, + unsigned int *line_ptr) { - return FALSE; + bfd_boolean found; + asymbol *func; + bfd_vma low_func; + asymbol **p; + + if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, + & found, filename_ptr, + functionname_ptr, line_ptr, + & somdata (abfd).line_info)) + return FALSE; + + if (found) + return TRUE; + + if (symbols == NULL) + return FALSE; + + /* Fallback: find function name from symbols table. */ + func = NULL; + low_func = 0; + + for (p = symbols; *p != NULL; p++) + { + som_symbol_type *q = (som_symbol_type *) *p; + + if (q->som_type == SYMBOL_TYPE_ENTRY + && q->symbol.section == section + && q->symbol.value >= low_func + && q->symbol.value <= offset) + { + func = (asymbol *) q; + low_func = q->symbol.value; + } + } + + if (func == NULL) + return FALSE; + + *filename_ptr = NULL; + *functionname_ptr = bfd_asymbol_name (func); + *line_ptr = 0; + + return TRUE; } static int diff --git a/bfd/som.h b/bfd/som.h index 708f0ae..59b4c1991 100644 --- a/bfd/som.h +++ b/bfd/som.h @@ -136,6 +136,7 @@ struct somdata file_ptr str_filepos; file_ptr reloc_filepos; unsigned stringtab_size; + void * line_info; }; struct som_data_struct diff --git a/bfd/syms.c b/bfd/syms.c index 9d42568..8831b92 100644 --- a/bfd/syms.c +++ b/bfd/syms.c @@ -989,10 +989,17 @@ _bfd_stab_section_find_nearest_line (bfd *abfd, if (info->stabsec == NULL || info->strsec == NULL) { - /* No stabs debugging information. Set *pinfo so that we - can return quickly in the info != NULL case above. */ - *pinfo = info; - return TRUE; + /* Try SOM section names. */ + info->stabsec = bfd_get_section_by_name (abfd, "$GDB_SYMBOLS$"); + info->strsec = bfd_get_section_by_name (abfd, "$GDB_STRINGS$"); + + if (info->stabsec == NULL || info->strsec == NULL) + { + /* No stabs debugging information. Set *pinfo so that we + can return quickly in the info != NULL case above. */ + *pinfo = info; + return TRUE; + } } stabsize = (info->stabsec->rawsize -- cgit v1.1