Mon Sep 25 11:48:02 1995 Ian Lance Taylor <ian@cygnus.com>
+ * libcoff-in.h (struct coff_section_tdata): Add offset, i,
+ function, and line_base fields.
+ * libcoff.h: Rebuild.
+ * coffgen.c (coff_find_nearest_line): Use section tdata to cache
+ information, rather than using static variables.
+
* sunos.c (sunos_read_dynamic_info): Adjust offsets in an NMAGIC
file. From Peter DeWolf <pld@amt.tay1.dec.com>.
CONST char **functionname_ptr;
unsigned int *line_ptr;
{
- static bfd *cache_abfd;
- static asection *cache_section;
- static bfd_vma cache_offset;
- static unsigned int cache_i;
- static CONST char *cache_function;
- static unsigned int line_base = 0;
-
unsigned int i;
+ unsigned int line_base;
coff_data_type *cof = coff_data (abfd);
/* Run through the raw syments if available */
combined_entry_type *p;
combined_entry_type *pend;
alent *l;
-
+ struct coff_section_tdata *sec_data;
*filename_ptr = 0;
*functionname_ptr = 0;
}
/* Now wander though the raw linenumbers of the section */
- /* If this is the same BFD as we were previously called with and
- this is the same section, and the offset we want is further down
- then we can prime the lookup loop. */
- if (abfd == cache_abfd &&
- section == cache_section &&
- offset >= cache_offset)
- {
- i = cache_i;
- *functionname_ptr = cache_function;
+ /* If we have been called on this section before, and the offset we
+ want is further down then we can prime the lookup loop. */
+ sec_data = coff_section_data (abfd, section);
+ if (sec_data != NULL
+ && sec_data->i > 0
+ && offset >= sec_data->offset)
+ {
+ i = sec_data->i;
+ *functionname_ptr = sec_data->function;
+ line_base = sec_data->line_base;
}
else
{
i = 0;
+ line_base = 0;
}
+
l = §ion->lineno[i];
for (; i < section->lineno_count; i++)
l++;
}
- cache_abfd = abfd;
- cache_section = section;
- cache_offset = offset;
- cache_i = i;
- cache_function = *functionname_ptr;
+ /* Cache the results for the next call. */
+ if (sec_data == NULL)
+ {
+ section->used_by_bfd =
+ ((PTR) bfd_zalloc (abfd,
+ sizeof (struct coff_section_tdata)));
+ sec_data = section->used_by_bfd;
+ }
+ if (sec_data != NULL)
+ {
+ sec_data->offset = offset;
+ sec_data->i = i;
+ sec_data->function = *functionname_ptr;
+ sec_data->line_base = line_base;
+ }
return true;
}