aboutsummaryrefslogtreecommitdiff
path: root/bfd/som.c
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2007-09-21 07:58:03 +0000
committerNick Clifton <nickc@redhat.com>2007-09-21 07:58:03 +0000
commit6119d2522e8a598e50cb2ed05bf523e0ecedad3f (patch)
tree3564ca5bb09a8712a115b5cc992eb68d6af57406 /bfd/som.c
parent80576242ab144a06ef28d698a432eea831fdc5c0 (diff)
downloadgdb-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.c58
1 files changed, 50 insertions, 8 deletions
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