* libcoff-in.h (struct coff_section_tdata): Add offset, i,
authorIan Lance Taylor <ian@airs.com>
Mon, 25 Sep 1995 20:03:11 +0000 (20:03 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 25 Sep 1995 20:03:11 +0000 (20:03 +0000)
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.

bfd/ChangeLog
bfd/coffgen.c
bfd/libcoff.h

index d810d83..ca10f9a 100644 (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>.
 
index be94580..5b0ddb2 100644 (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)
-    {
-      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;
 }
index 8f2a45e..4e7d837 100644 (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;
 };