#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 {
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);
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;
msf::WritableStreamRef NamesBuffer;
msf::MutableByteStream ModInfoBuffer;
msf::MutableByteStream FileInfoBuffer;
- llvm::SmallVector<DebugStream, (int)DbgHeaderType::Max> DbgStreams{
- (int)DbgHeaderType::Max};
};
}
}
#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"
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() + DbgStreams.size() * sizeof(uint16_t);
+ calculateModiSubstreamSize();
}
Error DbiStreamBuilder::addModuleInfo(StringRef ObjFile, StringRef Module) {
H->ECSubstreamSize = 0;
H->FileInfoSize = FileInfoBuffer.getLength();
H->ModiSubstreamSize = ModInfoBuffer.getLength();
- H->OptionalDbgHdrSize = DbgStreams.size() * sizeof(uint16_t);
+ H->OptionalDbgHdrSize = 0;
H->SecContrSubstreamSize = 0;
H->SectionMapSize = 0;
H->TypeServerSize = 0;
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,