Index: llvm/include/llvm/DebugInfo/PDB/Native/PDBFile.h =================================================================== --- llvm/include/llvm/DebugInfo/PDB/Native/PDBFile.h +++ llvm/include/llvm/DebugInfo/PDB/Native/PDBFile.h @@ -83,7 +83,10 @@ ArrayRef getDirectoryBlockArray() const; - std::unique_ptr createIndexedStream(uint16_t SN); + std::unique_ptr + createIndexedStream(uint16_t SN) const; + Expected> + safelyCreateIndexedStream(uint32_t StreamIndex) const; msf::MSFStreamLayout getStreamLayout(uint32_t StreamIdx) const; msf::MSFStreamLayout getFpmStreamLayout() const; @@ -114,11 +117,6 @@ uint32_t getPointerSize(); private: - Expected> - safelyCreateIndexedStream(const msf::MSFLayout &Layout, - BinaryStreamRef MsfData, - uint32_t StreamIndex) const; - std::string FilePath; BumpPtrAllocator &Allocator; Index: llvm/lib/DebugInfo/PDB/Native/DbiStream.cpp =================================================================== --- llvm/lib/DebugInfo/PDB/Native/DbiStream.cpp +++ llvm/lib/DebugInfo/PDB/Native/DbiStream.cpp @@ -333,15 +333,11 @@ uint32_t StreamNum = getDebugStreamIndex(Type); - // This means there is no such stream + // This means there is no such stream. if (StreamNum == kInvalidStreamIndex) return nullptr; - if (StreamNum >= Pdb->getNumStreams()) - return make_error(raw_error_code::no_stream); - - return MappedBlockStream::createIndexedStream( - Pdb->getMsfLayout(), Pdb->getMsfBuffer(), StreamNum, Pdb->getAllocator()); + return Pdb->safelyCreateIndexedStream(StreamNum); } BinarySubstreamRef DbiStream::getSectionContributionData() const { Index: llvm/lib/DebugInfo/PDB/Native/PDBFile.cpp =================================================================== --- llvm/lib/DebugInfo/PDB/Native/PDBFile.cpp +++ llvm/lib/DebugInfo/PDB/Native/PDBFile.cpp @@ -233,7 +233,8 @@ return ContainerLayout.DirectoryBlocks; } -std::unique_ptr PDBFile::createIndexedStream(uint16_t SN) { +std::unique_ptr +PDBFile::createIndexedStream(uint16_t SN) const { if (SN == kInvalidStreamIndex) return nullptr; return MappedBlockStream::createIndexedStream(ContainerLayout, *Buffer, SN, @@ -258,8 +259,8 @@ if (!DbiS) return DbiS.takeError(); - auto GlobalS = safelyCreateIndexedStream( - ContainerLayout, *Buffer, DbiS->getGlobalSymbolStreamIndex()); + auto GlobalS = + safelyCreateIndexedStream(DbiS->getGlobalSymbolStreamIndex()); if (!GlobalS) return GlobalS.takeError(); auto TempGlobals = llvm::make_unique(std::move(*GlobalS)); @@ -272,7 +273,7 @@ Expected PDBFile::getPDBInfoStream() { if (!Info) { - auto InfoS = safelyCreateIndexedStream(ContainerLayout, *Buffer, StreamPDB); + auto InfoS = safelyCreateIndexedStream(StreamPDB); if (!InfoS) return InfoS.takeError(); auto TempInfo = llvm::make_unique(std::move(*InfoS)); @@ -285,7 +286,7 @@ Expected PDBFile::getPDBDbiStream() { if (!Dbi) { - auto DbiS = safelyCreateIndexedStream(ContainerLayout, *Buffer, StreamDBI); + auto DbiS = safelyCreateIndexedStream(StreamDBI); if (!DbiS) return DbiS.takeError(); auto TempDbi = llvm::make_unique(std::move(*DbiS)); @@ -298,7 +299,7 @@ Expected PDBFile::getPDBTpiStream() { if (!Tpi) { - auto TpiS = safelyCreateIndexedStream(ContainerLayout, *Buffer, StreamTPI); + auto TpiS = safelyCreateIndexedStream(StreamTPI); if (!TpiS) return TpiS.takeError(); auto TempTpi = llvm::make_unique(*this, std::move(*TpiS)); @@ -314,7 +315,7 @@ if (!hasPDBIpiStream()) return make_error(raw_error_code::no_stream); - auto IpiS = safelyCreateIndexedStream(ContainerLayout, *Buffer, StreamIPI); + auto IpiS = safelyCreateIndexedStream(StreamIPI); if (!IpiS) return IpiS.takeError(); auto TempIpi = llvm::make_unique(*this, std::move(*IpiS)); @@ -331,8 +332,8 @@ if (!DbiS) return DbiS.takeError(); - auto PublicS = safelyCreateIndexedStream( - ContainerLayout, *Buffer, DbiS->getPublicSymbolStreamIndex()); + auto PublicS = + safelyCreateIndexedStream(DbiS->getPublicSymbolStreamIndex()); if (!PublicS) return PublicS.takeError(); auto TempPublics = llvm::make_unique(std::move(*PublicS)); @@ -350,8 +351,7 @@ return DbiS.takeError(); uint32_t SymbolStreamNum = DbiS->getSymRecordStreamIndex(); - auto SymbolS = - safelyCreateIndexedStream(ContainerLayout, *Buffer, SymbolStreamNum); + auto SymbolS = safelyCreateIndexedStream(SymbolStreamNum); if (!SymbolS) return SymbolS.takeError(); @@ -374,8 +374,7 @@ return ExpectedNSI.takeError(); uint32_t NameStreamIndex = *ExpectedNSI; - auto NS = - safelyCreateIndexedStream(ContainerLayout, *Buffer, NameStreamIndex); + auto NS = safelyCreateIndexedStream(NameStreamIndex); if (!NS) return NS.takeError(); @@ -463,11 +462,9 @@ /// will have an MSFError with code msf_error_code::no_stream. Else, the return /// value will contain the stream returned by createIndexedStream(). Expected> -PDBFile::safelyCreateIndexedStream(const MSFLayout &Layout, - BinaryStreamRef MsfData, - uint32_t StreamIndex) const { +PDBFile::safelyCreateIndexedStream(uint32_t StreamIndex) const { if (StreamIndex >= getNumStreams()) + // This rejects kInvalidStreamIndex with an error as well. return make_error(raw_error_code::no_stream); - return MappedBlockStream::createIndexedStream(Layout, MsfData, StreamIndex, - Allocator); + return createIndexedStream(StreamIndex); } Index: llvm/lib/DebugInfo/PDB/Native/TpiStream.cpp =================================================================== --- llvm/lib/DebugInfo/PDB/Native/TpiStream.cpp +++ llvm/lib/DebugInfo/PDB/Native/TpiStream.cpp @@ -78,14 +78,13 @@ // Hash indices, hash values, etc come from the hash stream. if (Header->HashStreamIndex != kInvalidStreamIndex) { - if (Header->HashStreamIndex >= Pdb.getNumStreams()) + auto HS = Pdb.safelyCreateIndexedStream(Header->HashStreamIndex); + if (!HS) { + consumeError(HS.takeError()); return make_error(raw_error_code::corrupt_file, "Invalid TPI hash stream index."); - - auto HS = MappedBlockStream::createIndexedStream( - Pdb.getMsfLayout(), Pdb.getMsfBuffer(), Header->HashStreamIndex, - Pdb.getAllocator()); - BinaryStreamReader HSR(*HS); + } + BinaryStreamReader HSR(**HS); // There should be a hash value for every type record, or no hashes at all. uint32_t NumHashValues = @@ -110,7 +109,7 @@ return EC; } - HashStream = std::move(HS); + HashStream = std::move(*HS); } Types = llvm::make_unique( Index: llvm/tools/llvm-pdbutil/BytesOutputStyle.cpp =================================================================== --- llvm/tools/llvm-pdbutil/BytesOutputStyle.cpp +++ llvm/tools/llvm-pdbutil/BytesOutputStyle.cpp @@ -340,9 +340,7 @@ if (ModiStream == kInvalidStreamIndex) return; - auto ModStreamData = MappedBlockStream::createIndexedStream( - File.getMsfLayout(), File.getMsfBuffer(), ModiStream, - File.getAllocator()); + auto ModStreamData = File.createIndexedStream(ModiStream); ModuleDebugStreamRef ModStream(Modi, std::move(ModStreamData)); if (auto EC = ModStream.reload()) { P.formatLine("Could not parse debug information."); Index: llvm/tools/llvm-pdbutil/LinePrinter.cpp =================================================================== --- llvm/tools/llvm-pdbutil/LinePrinter.cpp +++ llvm/tools/llvm-pdbutil/LinePrinter.cpp @@ -186,8 +186,7 @@ return; } - auto S = MappedBlockStream::createIndexedStream( - File.getMsfLayout(), File.getMsfBuffer(), StreamIdx, File.getAllocator()); + auto S = File.createIndexedStream(StreamIdx); if (!S) { NewLine(); formatLine("Stream {0}: Not present", StreamIdx); Index: llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp =================================================================== --- llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp +++ llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp @@ -231,10 +231,7 @@ if (ModiStream == kInvalidStreamIndex) continue; - auto ModStreamData = msf::MappedBlockStream::createIndexedStream( - File.getMsfLayout(), File.getMsfBuffer(), ModiStream, - File.getAllocator()); - + auto ModStreamData = File.createIndexedStream(ModiStream); pdb::ModuleDebugStreamRef ModS(MI, std::move(ModStreamData)); if (auto EC = ModS.reload()) return EC; Index: llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp =================================================================== --- llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp +++ llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp @@ -1384,8 +1384,7 @@ << "' (index " << Index << ") to file " << OutFileName << ".\n"; } - SourceStream = MappedBlockStream::createIndexedStream( - File.getMsfLayout(), File.getMsfBuffer(), Index, File.getAllocator()); + SourceStream = File.createIndexedStream(Index); auto OutFile = ExitOnErr( FileOutputBuffer::create(OutFileName, SourceStream->getLength())); FileBufferByteStream DestStream(std::move(OutFile), llvm::support::little);