summaryrefslogtreecommitdiffstats
path: root/llvm/lib/DebugInfo/PDB
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/DebugInfo/PDB')
-rw-r--r--llvm/lib/DebugInfo/PDB/CMakeLists.txt1
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp11
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/IndexedStreamData.cpp25
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/InfoStream.cpp4
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/MappedBlockStream.cpp25
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp7
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp155
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp4
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp6
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp10
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp.rej11
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);
OpenPOWER on IntegriCloud