1999-08-09 Eli Zaretskii <eliz@is.elta.co.il>
authorIan Lance Taylor <ian@airs.com>
Mon, 9 Aug 1999 04:04:17 +0000 (04:04 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 9 Aug 1999 04:04:17 +0000 (04:04 +0000)
* coffgen.c (coff_find_nearest_line): When looking for file, use
last best match rather than first.  If address is beyond last line
number record, don't return the last line as the correct value.

bfd/ChangeLog
bfd/coffgen.c

index 05a85d568dfc1921027f858f1d56ee03ab1016ae..46e8c26f7cdca474f8c9c577cb8b586b2d48a224 100644 (file)
@@ -1,3 +1,9 @@
+1999-08-09  Eli Zaretskii  <eliz@is.elta.co.il>
+
+       * coffgen.c (coff_find_nearest_line): When looking for file, use
+       last best match rather than first.  If address is beyond last line
+       number record, don't return the last line as the correct value.
+
 1999-08-08  Ian Lance Taylor  <ian@zembu.com>
 
        * section.c (SEC_SMALL_DATA): Rename from SEC_SHORT.
index 8495f3d7cef8ad045dc3182cb16e38f2a0999720..88ba6a5927d496fd97a9454a83a4030f0857aa4b 100644 (file)
@@ -2200,9 +2200,11 @@ coff_find_nearest_line (abfd, section, symbols, offset, filename_ptr,
                }
            }
 
+         /* We use <= MAXDIFF here so that if we get a zero length
+             file, we actually use the next file entry.  */
          if (p2 < pend
              && offset + sec_vma >= (bfd_vma) p2->u.syment.n_value
-             && offset + sec_vma - (bfd_vma) p2->u.syment.n_value < maxdiff)
+             && offset + sec_vma - (bfd_vma) p2->u.syment.n_value <= maxdiff)
            {
              *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
              maxdiff = offset + sec_vma - p2->u.syment.n_value;
@@ -2239,6 +2241,8 @@ coff_find_nearest_line (abfd, section, symbols, offset, filename_ptr,
 
   if (section->lineno != NULL)
     {
+      bfd_vma last_value = 0;
+
       l = &section->lineno[i];
 
       for (; i < section->lineno_count; i++)
@@ -2250,6 +2254,7 @@ coff_find_nearest_line (abfd, section, symbols, offset, filename_ptr,
              if (coff->symbol.value > offset)
                break;
              *functionname_ptr = coff->symbol.name;
+             last_value = coff->symbol.value;
              if (coff->native)
                {
                  combined_entry_type *s = coff->native;
@@ -2278,6 +2283,20 @@ coff_find_nearest_line (abfd, section, symbols, offset, filename_ptr,
            }
          l++;
        }
+
+      /* If we fell off the end of the loop, then assume that this
+        symbol has no line number info.  Otherwise, symbols with no
+        line number info get reported with the line number of the
+        last line of the last symbol which does have line number
+        info.  We use 0x100 as a slop to account for cases where the
+        last line has executable code.  */
+      if (i >= section->lineno_count
+         && last_value != 0
+         && offset - last_value > 0x100)
+       {
+         *functionname_ptr = NULL;
+         *line_ptr = 0;
+       }
     }
 
   /* Cache the results for the next call.  */