aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2010-12-20 18:37:36 +0000
committerIan Lance Taylor <ian@airs.com>2010-12-20 18:37:36 +0000
commit7500420b3e1046dac0d90eae795314ecf4a99429 (patch)
treed1f3d76dc1b3e6d3cb5d5dfc348d45dacde7a637
parent66a3cb9c76c69ead27cedd1ad8f265dd9197450f (diff)
downloadgdb-7500420b3e1046dac0d90eae795314ecf4a99429.zip
gdb-7500420b3e1046dac0d90eae795314ecf4a99429.tar.gz
gdb-7500420b3e1046dac0d90eae795314ecf4a99429.tar.bz2
* dwarf_reader.cc (Sized_dwarf_line_info::read_lines): Only keep
second of two consecutive entries with same offset.
-rw-r--r--gold/ChangeLog5
-rw-r--r--gold/dwarf_reader.cc13
-rw-r--r--gold/dwarf_reader.h5
3 files changed, 21 insertions, 2 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 4fbd9f7..64958ab 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -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)
diff --git a/gold/dwarf_reader.cc b/gold/dwarf_reader.cc
index 7fbfdae..8110f38 100644
--- a/gold/dwarf_reader.cc
+++ b/gold/dwarf_reader.cc
@@ -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;
}
diff --git a/gold/dwarf_reader.h b/gold/dwarf_reader.h
index c197833..8fe7898 100644
--- a/gold/dwarf_reader.h
+++ b/gold/dwarf_reader.h
@@ -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; }
};