* 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.
This commit is contained in:
Nick Clifton 2007-09-21 07:58:03 +00:00
parent 80576242ab
commit 6119d2522e
4 changed files with 72 additions and 12 deletions

View File

@ -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

View File

@ -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

View File

@ -136,6 +136,7 @@ struct somdata
file_ptr str_filepos;
file_ptr reloc_filepos;
unsigned stringtab_size;
void * line_info;
};
struct som_data_struct

View File

@ -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