From 798c1fb8d76bc613c6c9b6db10cc8e430763a47c Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 9 Aug 1999 04:04:17 +0000 Subject: [PATCH] 1999-08-09 Eli Zaretskii * 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 | 6 ++++++ bfd/coffgen.c | 21 ++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 05a85d568df..46e8c26f7cd 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +1999-08-09 Eli Zaretskii + + * 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 * section.c (SEC_SMALL_DATA): Rename from SEC_SHORT. diff --git a/bfd/coffgen.c b/bfd/coffgen.c index 8495f3d7cef..88ba6a5927d 100644 --- a/bfd/coffgen.c +++ b/bfd/coffgen.c @@ -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 = §ion->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. */ -- 2.30.2