* 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.
This commit is contained in:
Ian Lance Taylor 1995-09-25 20:03:11 +00:00
parent 641ac26a06
commit 25b5a53dac
3 changed files with 39 additions and 21 deletions

View File

@ -1,5 +1,11 @@
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>.

View File

@ -1774,20 +1774,14 @@ coff_find_nearest_line (abfd, section, ignore_symbols, offset, filename_ptr,
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;
@ -1857,20 +1851,23 @@ coff_find_nearest_line (abfd, section, ignore_symbols, offset, filename_ptr,
}
/* 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)
/* 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 = cache_i;
*functionname_ptr = cache_function;
i = sec_data->i;
*functionname_ptr = sec_data->function;
line_base = sec_data->line_base;
}
else
{
i = 0;
line_base = 0;
}
l = &section->lineno[i];
for (; i < section->lineno_count; i++)
@ -1915,11 +1912,21 @@ coff_find_nearest_line (abfd, section, ignore_symbols, offset, filename_ptr,
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;
}

View File

@ -115,6 +115,11 @@ struct coff_section_tdata
bfd_byte *contents;
/* If this is true, the contents entry may not be freed. */
boolean keep_contents;
/* Information cached by coff_find_nearest_line. */
bfd_vma offset;
unsigned int i;
const char *function;
int line_base;
/* Available for individual backends. */
PTR tdata;
};