From: Zachary Turner Date: Thu, 15 Sep 2016 18:22:31 +0000 (+0000) Subject: [pdb] Write the IPI stream. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5fa3c5202b507739b05c96811a6b035e50f0804a;p=llvm [pdb] Write the IPI stream. The IPI stream is structurally identical to the TPI stream, but it contains different record types. So we just re-use the TPI writing code. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281638 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h b/include/llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h index 2107430f219..52170a447d1 100644 --- a/include/llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h +++ b/include/llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h @@ -42,6 +42,7 @@ public: InfoStreamBuilder &getInfoBuilder(); DbiStreamBuilder &getDbiBuilder(); TpiStreamBuilder &getTpiBuilder(); + TpiStreamBuilder &getIpiBuilder(); Expected> build(std::unique_ptr PdbFileBuffer); @@ -57,6 +58,7 @@ private: std::unique_ptr Info; std::unique_ptr Dbi; std::unique_ptr Tpi; + std::unique_ptr Ipi; }; } } diff --git a/include/llvm/DebugInfo/PDB/Raw/TpiStreamBuilder.h b/include/llvm/DebugInfo/PDB/Raw/TpiStreamBuilder.h index 7329bf81152..2248fc8875b 100644 --- a/include/llvm/DebugInfo/PDB/Raw/TpiStreamBuilder.h +++ b/include/llvm/DebugInfo/PDB/Raw/TpiStreamBuilder.h @@ -45,7 +45,7 @@ struct TpiStreamHeader; class TpiStreamBuilder { public: - explicit TpiStreamBuilder(msf::MSFBuilder &Msf); + explicit TpiStreamBuilder(msf::MSFBuilder &Msf, uint32_t StreamIdx); ~TpiStreamBuilder(); TpiStreamBuilder(const TpiStreamBuilder &) = delete; @@ -77,6 +77,7 @@ private: std::unique_ptr HashValueStream; const TpiStreamHeader *Header; + uint32_t Idx; }; } } diff --git a/lib/DebugInfo/PDB/Raw/PDBFileBuilder.cpp b/lib/DebugInfo/PDB/Raw/PDBFileBuilder.cpp index 40e3c7901a9..165b03cf370 100644 --- a/lib/DebugInfo/PDB/Raw/PDBFileBuilder.cpp +++ b/lib/DebugInfo/PDB/Raw/PDBFileBuilder.cpp @@ -62,10 +62,16 @@ DbiStreamBuilder &PDBFileBuilder::getDbiBuilder() { TpiStreamBuilder &PDBFileBuilder::getTpiBuilder() { if (!Tpi) - Tpi = llvm::make_unique(*Msf); + Tpi = llvm::make_unique(*Msf, StreamTPI); return *Tpi; } +TpiStreamBuilder &PDBFileBuilder::getIpiBuilder() { + if (!Ipi) + Ipi = llvm::make_unique(*Msf, StreamIPI); + return *Ipi; +} + Expected PDBFileBuilder::finalizeMsfLayout() const { if (Info) { if (auto EC = Info->finalizeMsfLayout()) @@ -79,6 +85,10 @@ Expected PDBFileBuilder::finalizeMsfLayout() const { if (auto EC = Tpi->finalizeMsfLayout()) return std::move(EC); } + if (Ipi) { + if (auto EC = Ipi->finalizeMsfLayout()) + return std::move(EC); + } return Msf->build(); } @@ -113,6 +123,13 @@ PDBFileBuilder::build(std::unique_ptr PdbFileBuffer) { File->Tpi = std::move(*ExpectedTpi); } + if (Ipi) { + auto ExpectedIpi = Ipi->build(*File, *PdbFileBuffer); + 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( raw_error_code::corrupt_file, @@ -166,5 +183,10 @@ Error PDBFileBuilder::commit(const msf::WritableStream &Buffer) { return EC; } + if (Ipi) { + if (auto EC = Ipi->commit(Layout, Buffer)) + return EC; + } + return Buffer.commit(); } \ No newline at end of file diff --git a/lib/DebugInfo/PDB/Raw/TpiStreamBuilder.cpp b/lib/DebugInfo/PDB/Raw/TpiStreamBuilder.cpp index aa059387f6b..733efe882a2 100644 --- a/lib/DebugInfo/PDB/Raw/TpiStreamBuilder.cpp +++ b/lib/DebugInfo/PDB/Raw/TpiStreamBuilder.cpp @@ -15,8 +15,9 @@ using namespace llvm::msf; using namespace llvm::pdb; using namespace llvm::support; -TpiStreamBuilder::TpiStreamBuilder(MSFBuilder &Msf) - : Msf(Msf), Allocator(Msf.getAllocator()), Header(nullptr) {} +TpiStreamBuilder::TpiStreamBuilder(MSFBuilder &Msf, uint32_t StreamIdx) + : Msf(Msf), Allocator(Msf.getAllocator()), Header(nullptr), Idx(StreamIdx) { +} TpiStreamBuilder::~TpiStreamBuilder() {} @@ -75,7 +76,7 @@ uint32_t TpiStreamBuilder::calculateHashBufferSize() const { Error TpiStreamBuilder::finalizeMsfLayout() { uint32_t Length = calculateSerializedLength(); - if (auto EC = Msf.setStreamSize(StreamTPI, Length)) + if (auto EC = Msf.setStreamSize(Idx, Length)) return EC; uint32_t HashBufferSize = calculateHashBufferSize(); @@ -106,8 +107,8 @@ TpiStreamBuilder::build(PDBFile &File, const msf::WritableStream &Buffer) { if (auto EC = finalize()) return std::move(EC); - auto StreamData = MappedBlockStream::createIndexedStream(File.getMsfLayout(), - Buffer, StreamTPI); + auto StreamData = + MappedBlockStream::createIndexedStream(File.getMsfLayout(), Buffer, Idx); auto Tpi = llvm::make_unique(File, std::move(StreamData)); Tpi->Header = Header; Tpi->TypeRecords = VarStreamArray(TypeRecordStream); @@ -126,7 +127,7 @@ Error TpiStreamBuilder::commit(const msf::MSFLayout &Layout, return EC; auto InfoS = - WritableMappedBlockStream::createIndexedStream(Layout, Buffer, StreamTPI); + WritableMappedBlockStream::createIndexedStream(Layout, Buffer, Idx); StreamWriter Writer(*InfoS); if (auto EC = Writer.writeObject(*Header)) diff --git a/tools/llvm-pdbdump/PdbYaml.cpp b/tools/llvm-pdbdump/PdbYaml.cpp index 3975bdf466b..fd1016b4ce5 100644 --- a/tools/llvm-pdbdump/PdbYaml.cpp +++ b/tools/llvm-pdbdump/PdbYaml.cpp @@ -138,6 +138,7 @@ void MappingTraits::mapping(IO &IO, PdbObject &Obj) { IO.mapOptional("PdbStream", Obj.PdbStream); IO.mapOptional("DbiStream", Obj.DbiStream); IO.mapOptionalWithContext("TpiStream", Obj.TpiStream, Obj.Allocator); + IO.mapOptionalWithContext("IpiStream", Obj.IpiStream, Obj.Allocator); } void MappingTraits::mapping(IO &IO, MSFHeaders &Obj) { diff --git a/tools/llvm-pdbdump/PdbYaml.h b/tools/llvm-pdbdump/PdbYaml.h index 7ae1861415f..ffa194df214 100644 --- a/tools/llvm-pdbdump/PdbYaml.h +++ b/tools/llvm-pdbdump/PdbYaml.h @@ -93,6 +93,7 @@ struct PdbObject { Optional PdbStream; Optional DbiStream; Optional TpiStream; + Optional IpiStream; BumpPtrAllocator &Allocator; }; diff --git a/tools/llvm-pdbdump/YAMLOutputStyle.cpp b/tools/llvm-pdbdump/YAMLOutputStyle.cpp index 0991d5c0ec3..ee1875c6b67 100644 --- a/tools/llvm-pdbdump/YAMLOutputStyle.cpp +++ b/tools/llvm-pdbdump/YAMLOutputStyle.cpp @@ -50,6 +50,9 @@ Error YAMLOutputStyle::dump() { if (auto EC = dumpTpiStream()) return EC; + if (auto EC = dumpIpiStream()) + return EC; + flush(); return Error::success(); } @@ -179,6 +182,26 @@ Error YAMLOutputStyle::dumpTpiStream() { return Error::success(); } +Error YAMLOutputStyle::dumpIpiStream() { + if (!opts::pdb2yaml::IpiStream) + return Error::success(); + + auto IpiS = File.getPDBIpiStream(); + if (!IpiS) + return IpiS.takeError(); + + auto &IS = IpiS.get(); + Obj.IpiStream.emplace(); + Obj.IpiStream->Version = IS.getTpiVersion(); + for (auto &Record : IS.types(nullptr)) { + yaml::PdbTpiRecord R; + R.Record = Record; + Obj.IpiStream->Records.push_back(R); + } + + return Error::success(); +} + void YAMLOutputStyle::flush() { Out << Obj; outs().flush(); diff --git a/tools/llvm-pdbdump/YAMLOutputStyle.h b/tools/llvm-pdbdump/YAMLOutputStyle.h index 3204bdd9218..540dee4121e 100644 --- a/tools/llvm-pdbdump/YAMLOutputStyle.h +++ b/tools/llvm-pdbdump/YAMLOutputStyle.h @@ -32,6 +32,7 @@ private: Error dumpPDBStream(); Error dumpDbiStream(); Error dumpTpiStream(); + Error dumpIpiStream(); void flush(); diff --git a/tools/llvm-pdbdump/llvm-pdbdump.cpp b/tools/llvm-pdbdump/llvm-pdbdump.cpp index d1858f0799f..ca4666085d6 100644 --- a/tools/llvm-pdbdump/llvm-pdbdump.cpp +++ b/tools/llvm-pdbdump/llvm-pdbdump.cpp @@ -290,6 +290,10 @@ cl::opt TpiStream("tpi-stream", cl::desc("Dump the TPI Stream (Stream 3)"), cl::sub(PdbToYamlSubcommand), cl::init(false)); +cl::opt IpiStream("ipi-stream", + cl::desc("Dump the IPI Stream (Stream 5)"), + cl::sub(PdbToYamlSubcommand), cl::init(false)); + cl::list InputFilename(cl::Positional, cl::desc(""), cl::Required, cl::sub(PdbToYamlSubcommand)); @@ -371,6 +375,13 @@ static void yamlToPdb(StringRef Path) { TpiBuilder.addTypeRecord(R.Record); } + if (YamlObj.IpiStream.hasValue()) { + auto &IpiBuilder = Builder.getIpiBuilder(); + IpiBuilder.setVersionHeader(YamlObj.IpiStream->Version); + for (const auto &R : YamlObj.IpiStream->Records) + IpiBuilder.addTypeRecord(R.Record); + } + ExitOnErr(Builder.commit(*FileByteStream)); } diff --git a/tools/llvm-pdbdump/llvm-pdbdump.h b/tools/llvm-pdbdump/llvm-pdbdump.h index 74ce0776b4c..8f05ca7356e 100644 --- a/tools/llvm-pdbdump/llvm-pdbdump.h +++ b/tools/llvm-pdbdump/llvm-pdbdump.h @@ -73,6 +73,7 @@ extern llvm::cl::opt DbiStream; extern llvm::cl::opt DbiModuleInfo; extern llvm::cl::opt DbiModuleSourceFileInfo; extern llvm::cl::opt TpiStream; +extern llvm::cl::opt IpiStream; extern llvm::cl::list InputFilename; } }