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.
This commit is contained in:
Ian Lance Taylor 1999-08-09 04:04:17 +00:00
parent 24c411edf7
commit 798c1fb8d7
2 changed files with 26 additions and 1 deletions

View 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.

View 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. */