diff options
| author | Zachary Turner <zturner@google.com> | 2018-03-01 18:00:29 +0000 |
|---|---|---|
| committer | Zachary Turner <zturner@google.com> | 2018-03-01 18:00:29 +0000 |
| commit | c6a75a69f15e42dd4c6b1a79f6d1a4e3df9f75ea (patch) | |
| tree | d4d58a047c8d2637ccfa968decf1ba642a6e7a19 | |
| parent | 621cef600b4d7c466113d0a8b05ee1bf5cc07fc5 (diff) | |
| download | bcm5719-llvm-c6a75a69f15e42dd4c6b1a79f6d1a4e3df9f75ea.tar.gz bcm5719-llvm-c6a75a69f15e42dd4c6b1a79f6d1a4e3df9f75ea.zip | |
[PDB] Defer writing the build id until the rest of the PDB is written.
For now this is NFC, but this small refactor opens the door to
letting us embed a hash of the PDB in the build id field of the
PDB.
Differential Revision: https://reviews.llvm.org/D43913
llvm-svn: 326453
| -rw-r--r-- | lld/COFF/PDB.cpp | 4 | ||||
| -rw-r--r-- | llvm/include/llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h | 6 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/PDB/Native/InfoStreamBuilder.cpp | 16 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/PDB/Native/PDBFileBuilder.cpp | 17 |
4 files changed, 32 insertions, 11 deletions
diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp index 60e69c1153b..de6aa64538b 100644 --- a/lld/COFF/PDB.cpp +++ b/lld/COFF/PDB.cpp @@ -1056,12 +1056,10 @@ void PDBLinker::initialize(const llvm::codeview::DebugInfo &BuildId) { // Add an Info stream. auto &InfoBuilder = Builder.getInfoBuilder(); - InfoBuilder.setAge(BuildId.PDB70.Age); - GUID uuid; memcpy(&uuid, &BuildId.PDB70.Signature, sizeof(uuid)); + InfoBuilder.setAge(BuildId.PDB70.Age); InfoBuilder.setGuid(uuid); - InfoBuilder.setSignature(time(nullptr)); InfoBuilder.setVersion(pdb::PdbRaw_ImplVer::PdbImplVC70); // Add an empty DBI stream. diff --git a/llvm/include/llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h b/llvm/include/llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h index c6cb0e221e7..419e8ada06f 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h +++ b/llvm/include/llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h @@ -40,6 +40,10 @@ public: void setGuid(codeview::GUID G); void addFeature(PdbRaw_FeatureSig Sig); + uint32_t getAge() const { return Age; } + codeview::GUID getGuid() const { return Guid; } + Optional<uint32_t> getSignature() const { return Signature; } + uint32_t finalize(); Error finalizeMsfLayout(); @@ -52,8 +56,8 @@ private: std::vector<PdbRaw_FeatureSig> Features; PdbRaw_ImplVer Ver; - uint32_t Sig; uint32_t Age; + Optional<uint32_t> Signature; codeview::GUID Guid; NamedStreamMap &NamedStreams; diff --git a/llvm/lib/DebugInfo/PDB/Native/InfoStreamBuilder.cpp b/llvm/lib/DebugInfo/PDB/Native/InfoStreamBuilder.cpp index 6ab748c160b..a20b45111cf 100644 --- a/llvm/lib/DebugInfo/PDB/Native/InfoStreamBuilder.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/InfoStreamBuilder.cpp @@ -25,15 +25,17 @@ using namespace llvm::pdb; InfoStreamBuilder::InfoStreamBuilder(msf::MSFBuilder &Msf, NamedStreamMap &NamedStreams) - : Msf(Msf), Ver(PdbRaw_ImplVer::PdbImplVC70), Sig(-1), Age(0), - NamedStreams(NamedStreams) {} + : Msf(Msf), Ver(PdbRaw_ImplVer::PdbImplVC70), Age(0), + NamedStreams(NamedStreams) { + ::memset(&Guid, 0, sizeof(Guid)); +} void InfoStreamBuilder::setVersion(PdbRaw_ImplVer V) { Ver = V; } -void InfoStreamBuilder::setSignature(uint32_t S) { Sig = S; } - void InfoStreamBuilder::setAge(uint32_t A) { Age = A; } +void InfoStreamBuilder::setSignature(uint32_t S) { Signature = S; } + void InfoStreamBuilder::setGuid(GUID G) { Guid = G; } void InfoStreamBuilder::addFeature(PdbRaw_FeatureSig Sig) { @@ -56,10 +58,10 @@ Error InfoStreamBuilder::commit(const msf::MSFLayout &Layout, BinaryStreamWriter Writer(*InfoS); InfoStreamHeader H; - H.Age = Age; - H.Signature = Sig; + // Leave the build id fields 0 so they can be set as the last step before + // committing the file to disk. + ::memset(&H, 0, sizeof(H)); H.Version = Ver; - H.Guid = Guid; if (auto EC = Writer.writeObject(H)) return EC; diff --git a/llvm/lib/DebugInfo/PDB/Native/PDBFileBuilder.cpp b/llvm/lib/DebugInfo/PDB/Native/PDBFileBuilder.cpp index dee27c621fa..1cb890ff799 100644 --- a/llvm/lib/DebugInfo/PDB/Native/PDBFileBuilder.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/PDBFileBuilder.cpp @@ -178,6 +178,8 @@ Error PDBFileBuilder::commit(StringRef Filename) { auto OutFileOrError = FileOutputBuffer::create(Filename, Filesize); if (auto E = OutFileOrError.takeError()) return E; + FileOutputBuffer *FOB = OutFileOrError->get(); + FileBufferByteStream Buffer(std::move(*OutFileOrError), llvm::support::little); BinaryStreamWriter Writer(Buffer); @@ -242,5 +244,20 @@ Error PDBFileBuilder::commit(StringRef Filename) { return EC; } + auto InfoStreamBlocks = Layout.StreamMap[StreamPDB]; + assert(!InfoStreamBlocks.empty()); + uint64_t InfoStreamFileOffset = + blockToOffset(InfoStreamBlocks.front(), Layout.SB->BlockSize); + InfoStreamHeader *H = reinterpret_cast<InfoStreamHeader *>( + FOB->getBufferStart() + InfoStreamFileOffset); + + // Set the build id at the very end, after every other byte of the PDB + // has been written. + // FIXME: Use a hash of the PDB rather than time(nullptr) for the signature. + H->Age = Info->getAge(); + H->Guid = Info->getGuid(); + Optional<uint32_t> Sig = Info->getSignature(); + H->Signature = Sig.hasValue() ? *Sig : time(nullptr); + return Buffer.commit(); } |

