PDBFileBuilder supports two different ways to create files.
One is PDBFileBuilder::commit. That function takes a filename
and write a result to the file. The other is PDBFileBuilder::build.
That returns a new PDBFile object.
This patch removes the latter because no one is using it and
in a real life situation we are very unlikely to need it.
Even if you need it, it'd be easy to write a new PDB to a memory
buffer and read it back.
Removing PDBFileBuilder::build enables us to remove other classes
build transitively.
Differential Revision: https://reviews.llvm.org/D26987
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@287697
91177308-0d34-0410-b5e6-
96231b3b80d8
Error finalizeMsfLayout();
- Expected<std::unique_ptr<DbiStream>> build(PDBFile &File);
Error commit(const msf::MSFLayout &Layout,
const msf::WritableStream &Buffer);
Error finalizeMsfLayout();
- Expected<std::unique_ptr<InfoStream>> build(PDBFile &File);
-
Error commit(const msf::MSFLayout &Layout,
const msf::WritableStream &Buffer) const;
TpiStreamBuilder &getTpiBuilder();
TpiStreamBuilder &getIpiBuilder();
- Expected<std::unique_ptr<PDBFile>>
- build(std::unique_ptr<msf::WritableStream> PdbFileBuffer);
-
Error commit(StringRef Filename);
private:
Error finalizeMsfLayout();
- Expected<std::unique_ptr<TpiStream>> build(PDBFile &File);
-
Error commit(const msf::MSFLayout &Layout, const msf::WritableStream &Buffer);
uint32_t calculateSerializedLength() const;
return Ret;
}
-Expected<std::unique_ptr<DbiStream>>
-DbiStreamBuilder::build(PDBFile &File) {
- if (!VerHeader.hasValue())
- return make_error<RawError>(raw_error_code::unspecified,
- "Missing DBI Stream Version");
- if (auto EC = finalize())
- return std::move(EC);
-
- auto StreamData = MappedBlockStream::createIndexedStream(
- File.getMsfLayout(), File.getMsfBuffer(), StreamDBI);
- auto Dbi = llvm::make_unique<DbiStream>(File, std::move(StreamData));
- Dbi->Header = Header;
- Dbi->FileInfoSubstream = ReadableStreamRef(FileInfoBuffer);
- Dbi->ModInfoSubstream = ReadableStreamRef(ModInfoBuffer);
- if (auto EC = Dbi->initializeModInfoArray())
- return std::move(EC);
- if (auto EC = Dbi->initializeFileInfo())
- return std::move(EC);
- return std::move(Dbi);
-}
-
Error DbiStreamBuilder::commit(const msf::MSFLayout &Layout,
const msf::WritableStream &Buffer) {
if (auto EC = finalize())
return Error::success();
}
-Expected<std::unique_ptr<InfoStream>>
-InfoStreamBuilder::build(PDBFile &File) {
- auto StreamData = MappedBlockStream::createIndexedStream(
- File.getMsfLayout(), File.getMsfBuffer(), StreamPDB);
- auto Info = llvm::make_unique<InfoStream>(std::move(StreamData));
- Info->Version = Ver;
- Info->Signature = Sig;
- Info->Age = Age;
- Info->Guid = Guid;
- auto NS = NamedStreams.build();
- if (!NS)
- return NS.takeError();
- Info->NamedStreams = **NS;
- return std::move(Info);
-}
-
Error InfoStreamBuilder::commit(const msf::MSFLayout &Layout,
const msf::WritableStream &Buffer) const {
auto InfoS =
return Msf->build();
}
-Expected<std::unique_ptr<PDBFile>>
-PDBFileBuilder::build(std::unique_ptr<msf::WritableStream> PdbFileBuffer) {
- auto ExpectedLayout = finalizeMsfLayout();
- if (!ExpectedLayout)
- return ExpectedLayout.takeError();
-
- auto File = llvm::make_unique<PDBFile>(std::move(PdbFileBuffer), Allocator);
- File->ContainerLayout = *ExpectedLayout;
-
- if (Info) {
- auto ExpectedInfo = Info->build(*File);
- if (!ExpectedInfo)
- return ExpectedInfo.takeError();
- File->Info = std::move(*ExpectedInfo);
- }
-
- if (Dbi) {
- auto ExpectedDbi = Dbi->build(*File);
- if (!ExpectedDbi)
- return ExpectedDbi.takeError();
- File->Dbi = std::move(*ExpectedDbi);
- }
-
- if (Tpi) {
- auto ExpectedTpi = Tpi->build(*File);
- if (!ExpectedTpi)
- return ExpectedTpi.takeError();
- File->Tpi = std::move(*ExpectedTpi);
- }
-
- if (Ipi) {
- auto ExpectedIpi = Ipi->build(*File);
- if (!ExpectedIpi)
- return ExpectedIpi.takeError();
- File->Ipi = std::move(*ExpectedIpi);
- }
-
- if (File->Info && File->Dbi && File->Info->getAge() != File->Dbi->getAge())
- return llvm::make_error<RawError>(
- raw_error_code::corrupt_file,
- "PDB Stream Age doesn't match Dbi Stream Age!");
-
- return std::move(File);
-}
-
Error PDBFileBuilder::commit(StringRef Filename) {
auto ExpectedLayout = finalizeMsfLayout();
if (!ExpectedLayout)
return Error::success();
}
-Expected<std::unique_ptr<TpiStream>> TpiStreamBuilder::build(PDBFile &File) {
- if (!VerHeader.hasValue())
- return make_error<RawError>(raw_error_code::unspecified,
- "Missing TPI Stream Version");
- if (auto EC = finalize())
- return std::move(EC);
-
- auto StreamData = MappedBlockStream::createIndexedStream(
- File.getMsfLayout(), File.getMsfBuffer(), Idx);
- auto Tpi = llvm::make_unique<TpiStream>(File, std::move(StreamData));
- Tpi->Header = Header;
- Tpi->TypeRecords = VarStreamArray<codeview::CVType>(TypeRecordStream);
- if (HashValueStream) {
- Tpi->HashStream = std::move(HashValueStream);
- StreamReader HSR(*Tpi->HashStream);
- if (auto EC = HSR.readArray(Tpi->HashValues, TypeRecords.size()))
- return std::move(EC);
- }
- return std::move(Tpi);
-}
-
Error TpiStreamBuilder::commit(const msf::MSFLayout &Layout,
const msf::WritableStream &Buffer) {
if (auto EC = finalize())