diff options
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/coffcode.h | 18 |
2 files changed, 15 insertions, 10 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9f48d57..a04b924 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2014-11-12 Alan Modra <amodra@gmail.com> + + PR binutils/17512 + * coffcode.h (coff_slurp_line_table): Drop line number info + not preceded by a valid function entry. Revert last change. + 2014-11-11 Nick Clifton <nickc@redhat.com> PR binutils/17512 @@ -33,7 +39,6 @@ lineno. Don't both allocating terminator in n_lineno_cache. Redirect sym->lineno pointer to where n_lineno_cache will be copied, and free n_lineno_cache. - * pe-mips.c (NUM_HOWTOS): Typo fix. 2014-11-11 Alan Modra <amodra@gmail.com> diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 4bc80bd..acc7360 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -4513,6 +4513,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect) int ordered = 1; unsigned int nbr_func; LINENO *src; + bfd_boolean have_func; BFD_ASSERT (asect->lineno == NULL); @@ -4535,6 +4536,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect) asect->lineno = lineno_cache; src = native_lineno; nbr_func = 0; + have_func = FALSE; for (counter = 0; counter < asect->lineno_count; counter++, src++) { @@ -4552,6 +4554,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect) bfd_vma symndx; coff_symbol_type *sym; + have_func = FALSE; symndx = dst.l_addr.l_symndx; if (symndx >= obj_raw_syment_count (abfd)) { @@ -4577,6 +4580,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect) continue; } + have_func = TRUE; nbr_func++; cache_ptr->u.sym = (asymbol *) sym; if (sym->lineno != NULL) @@ -4589,6 +4593,10 @@ coff_slurp_line_table (bfd *abfd, asection *asect) ordered = 0; prev_offset = sym->symbol.value; } + else if (!have_func) + /* Drop line information that has no associated function. + PR 17521: file: 078-10659-0.004. */ + continue; else cache_ptr->u.offset = (dst.l_addr.l_paddr - bfd_section_vma (abfd, asect)); @@ -4642,15 +4650,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect) *n_cache_ptr++ = *old_ptr++; while (old_ptr->line_number != 0); } - /* PR 17521: file: 078-10659-0.004. */ - if (n_cache_ptr < n_lineno_cache + asect->lineno_count) - { - amt = n_cache_ptr - n_lineno_cache; - memcpy (lineno_cache, n_lineno_cache, amt * sizeof (alent)); - memset (lineno_cache + amt, 0, (asect->lineno_count - amt) * sizeof (alent)); - } - else - memcpy (lineno_cache, n_lineno_cache, amt); + memcpy (lineno_cache, n_lineno_cache, amt); } bfd_release (abfd, func_table); } |