diff options
author | Nick Clifton <nickc@redhat.com> | 2007-09-21 07:58:03 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2007-09-21 07:58:03 +0000 |
commit | 6119d2522e8a598e50cb2ed05bf523e0ecedad3f (patch) | |
tree | 3564ca5bb09a8712a115b5cc992eb68d6af57406 /bfd/som.c | |
parent | 80576242ab144a06ef28d698a432eea831fdc5c0 (diff) | |
download | gdb-6119d2522e8a598e50cb2ed05bf523e0ecedad3f.zip gdb-6119d2522e8a598e50cb2ed05bf523e0ecedad3f.tar.gz gdb-6119d2522e8a598e50cb2ed05bf523e0ecedad3f.tar.bz2 |
* 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.
Diffstat (limited to 'bfd/som.c')
-rw-r--r-- | bfd/som.c | 58 |
1 files changed, 50 insertions, 8 deletions
@@ -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 |