* dwarf_reader.cc (Sized_dwarf_line_info::read_lines): Only keep

second of two consecutive entries with same offset.
This commit is contained in:
Ian Lance Taylor 2010-12-20 18:37:36 +00:00
parent 66a3cb9c76
commit 7500420b3e
3 changed files with 21 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2010-12-20 Ian Lance Taylor <iant@google.com>
* dwarf_reader.cc (Sized_dwarf_line_info::read_lines): Only keep
second of two consecutive entries with same offset.
2010-12-16 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
* testsuite/Makefile.am (ifuncmain2static_LDADD)

View File

@ -493,7 +493,18 @@ Sized_dwarf_line_info<size, big_endian>::read_lines(unsigned const char* lineptr
Offset_to_lineno_entry entry
= { lsm.address, this->current_header_index_,
lsm.file_num, lsm.line_num };
line_number_map_[lsm.shndx].push_back(entry);
std::vector<Offset_to_lineno_entry>&
map(this->line_number_map_[lsm.shndx]);
// If we see two consecutive entries with the same
// offset and a real line number, then always use the
// second one.
if (!map.empty()
&& (map.back().offset == static_cast<off_t>(lsm.address))
&& lsm.line_num != -1
&& map.back().line_num != -1)
map.back() = entry;
else
map.push_back(entry);
}
lineptr += oplength;
}

View File

@ -46,7 +46,10 @@ struct Offset_to_lineno_entry
int header_num; // which file-list to use (i.e. which .o file are we in)
int file_num; // a pointer into files_
int line_num; // the line number in the source file
// Offsets are unique within a section, so that's a sufficient sort key.
// When we add entries to the table, we always use the last entry
// with a given offset. Given proper DWARF info, this should ensure
// that the offset is a sufficient sort key.
bool operator<(const Offset_to_lineno_entry& that) const
{ return this->offset < that.offset; }
};