From a05ae9db01ac7d8f32f4ba52f74c1c447eb7acdd Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Thu, 13 Dec 2018 18:11:33 +0000 Subject: [PATCH] Correctly handle skewed streams in drop_front() method. 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 | 5 ++++- llvm/include/llvm/Support/BinaryStreamArray.h | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp index ccce0e711c1b..9c3ff4e7f89b 100644 --- a/lld/COFF/PDB.cpp +++ b/lld/COFF/PDB.cpp @@ -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. diff --git a/llvm/include/llvm/Support/BinaryStreamArray.h b/llvm/include/llvm/Support/BinaryStreamArray.h index 049cf56f4f30..7c110fcb6a4b 100644 --- a/llvm/include/llvm/Support/BinaryStreamArray.h +++ b/llvm/include/llvm/Support/BinaryStreamArray.h @@ -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;