summaryrefslogtreecommitdiffstats
path: root/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp')
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp49
1 files changed, 26 insertions, 23 deletions
diff --git a/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp
index 90bc2a2e556..ae3faa700c1 100644
--- a/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp
+++ b/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp
@@ -93,19 +93,17 @@ Error loadSectionContribs(FixedStreamArray<ContribType> &Output,
return Error::success();
}
-DbiStream::DbiStream(PDBFile &File)
- : Pdb(File),
- Stream(llvm::make_unique<IndexedStreamData>(StreamDBI, File), File),
- Header(nullptr) {
+DbiStream::DbiStream(PDBFile &File, std::unique_ptr<MappedBlockStream> Stream)
+ : Pdb(File), Stream(std::move(Stream)), Header(nullptr) {
static_assert(sizeof(HeaderInfo) == 64, "Invalid HeaderInfo size!");
}
DbiStream::~DbiStream() {}
Error DbiStream::reload() {
- StreamReader Reader(Stream);
+ StreamReader Reader(*Stream);
- if (Stream.getLength() < sizeof(HeaderInfo))
+ if (Stream->getLength() < sizeof(HeaderInfo))
return make_error<RawError>(raw_error_code::corrupt_file,
"DBI Stream does not contain a header.");
if (auto EC = Reader.readObject(Header))
@@ -123,15 +121,15 @@ Error DbiStream::reload() {
return make_error<RawError>(raw_error_code::feature_unsupported,
"Unsupported DBI version.");
- auto InfoStream = Pdb.getPDBInfoStream();
- if (auto EC = InfoStream.takeError())
- return EC;
+ auto IS = Pdb.getPDBInfoStream();
+ if (!IS)
+ return IS.takeError();
- if (Header->Age != InfoStream.get().getAge())
+ if (Header->Age != IS->getAge())
return make_error<RawError>(raw_error_code::corrupt_file,
"DBI Age does not match PDB Age.");
- if (Stream.getLength() !=
+ if (Stream->getLength() !=
sizeof(HeaderInfo) + Header->ModiSubstreamSize +
Header->SecContrSubstreamSize + Header->SectionMapSize +
Header->FileInfoSize + Header->TypeServerSize +
@@ -296,19 +294,22 @@ Error DbiStream::initializeSectionHeadersData() {
if (StreamNum >= Pdb.getNumStreams())
return make_error<RawError>(raw_error_code::no_stream);
- SectionHeaderStream.reset(new MappedBlockStream(
- llvm::make_unique<IndexedStreamData>(StreamNum, Pdb), Pdb));
+ auto SHS = MappedBlockStream::createIndexedStream(StreamNum, Pdb);
+ if (!SHS)
+ return SHS.takeError();
- size_t StreamLen = SectionHeaderStream->getLength();
+ size_t StreamLen = (*SHS)->getLength();
if (StreamLen % sizeof(object::coff_section))
return make_error<RawError>(raw_error_code::corrupt_file,
"Corrupted section header stream.");
size_t NumSections = StreamLen / sizeof(object::coff_section);
- codeview::StreamReader Reader(*SectionHeaderStream);
+ codeview::StreamReader Reader(**SHS);
if (auto EC = Reader.readArray(SectionHeaders, NumSections))
return make_error<RawError>(raw_error_code::corrupt_file,
"Could not read a bitmap.");
+
+ SectionHeaderStream = std::move(*SHS);
return Error::success();
}
@@ -318,19 +319,21 @@ Error DbiStream::initializeFpoRecords() {
if (StreamNum >= Pdb.getNumStreams())
return make_error<RawError>(raw_error_code::no_stream);
- FpoStream.reset(new MappedBlockStream(
- llvm::make_unique<IndexedStreamData>(StreamNum, Pdb), Pdb));
+ auto FS = MappedBlockStream::createIndexedStream(StreamNum, Pdb);
+ if (!FS)
+ return FS.takeError();
- size_t StreamLen = FpoStream->getLength();
+ size_t StreamLen = (*FS)->getLength();
if (StreamLen % sizeof(object::FpoData))
return make_error<RawError>(raw_error_code::corrupt_file,
"Corrupted New FPO stream.");
size_t NumRecords = StreamLen / sizeof(object::FpoData);
- codeview::StreamReader Reader(*FpoStream);
+ codeview::StreamReader Reader(**FS);
if (auto EC = Reader.readArray(FpoRecords, NumRecords))
return make_error<RawError>(raw_error_code::corrupt_file,
"Corrupted New FPO stream.");
+ FpoStream = std::move(*FS);
return Error::success();
}
@@ -418,10 +421,10 @@ Error DbiStream::initializeFileInfo() {
uint32_t NumFiles = ModFileCountArray[I];
ModuleInfos[I].SourceFiles.resize(NumFiles);
for (size_t J = 0; J < NumFiles; ++J, ++NextFileIndex) {
- if (auto Name = getFileNameForIndex(NextFileIndex))
- ModuleInfos[I].SourceFiles[J] = Name.get();
- else
- return Name.takeError();
+ auto ThisName = getFileNameForIndex(NextFileIndex);
+ if (!ThisName)
+ return ThisName.takeError();
+ ModuleInfos[I].SourceFiles[J] = *ThisName;
}
}
OpenPOWER on IntegriCloud