diff options
Diffstat (limited to 'llvm/lib/DebugInfo/PDB')
-rw-r--r-- | llvm/lib/DebugInfo/PDB/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp | 11 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/IndexedStreamData.cpp | 25 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/InfoStream.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/MappedBlockStream.cpp | 25 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp | 7 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp | 155 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp | 10 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp.rej | 11 |
11 files changed, 134 insertions, 125 deletions
diff --git a/llvm/lib/DebugInfo/PDB/CMakeLists.txt b/llvm/lib/DebugInfo/PDB/CMakeLists.txt index 46074f769cd..336729d3543 100644 --- a/llvm/lib/DebugInfo/PDB/CMakeLists.txt +++ b/llvm/lib/DebugInfo/PDB/CMakeLists.txt @@ -30,6 +30,7 @@ endif() add_pdb_impl_folder(Raw Raw/DbiStream.cpp Raw/EnumTables.cpp + Raw/IndexedStreamData.cpp Raw/InfoStream.cpp Raw/MappedBlockStream.cpp Raw/ModInfo.cpp diff --git a/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp index b1c571bf78c..80441ccd825 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp @@ -12,6 +12,7 @@ #include "llvm/DebugInfo/CodeView/StreamArray.h" #include "llvm/DebugInfo/CodeView/StreamReader.h" #include "llvm/DebugInfo/PDB/Raw/ISectionContribVisitor.h" +#include "llvm/DebugInfo/PDB/Raw/IndexedStreamData.h" #include "llvm/DebugInfo/PDB/Raw/InfoStream.h" #include "llvm/DebugInfo/PDB/Raw/ModInfo.h" #include "llvm/DebugInfo/PDB/Raw/NameHashTable.h" @@ -93,7 +94,9 @@ Error loadSectionContribs(FixedStreamArray<ContribType> &Output, } DbiStream::DbiStream(PDBFile &File) - : Pdb(File), Stream(StreamDBI, File), Header(nullptr) { + : Pdb(File), + Stream(llvm::make_unique<IndexedStreamData>(StreamDBI, File), File), + Header(nullptr) { static_assert(sizeof(HeaderInfo) == 64, "Invalid HeaderInfo size!"); } @@ -290,7 +293,8 @@ Error DbiStream::initializeSectionContributionData() { // Initializes this->SectionHeaders. Error DbiStream::initializeSectionHeadersData() { uint32_t StreamNum = getDebugStreamIndex(DbgHeaderType::SectionHdr); - SectionHeaderStream.reset(new MappedBlockStream(StreamNum, Pdb)); + SectionHeaderStream.reset(new MappedBlockStream( + llvm::make_unique<IndexedStreamData>(StreamNum, Pdb), Pdb)); size_t StreamLen = SectionHeaderStream->getLength(); if (StreamLen % sizeof(object::coff_section)) @@ -308,7 +312,8 @@ Error DbiStream::initializeSectionHeadersData() { // Initializes this->Fpos. Error DbiStream::initializeFpoRecords() { uint32_t StreamNum = getDebugStreamIndex(DbgHeaderType::NewFPO); - FpoStream.reset(new MappedBlockStream(StreamNum, Pdb)); + FpoStream.reset(new MappedBlockStream( + llvm::make_unique<IndexedStreamData>(StreamNum, Pdb), Pdb)); size_t StreamLen = FpoStream->getLength(); if (StreamLen % sizeof(object::FpoData)) diff --git a/llvm/lib/DebugInfo/PDB/Raw/IndexedStreamData.cpp b/llvm/lib/DebugInfo/PDB/Raw/IndexedStreamData.cpp new file mode 100644 index 00000000000..9bd16ea76ef --- /dev/null +++ b/llvm/lib/DebugInfo/PDB/Raw/IndexedStreamData.cpp @@ -0,0 +1,25 @@ +//===- IndexedStreamData.cpp - Standard PDB Stream Data ---------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/DebugInfo/PDB/Raw/IndexedStreamData.h" +#include "llvm/DebugInfo/PDB/Raw/IPDBFile.h" + +using namespace llvm; +using namespace llvm::pdb; + +IndexedStreamData::IndexedStreamData(uint32_t StreamIdx, const IPDBFile &File) + : StreamIdx(StreamIdx), File(File) {} + +uint32_t IndexedStreamData::getLength() { + return File.getStreamByteSize(StreamIdx); +} + +ArrayRef<support::ulittle32_t> IndexedStreamData::getStreamBlocks() { + return File.getStreamBlockList(StreamIdx); +} diff --git a/llvm/lib/DebugInfo/PDB/Raw/InfoStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/InfoStream.cpp index 4388ed41664..0f2fd24395c 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/InfoStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/InfoStream.cpp @@ -11,6 +11,7 @@ #include "llvm/ADT/BitVector.h" #include "llvm/ADT/SmallVector.h" #include "llvm/DebugInfo/CodeView/StreamReader.h" +#include "llvm/DebugInfo/PDB/Raw/IndexedStreamData.h" #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" #include "llvm/DebugInfo/PDB/Raw/RawConstants.h" #include "llvm/DebugInfo/PDB/Raw/RawError.h" @@ -18,7 +19,8 @@ using namespace llvm; using namespace llvm::pdb; -InfoStream::InfoStream(PDBFile &File) : Pdb(File), Stream(StreamPDB, File) {} +InfoStream::InfoStream(const PDBFile &File) + : Stream(llvm::make_unique<IndexedStreamData>(StreamPDB, File), File) {} Error InfoStream::reload() { codeview::StreamReader Reader(Stream); diff --git a/llvm/lib/DebugInfo/PDB/Raw/MappedBlockStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/MappedBlockStream.cpp index 34d16712271..03462b38863 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/MappedBlockStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/MappedBlockStream.cpp @@ -8,28 +8,23 @@ //===----------------------------------------------------------------------===// #include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h" +#include "llvm/DebugInfo/PDB/Raw/IPDBStreamData.h" #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" #include "llvm/DebugInfo/PDB/Raw/RawError.h" using namespace llvm; using namespace llvm::pdb; -MappedBlockStream::MappedBlockStream(uint32_t StreamIdx, const IPDBFile &File) - : Pdb(File) { - if (StreamIdx >= Pdb.getNumStreams()) { - StreamLength = 0; - } else { - StreamLength = Pdb.getStreamByteSize(StreamIdx); - BlockList = Pdb.getStreamBlockList(StreamIdx); - } -} +MappedBlockStream::MappedBlockStream(std::unique_ptr<IPDBStreamData> Data, + const IPDBFile &Pdb) + : Pdb(Pdb), Data(std::move(Data)) {} Error MappedBlockStream::readBytes(uint32_t Offset, uint32_t Size, ArrayRef<uint8_t> &Buffer) const { // Make sure we aren't trying to read beyond the end of the stream. - if (Size > StreamLength) + if (Size > Data->getLength()) return make_error<RawError>(raw_error_code::insufficient_buffer); - if (Offset > StreamLength - Size) + if (Offset > Data->getLength() - Size) return make_error<RawError>(raw_error_code::insufficient_buffer); if (tryReadContiguously(Offset, Size, Buffer)) @@ -57,6 +52,8 @@ Error MappedBlockStream::readBytes(uint32_t Offset, uint32_t Size, return Error::success(); } +uint32_t MappedBlockStream::getLength() const { return Data->getLength(); } + bool MappedBlockStream::tryReadContiguously(uint32_t Offset, uint32_t Size, ArrayRef<uint8_t> &Buffer) const { // Attempt to fulfill the request with a reference directly into the stream. @@ -72,6 +69,7 @@ bool MappedBlockStream::tryReadContiguously(uint32_t Offset, uint32_t Size, llvm::alignTo(Size - BytesFromFirstBlock, Pdb.getBlockSize()) / Pdb.getBlockSize(); + auto BlockList = Data->getStreamBlocks(); uint32_t RequiredContiguousBlocks = NumAdditionalBlocks + 1; uint32_t E = BlockList[BlockNum]; for (uint32_t I = 0; I < RequiredContiguousBlocks; ++I, ++E) { @@ -93,14 +91,15 @@ Error MappedBlockStream::readBytes(uint32_t Offset, uint32_t OffsetInBlock = Offset % Pdb.getBlockSize(); // Make sure we aren't trying to read beyond the end of the stream. - if (Buffer.size() > StreamLength) + if (Buffer.size() > Data->getLength()) return make_error<RawError>(raw_error_code::insufficient_buffer); - if (Offset > StreamLength - Buffer.size()) + if (Offset > Data->getLength() - Buffer.size()) return make_error<RawError>(raw_error_code::insufficient_buffer); uint32_t BytesLeft = Buffer.size(); uint32_t BytesWritten = 0; uint8_t *WriteBuffer = Buffer.data(); + auto BlockList = Data->getStreamBlocks(); while (BytesLeft > 0) { uint32_t StreamBlockAddr = BlockList[BlockNum]; diff --git a/llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp index 14c55906e06..57c455e0a00 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp @@ -10,6 +10,7 @@ #include "llvm/DebugInfo/PDB/Raw/ModStream.h" #include "llvm/DebugInfo/CodeView/StreamReader.h" +#include "llvm/DebugInfo/PDB/Raw/IndexedStreamData.h" #include "llvm/DebugInfo/PDB/Raw/ModInfo.h" #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" #include "llvm/DebugInfo/PDB/Raw/RawError.h" @@ -18,8 +19,10 @@ using namespace llvm; using namespace llvm::pdb; -ModStream::ModStream(PDBFile &File, const ModInfo &Module) - : Mod(Module), Stream(Module.getModuleStreamIndex(), File) {} +ModStream::ModStream(const PDBFile &File, const ModInfo &Module) + : Mod(Module), Stream(llvm::make_unique<IndexedStreamData>( + Module.getModuleStreamIndex(), File), + File) {} ModStream::~ModStream() {} diff --git a/llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp b/llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp index 73d8eef570f..81762e7f879 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp @@ -8,8 +8,12 @@ //===----------------------------------------------------------------------===// #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" + #include "llvm/ADT/ArrayRef.h" +#include "llvm/DebugInfo/CodeView/StreamArray.h" +#include "llvm/DebugInfo/CodeView/StreamReader.h" #include "llvm/DebugInfo/PDB/Raw/DbiStream.h" +#include "llvm/DebugInfo/PDB/Raw/IndexedStreamData.h" #include "llvm/DebugInfo/PDB/Raw/InfoStream.h" #include "llvm/DebugInfo/PDB/Raw/NameHashTable.h" #include "llvm/DebugInfo/PDB/Raw/PublicsStream.h" @@ -49,13 +53,28 @@ struct SuperBlock { // This contains the block # of the block map. support::ulittle32_t BlockMapAddr; }; + +class DirectoryStreamData : public IPDBStreamData { +public: + DirectoryStreamData(const PDBFile &File) : File(File) {} + + virtual uint32_t getLength() { return File.getNumDirectoryBytes(); } + virtual llvm::ArrayRef<llvm::support::ulittle32_t> getStreamBlocks() { + return File.getDirectoryBlockArray(); + } + +private: + const PDBFile &File; +}; + +typedef codeview::FixedStreamArray<support::ulittle32_t> ulittle_array; } struct llvm::pdb::PDBFileContext { std::unique_ptr<MemoryBuffer> Buffer; const SuperBlock *SB; - std::vector<uint32_t> StreamSizes; - DenseMap<uint32_t, std::vector<uint32_t>> StreamMap; + ArrayRef<support::ulittle32_t> StreamSizes; + std::vector<ulittle_array> StreamMap; }; static Error checkOffset(MemoryBufferRef M, uintptr_t Addr, @@ -109,10 +128,14 @@ uint32_t PDBFile::getStreamByteSize(uint32_t StreamIndex) const { return Context->StreamSizes[StreamIndex]; } -llvm::ArrayRef<uint32_t> +ArrayRef<support::ulittle32_t> PDBFile::getStreamBlockList(uint32_t StreamIndex) const { - auto &Data = Context->StreamMap[StreamIndex]; - return llvm::ArrayRef<uint32_t>(Data); + auto Result = Context->StreamMap[StreamIndex]; + codeview::StreamReader Reader(Result.getUnderlyingStream()); + ArrayRef<support::ulittle32_t> Array; + if (auto EC = Reader.readArray(Array, Result.size())) + return ArrayRef<support::ulittle32_t>(); + return Array; } StringRef PDBFile::getBlockData(uint32_t BlockIndex, uint32_t NumBytes) const { @@ -184,113 +207,44 @@ Error PDBFile::parseFileHeaders() { Error PDBFile::parseStreamData() { assert(Context && Context->SB); + if (DirectoryStream) + return Error::success(); - bool SeenNumStreams = false; + // bool SeenNumStreams = false; uint32_t NumStreams = 0; - uint32_t StreamIdx = 0; - uint64_t DirectoryBytesRead = 0; + // uint32_t StreamIdx = 0; + // uint64_t DirectoryBytesRead = 0; - MemoryBufferRef M = *Context->Buffer; const SuperBlock *SB = Context->SB; - auto DirectoryBlocks = getDirectoryBlockArray(); - - // The structure of the directory is as follows: - // struct PDBDirectory { - // uint32_t NumStreams; - // uint32_t StreamSizes[NumStreams]; - // uint32_t StreamMap[NumStreams][]; - // }; - // - // Empty streams don't consume entries in the StreamMap. - for (uint32_t DirectoryBlockAddr : DirectoryBlocks) { - uint64_t DirectoryBlockOffset = - blockToOffset(DirectoryBlockAddr, SB->BlockSize); - auto DirectoryBlock = - makeArrayRef(reinterpret_cast<const support::ulittle32_t *>( - M.getBufferStart() + DirectoryBlockOffset), - SB->BlockSize / sizeof(support::ulittle32_t)); - if (auto EC = checkOffset(M, DirectoryBlock)) - return EC; - - // We read data out of the directory four bytes at a time. Depending on - // where we are in the directory, the contents may be: the number of streams - // in the directory, a stream's size, or a block in the stream map. - for (uint32_t Data : DirectoryBlock) { - // Don't read beyond the end of the directory. - if (DirectoryBytesRead == SB->NumDirectoryBytes) - break; - - DirectoryBytesRead += sizeof(Data); - - // This data must be the number of streams if we haven't seen it yet. - if (!SeenNumStreams) { - NumStreams = Data; - SeenNumStreams = true; - continue; - } - // This data must be a stream size if we have not seen them all yet. - if (Context->StreamSizes.size() < NumStreams) { - // It seems like some streams have their set to -1 when their contents - // are not present. Treat them like empty streams for now. - if (Data == UINT32_MAX) - Context->StreamSizes.push_back(0); - else - Context->StreamSizes.push_back(Data); - continue; - } - - // This data must be a stream block number if we have seen all of the - // stream sizes. - std::vector<uint32_t> *StreamBlocks = nullptr; - // Figure out which stream this block number belongs to. - while (StreamIdx < NumStreams) { - uint64_t NumExpectedStreamBlocks = - bytesToBlocks(Context->StreamSizes[StreamIdx], SB->BlockSize); - StreamBlocks = &Context->StreamMap[StreamIdx]; - if (NumExpectedStreamBlocks > StreamBlocks->size()) - break; - ++StreamIdx; - } - // It seems this block doesn't belong to any stream? The stream is either - // corrupt or something more mysterious is going on. - if (StreamIdx == NumStreams) - return make_error<RawError>(raw_error_code::corrupt_file, - "Orphaned block found?"); - - uint64_t BlockOffset = blockToOffset(Data, getBlockSize()); - if (BlockOffset + getBlockSize() < BlockOffset) - return make_error<RawError>(raw_error_code::corrupt_file, - "Bogus stream block number"); - if (BlockOffset + getBlockSize() > M.getBufferSize()) - return make_error<RawError>(raw_error_code::corrupt_file, - "Stream block number is out of bounds"); - - StreamBlocks->push_back(Data); - } - } - - if (Context->StreamSizes.size() != NumStreams) - return make_error<RawError>( - raw_error_code::corrupt_file, - "The directory has fewer streams then expected"); + // Normally you can't use a MappedBlockStream without having fully parsed the + // PDB file, because it accesses the directory and various other things, which + // is exactly what we are attempting to parse. By specifying a custom + // subclass of IPDBStreamData which only accesses the fields that have already + // been parsed, we can avoid this and reuse MappedBlockStream. + auto SD = llvm::make_unique<DirectoryStreamData>(*this); + DirectoryStream = llvm::make_unique<MappedBlockStream>(std::move(SD), *this); + codeview::StreamReader Reader(*DirectoryStream); + if (auto EC = Reader.readInteger(NumStreams)) + return EC; - for (uint32_t I = 0; I != NumStreams; ++I) { + if (auto EC = Reader.readArray(Context->StreamSizes, NumStreams)) + return EC; + for (uint32_t I = 0; I < NumStreams; ++I) { uint64_t NumExpectedStreamBlocks = - bytesToBlocks(getStreamByteSize(I), getBlockSize()); - size_t NumStreamBlocks = getStreamBlockList(I).size(); - if (NumExpectedStreamBlocks != NumStreamBlocks) - return make_error<RawError>(raw_error_code::corrupt_file, - "The number of stream blocks is not " - "sufficient for the size of this stream"); + bytesToBlocks(getStreamByteSize(I), SB->BlockSize); + ulittle_array Blocks; + if (auto EC = Reader.readArray(Blocks, NumExpectedStreamBlocks)) + return EC; + Context->StreamMap.push_back(Blocks); } // We should have read exactly SB->NumDirectoryBytes bytes. - assert(DirectoryBytesRead == SB->NumDirectoryBytes); + assert(Reader.bytesRemaining() == 0); return Error::success(); } -llvm::ArrayRef<support::ulittle32_t> PDBFile::getDirectoryBlockArray() { +llvm::ArrayRef<support::ulittle32_t> PDBFile::getDirectoryBlockArray() const { return makeArrayRef( reinterpret_cast<const support::ulittle32_t *>( Context->Buffer->getBufferStart() + getBlockMapOffset()), @@ -371,7 +325,8 @@ Expected<NameHashTable &> PDBFile::getStringTable() { if (NameStreamIndex == 0) return make_error<RawError>(raw_error_code::no_stream); - auto S = llvm::make_unique<MappedBlockStream>(NameStreamIndex, *this); + auto SD = llvm::make_unique<IndexedStreamData>(NameStreamIndex, *this); + auto S = llvm::make_unique<MappedBlockStream>(std::move(SD), *this); codeview::StreamReader Reader(*S); auto N = llvm::make_unique<NameHashTable>(); if (auto EC = N->load(Reader)) diff --git a/llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp index d3a7ffd7f93..e3e100806ee 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp @@ -27,6 +27,7 @@ #include "llvm/DebugInfo/CodeView/CodeView.h" #include "llvm/DebugInfo/CodeView/StreamReader.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" +#include "llvm/DebugInfo/PDB/Raw/IndexedStreamData.h" #include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h" #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" #include "llvm/DebugInfo/PDB/Raw/RawConstants.h" @@ -71,7 +72,8 @@ struct PublicsStream::GSIHashHeader { }; PublicsStream::PublicsStream(PDBFile &File, uint32_t StreamNum) - : Pdb(File), StreamNum(StreamNum), Stream(StreamNum, File) {} + : Pdb(File), StreamNum(StreamNum), + Stream(llvm::make_unique<IndexedStreamData>(StreamNum, File), File) {} PublicsStream::~PublicsStream() {} diff --git a/llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp index 8b358b04f68..b6267a7f3f4 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp @@ -12,6 +12,7 @@ #include "llvm/DebugInfo/CodeView/CodeView.h" #include "llvm/DebugInfo/CodeView/StreamReader.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" +#include "llvm/DebugInfo/PDB/Raw/IndexedStreamData.h" #include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h" #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" #include "llvm/DebugInfo/PDB/Raw/RawConstants.h" @@ -23,8 +24,9 @@ using namespace llvm; using namespace llvm::support; using namespace llvm::pdb; -SymbolStream::SymbolStream(PDBFile &File, uint32_t StreamNum) - : MappedStream(StreamNum, File) {} +SymbolStream::SymbolStream(const PDBFile &File, uint32_t StreamNum) + : MappedStream(llvm::make_unique<IndexedStreamData>(StreamNum, File), + File) {} SymbolStream::~SymbolStream() {} diff --git a/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp index 11e10a58e5d..9d8a45ebc88 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp @@ -13,6 +13,7 @@ #include "llvm/DebugInfo/CodeView/StreamReader.h" #include "llvm/DebugInfo/CodeView/TypeIndex.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" +#include "llvm/DebugInfo/PDB/Raw/IndexedStreamData.h" #include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h" #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" #include "llvm/DebugInfo/PDB/Raw/RawConstants.h" @@ -61,8 +62,10 @@ struct TpiStream::HeaderInfo { EmbeddedBuf HashAdjBuffer; }; -TpiStream::TpiStream(PDBFile &File, uint32_t StreamIdx) - : Pdb(File), Stream(StreamIdx, File), HashFunction(nullptr) {} +TpiStream::TpiStream(const PDBFile &File, uint32_t StreamIdx) + : Pdb(File), + Stream(llvm::make_unique<IndexedStreamData>(StreamIdx, File), File), + HashFunction(nullptr) {} TpiStream::~TpiStream() {} @@ -101,7 +104,8 @@ Error TpiStream::reload() { return EC; // Hash indices, hash values, etc come from the hash stream. - HashStream.reset(new MappedBlockStream(Header->HashStreamIndex, Pdb)); + HashStream.reset(new MappedBlockStream( + llvm::make_unique<IndexedStreamData>(Header->HashStreamIndex, Pdb), Pdb)); codeview::StreamReader HSR(*HashStream); uint32_t NumHashValues = Header->HashValueBuffer.Length / sizeof(ulittle32_t); diff --git a/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp.rej b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp.rej new file mode 100644 index 00000000000..3547269eff4 --- /dev/null +++ b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp.rej @@ -0,0 +1,11 @@ +diff a/lib/DebugInfo/PDB/Raw/TpiStream.cpp b/lib/DebugInfo/PDB/Raw/TpiStream.cpp (rejected hunks) +@@ -101,7 +104,8 @@ + return EC; + + // Hash indices, hash values, etc come from the hash stream. +- HashStream.reset(new MappedBlockStream(Header->HashStreamIndex, Pdb)); ++ HashStream.reset(new MappedBlockStream( ++ llvm::make_unique<IndexedStreamData>(Header->HashStreamIndex, Pdb), Pdb)); + codeview::StreamReader HSR(*HashStream); + uint32_t NumHashValues = Header->HashValueBuffer.Length / sizeof(ulittle32_t); + HSR.setOffset(Header->HashValueBuffer.Off); |