Correctly handle skewed streams in drop_front() method.
authorZachary Turner <zturner@google.com>
Thu, 13 Dec 2018 18:11:33 +0000 (18:11 +0000)
committerZachary Turner <zturner@google.com>
Thu, 13 Dec 2018 18:11:33 +0000 (18:11 +0000)
When calling BinaryStreamArray::drop_front(), if the stream
is skewed it means we must never drop the first bytes of the
stream since offsets which occur in records assume the existence
of those bytes.  So if we want to skip the first record in a
stream, then what we really want to do is just set the begin
pointer to the next record.  But we shouldn't actually remove
those bytes from the underlying view of the data.

llvm-svn: 349066

lld/COFF/PDB.cpp
llvm/include/llvm/Support/BinaryStreamArray.h

index ccce0e7..9c3ff4e 100644 (file)
@@ -474,7 +474,10 @@ PDBLinker::mergeDebugT(ObjFile *File, CVIndexMap *ObjectIndexMap) {
 
     // Drop LF_PRECOMP record from the input stream, as it needs to be replaced
     // with the precompiled headers object type stream.
-    Types.drop_front();
+    // Note that we can't just call Types.drop_front(), as we explicitly want to
+    // rebase the stream.
+    Types.setUnderlyingStream(
+        Types.getUnderlyingStream().drop_front(FirstType->RecordData.size()));
   }
 
   // Fill in the temporary, caller-provided ObjectIndexMap.
index 049cf56..7c110fc 100644 (file)
@@ -139,7 +139,7 @@ public:
     this->Skew = Skew;
   }
 
-  void drop_front() { Stream = Stream.drop_front(begin()->length()); }
+  void drop_front() { Skew += begin()->length(); }
 
 private:
   BinaryStreamRef Stream;