+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.
}
}
+ /* 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;
if (section->lineno != NULL)
{
+ bfd_vma last_value = 0;
+
l = §ion->lineno[i];
for (; i < section->lineno_count; i++)
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;
}
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. */