* dwarf_reader.cc (Sized_dwarf_line_info::read_lines): Only keep
authorIan Lance Taylor <ian@airs.com>
Mon, 20 Dec 2010 18:37:36 +0000 (18:37 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 20 Dec 2010 18:37:36 +0000 (18:37 +0000)
second of two consecutive entries with same offset.

gold/ChangeLog
gold/dwarf_reader.cc
gold/dwarf_reader.h

index 4fbd9f7..64958ab 100644 (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)
index 7fbfdae..8110f38 100644 (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;
         }
index c197833..8fe7898 100644 (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; }
 };