2007-09-17 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. *** bfd/som.c 3 Jul 2007 14:26:42 -0000 1.66 --- bfd/som.c 17 Sep 2007 12:27:33 -0000 *************** som_set_arch_mach (bfd *abfd, *** 5331,5345 **** } 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) { ! return FALSE; } static int --- 5331,5387 ---- } static bfd_boolean ! 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) { ! 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 *** bfd/som.h 3 Jul 2007 14:26:42 -0000 1.16 --- bfd/som.h 17 Sep 2007 12:27:33 -0000 *************** struct somdata *** 136,141 **** --- 136,142 ---- file_ptr str_filepos; file_ptr reloc_filepos; unsigned stringtab_size; + PTR line_info; }; struct som_data_struct *** bfd/syms.c 26 Jul 2007 18:53:51 -0000 1.45 --- bfd/syms.c 17 Sep 2007 12:27:34 -0000 *************** _bfd_stab_section_find_nearest_line (bfd *** 988,998 **** info->strsec = bfd_get_section_by_name (abfd, ".stabstr"); 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 --- 988,1005 ---- info->strsec = bfd_get_section_by_name (abfd, ".stabstr"); if (info->stabsec == NULL || info->strsec == NULL) ! { ! /* Try SOM sections name. */ ! 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