aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/coffgen.c51
-rw-r--r--bfd/libcoff.h5
3 files changed, 40 insertions, 22 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index d810d83..ca10f9a 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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>.
diff --git a/bfd/coffgen.c b/bfd/coffgen.c
index be94580..5b0ddb2 100644
--- a/bfd/coffgen.c
+++ b/bfd/coffgen.c
@@ -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)
- {
- 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 = &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;
}
diff --git a/bfd/libcoff.h b/bfd/libcoff.h
index 8f2a45e..4e7d837 100644
--- a/bfd/libcoff.h
+++ b/bfd/libcoff.h
@@ -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;
};