From: Rui Ueyama Date: Mon, 10 Oct 2016 23:35:36 +0000 (+0000) Subject: Define DbiStreamBuilder::addDbgStream to add stream. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=70edd9e41d637596ef93e2e6c1935dabe8c24182;p=platform%2Fupstream%2Fllvm.git Define DbiStreamBuilder::addDbgStream to add stream. Previously, there is no way to create a stream other than pre-defined special stream such as DBI or IPI. This patch adds a new method, addDbgStream, to add a debug stream to a PDB file. Differential Revision: https://reviews.llvm.org/D25356 llvm-svn: 283823 --- diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h b/llvm/include/llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h index 96a9b51..72abba8 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h +++ b/llvm/include/llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h @@ -19,6 +19,7 @@ #include "llvm/DebugInfo/PDB/PDBTypes.h" #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" #include "llvm/DebugInfo/PDB/Raw/RawConstants.h" +#include "llvm/Support/Endian.h" namespace llvm { namespace msf { @@ -44,6 +45,9 @@ public: void setFlags(uint16_t F); void setMachineType(PDB_Machine M); + // Add given bytes as a new stream. + Error addDbgStream(pdb::DbgHeaderType Type, ArrayRef Data); + uint32_t calculateSerializedLength() const; Error addModuleInfo(StringRef ObjFile, StringRef Module); @@ -57,6 +61,11 @@ public: const msf::WritableStream &Buffer); private: + struct DebugStream { + ArrayRef Data; + uint16_t StreamNumber = kInvalidStreamIndex; + }; + Error finalize(); uint32_t calculateModiSubstreamSize() const; uint32_t calculateFileInfoSubstreamSize() const; @@ -92,6 +101,7 @@ private: msf::WritableStreamRef NamesBuffer; msf::MutableByteStream ModInfoBuffer; msf::MutableByteStream FileInfoBuffer; + llvm::SmallVector DbgStreams; }; } } diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h b/llvm/include/llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h index ce5e3ff..3045ab7 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h +++ b/llvm/include/llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h @@ -14,6 +14,7 @@ #include "llvm/ADT/BitVector.h" #include "llvm/ADT/Optional.h" #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" +#include "llvm/DebugInfo/PDB/Raw/RawConstants.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/Endian.h" #include "llvm/Support/Error.h" diff --git a/llvm/lib/DebugInfo/PDB/Raw/DbiStreamBuilder.cpp b/llvm/lib/DebugInfo/PDB/Raw/DbiStreamBuilder.cpp index bb0e730..f76cb6a 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/DbiStreamBuilder.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/DbiStreamBuilder.cpp @@ -9,6 +9,7 @@ #include "llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h" +#include "llvm/ADT/ArrayRef.h" #include "llvm/DebugInfo/MSF/MSFBuilder.h" #include "llvm/DebugInfo/MSF/MappedBlockStream.h" #include "llvm/DebugInfo/MSF/StreamWriter.h" @@ -43,10 +44,24 @@ void DbiStreamBuilder::setFlags(uint16_t F) { Flags = F; } void DbiStreamBuilder::setMachineType(PDB_Machine M) { MachineType = M; } +Error DbiStreamBuilder::addDbgStream(pdb::DbgHeaderType Type, + ArrayRef Data) { + if (DbgStreams[(int)Type].StreamNumber == kInvalidStreamIndex) + return make_error(raw_error_code::duplicate_entry, + "The specified stream type already exists"); + auto ExpectedIndex = Msf.addStream(Data.size()); + if (!ExpectedIndex) + return ExpectedIndex.takeError(); + uint32_t Index = std::move(*ExpectedIndex); + DbgStreams[(int)Type].Data = Data; + DbgStreams[(int)Type].StreamNumber = Index; + return Error::success(); +} + uint32_t DbiStreamBuilder::calculateSerializedLength() const { // For now we only support serializing the header. return sizeof(DbiStreamHeader) + calculateFileInfoSubstreamSize() + - calculateModiSubstreamSize(); + calculateModiSubstreamSize() + DbgStreams.size() * sizeof(uint16_t); } Error DbiStreamBuilder::addModuleInfo(StringRef ObjFile, StringRef Module) { @@ -216,7 +231,7 @@ Error DbiStreamBuilder::finalize() { H->ECSubstreamSize = 0; H->FileInfoSize = FileInfoBuffer.getLength(); H->ModiSubstreamSize = ModInfoBuffer.getLength(); - H->OptionalDbgHdrSize = 0; + H->OptionalDbgHdrSize = DbgStreams.size() * sizeof(uint16_t); H->SecContrSubstreamSize = 0; H->SectionMapSize = 0; H->TypeServerSize = 0; @@ -273,6 +288,19 @@ Error DbiStreamBuilder::commit(const msf::MSFLayout &Layout, return EC; if (auto EC = Writer.writeStreamRef(FileInfoBuffer)) return EC; + for (auto &Stream : DbgStreams) + if (auto EC = Writer.writeInteger(Stream.StreamNumber)) + return EC; + + for (auto &Stream : DbgStreams) { + if (Stream.StreamNumber == kInvalidStreamIndex) + continue; + auto WritableStream = WritableMappedBlockStream::createIndexedStream( + Layout, Buffer, Stream.StreamNumber); + StreamWriter DbgStreamWriter(*WritableStream); + if (auto EC = DbgStreamWriter.writeArray(Stream.Data)) + return EC; + } if (Writer.bytesRemaining() > 0) return make_error(raw_error_code::invalid_format,