Skip to content

Commit

Permalink
Define DbiStreamBuilder::addDbgStream to add stream.
Browse files Browse the repository at this point in the history
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@283823 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
rui314 committed Oct 10, 2016
1 parent 420b9a4 commit 7ca9688
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 2 deletions.
10 changes: 10 additions & 0 deletions include/llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -44,6 +45,9 @@ class DbiStreamBuilder {
void setFlags(uint16_t F);
void setMachineType(PDB_Machine M);

// Add given bytes as a new stream.
Error addDbgStream(pdb::DbgHeaderType Type, ArrayRef<uint8_t> Data);

uint32_t calculateSerializedLength() const;

Error addModuleInfo(StringRef ObjFile, StringRef Module);
Expand All @@ -57,6 +61,11 @@ class DbiStreamBuilder {
const msf::WritableStream &Buffer);

private:
struct DebugStream {
ArrayRef<uint8_t> Data;
uint16_t StreamNumber = kInvalidStreamIndex;
};

Error finalize();
uint32_t calculateModiSubstreamSize() const;
uint32_t calculateFileInfoSubstreamSize() const;
Expand Down Expand Up @@ -92,6 +101,7 @@ class DbiStreamBuilder {
msf::WritableStreamRef NamesBuffer;
msf::MutableByteStream ModInfoBuffer;
msf::MutableByteStream FileInfoBuffer;
llvm::SmallVector<DebugStream, (int)DbgHeaderType::Max> DbgStreams;
};
}
}
Expand Down
1 change: 1 addition & 0 deletions include/llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
32 changes: 30 additions & 2 deletions lib/DebugInfo/PDB/Raw/DbiStreamBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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<uint8_t> Data) {
if (DbgStreams[(int)Type].StreamNumber == kInvalidStreamIndex)
return make_error<RawError>(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) {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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<RawError>(raw_error_code::invalid_format,
Expand Down

0 comments on commit 7ca9688

Please sign in to comment.