aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog10
-rw-r--r--bfd/som.c58
-rw-r--r--bfd/som.h1
-rw-r--r--bfd/syms.c15
4 files changed, 72 insertions, 12 deletions
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 <hainque@adacore.com>
+ Tristan Gingold <gingold@adacore.com>
+
+ * 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 <dan@codesourcery.com>
* 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