diff options
Diffstat (limited to 'include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h')
| -rw-r--r-- | include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h | 120 | 
1 files changed, 120 insertions, 0 deletions
diff --git a/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h b/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h new file mode 100644 index 000000000000..16426bd93847 --- /dev/null +++ b/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h @@ -0,0 +1,120 @@ +//===- DbiStreamBuilder.h - PDB Dbi Stream Creation -------------*- C++ -*-===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_DEBUGINFO_PDB_RAW_PDBDBISTREAMBUILDER_H +#define LLVM_DEBUGINFO_PDB_RAW_PDBDBISTREAMBUILDER_H + +#include "llvm/ADT/Optional.h" +#include "llvm/ADT/StringSet.h" +#include "llvm/Support/Error.h" + +#include "llvm/DebugInfo/PDB/Native/PDBFile.h" +#include "llvm/DebugInfo/PDB/Native/RawConstants.h" +#include "llvm/DebugInfo/PDB/PDBTypes.h" +#include "llvm/Support/BinaryByteStream.h" +#include "llvm/Support/BinaryStreamReader.h" +#include "llvm/Support/Endian.h" + +namespace llvm { +namespace msf { +class MSFBuilder; +} +namespace object { +struct coff_section; +} +namespace pdb { +class DbiStream; +struct DbiStreamHeader; +class ModInfoBuilder; +class PDBFile; + +class DbiStreamBuilder { +public: +  DbiStreamBuilder(msf::MSFBuilder &Msf); +  ~DbiStreamBuilder(); + +  DbiStreamBuilder(const DbiStreamBuilder &) = delete; +  DbiStreamBuilder &operator=(const DbiStreamBuilder &) = delete; + +  void setVersionHeader(PdbRaw_DbiVer V); +  void setAge(uint32_t A); +  void setBuildNumber(uint16_t B); +  void setPdbDllVersion(uint16_t V); +  void setPdbDllRbld(uint16_t R); +  void setFlags(uint16_t F); +  void setMachineType(PDB_Machine M); +  void setSectionContribs(ArrayRef<SectionContrib> SecMap); +  void setSectionMap(ArrayRef<SecMapEntry> SecMap); + +  // Add given bytes as a new stream. +  Error addDbgStream(pdb::DbgHeaderType Type, ArrayRef<uint8_t> Data); + +  uint32_t calculateSerializedLength() const; + +  Expected<ModInfoBuilder &> addModuleInfo(StringRef ModuleName); +  Error addModuleSourceFile(StringRef Module, StringRef File); + +  Error finalizeMsfLayout(); + +  Error commit(const msf::MSFLayout &Layout, WritableBinaryStreamRef MsfBuffer); + +  // A helper function to create Section Contributions from COFF input +  // section headers. +  static std::vector<SectionContrib> +  createSectionContribs(ArrayRef<llvm::object::coff_section> SecHdrs); + +  // A helper function to create a Section Map from a COFF section header. +  static std::vector<SecMapEntry> +  createSectionMap(ArrayRef<llvm::object::coff_section> SecHdrs); + +private: +  struct DebugStream { +    ArrayRef<uint8_t> Data; +    uint16_t StreamNumber = 0; +  }; + +  Error finalize(); +  uint32_t calculateModiSubstreamSize() const; +  uint32_t calculateSectionContribsStreamSize() const; +  uint32_t calculateSectionMapStreamSize() const; +  uint32_t calculateFileInfoSubstreamSize() const; +  uint32_t calculateNamesBufferSize() const; +  uint32_t calculateDbgStreamsSize() const; + +  Error generateModiSubstream(); +  Error generateFileInfoSubstream(); + +  msf::MSFBuilder &Msf; +  BumpPtrAllocator &Allocator; + +  Optional<PdbRaw_DbiVer> VerHeader; +  uint32_t Age; +  uint16_t BuildNumber; +  uint16_t PdbDllVersion; +  uint16_t PdbDllRbld; +  uint16_t Flags; +  PDB_Machine MachineType; + +  const DbiStreamHeader *Header; + +  StringMap<std::unique_ptr<ModInfoBuilder>> ModiMap; +  std::vector<ModInfoBuilder *> ModiList; + +  StringMap<uint32_t> SourceFileNames; + +  WritableBinaryStreamRef NamesBuffer; +  MutableBinaryByteStream FileInfoBuffer; +  ArrayRef<SectionContrib> SectionContribs; +  ArrayRef<SecMapEntry> SectionMap; +  llvm::SmallVector<DebugStream, (int)DbgHeaderType::Max> DbgStreams; +}; +} +} + +#endif  | 
