Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- PDBFileBuilder.h - PDB File Creation ---------------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8.  
  9. #ifndef LLVM_DEBUGINFO_PDB_NATIVE_PDBFILEBUILDER_H
  10. #define LLVM_DEBUGINFO_PDB_NATIVE_PDBFILEBUILDER_H
  11.  
  12. #include "llvm/ADT/DenseMap.h"
  13. #include "llvm/ADT/SmallVector.h"
  14. #include "llvm/DebugInfo/PDB/Native/HashTable.h"
  15. #include "llvm/DebugInfo/PDB/Native/NamedStreamMap.h"
  16. #include "llvm/DebugInfo/PDB/Native/PDBStringTableBuilder.h"
  17. #include "llvm/Support/Allocator.h"
  18. #include "llvm/Support/Error.h"
  19. #include "llvm/Support/MemoryBuffer.h"
  20. #include <memory>
  21.  
  22. namespace llvm {
  23. class WritableBinaryStream;
  24. namespace codeview {
  25. struct GUID;
  26. }
  27.  
  28. namespace msf {
  29. class MSFBuilder;
  30. struct MSFLayout;
  31. }
  32. namespace pdb {
  33. struct SrcHeaderBlockEntry;
  34. class DbiStreamBuilder;
  35. class InfoStreamBuilder;
  36. class GSIStreamBuilder;
  37. class TpiStreamBuilder;
  38.  
  39. class PDBFileBuilder {
  40. public:
  41.   explicit PDBFileBuilder(BumpPtrAllocator &Allocator);
  42.   ~PDBFileBuilder();
  43.   PDBFileBuilder(const PDBFileBuilder &) = delete;
  44.   PDBFileBuilder &operator=(const PDBFileBuilder &) = delete;
  45.  
  46.   Error initialize(uint32_t BlockSize);
  47.  
  48.   msf::MSFBuilder &getMsfBuilder();
  49.   InfoStreamBuilder &getInfoBuilder();
  50.   DbiStreamBuilder &getDbiBuilder();
  51.   TpiStreamBuilder &getTpiBuilder();
  52.   TpiStreamBuilder &getIpiBuilder();
  53.   PDBStringTableBuilder &getStringTableBuilder();
  54.   GSIStreamBuilder &getGsiBuilder();
  55.  
  56.   // If HashPDBContentsToGUID is true on the InfoStreamBuilder, Guid is filled
  57.   // with the computed PDB GUID on return.
  58.   Error commit(StringRef Filename, codeview::GUID *Guid);
  59.  
  60.   Expected<uint32_t> getNamedStreamIndex(StringRef Name) const;
  61.   Error addNamedStream(StringRef Name, StringRef Data);
  62.   void addInjectedSource(StringRef Name, std::unique_ptr<MemoryBuffer> Buffer);
  63.  
  64. private:
  65.   struct InjectedSourceDescriptor {
  66.     // The full name of the stream that contains the contents of this injected
  67.     // source.  This is built as a concatenation of the literal "/src/files"
  68.     // plus the "vname".
  69.     std::string StreamName;
  70.  
  71.     // The exact name of the file name as specified by the user.
  72.     uint32_t NameIndex;
  73.  
  74.     // The string table index of the "vname" of the file.  As far as we
  75.     // understand, this is the same as the name, except it is lowercased and
  76.     // forward slashes are converted to backslashes.
  77.     uint32_t VNameIndex;
  78.     std::unique_ptr<MemoryBuffer> Content;
  79.   };
  80.  
  81.   Error finalizeMsfLayout();
  82.   Expected<uint32_t> allocateNamedStream(StringRef Name, uint32_t Size);
  83.  
  84.   void commitInjectedSources(WritableBinaryStream &MsfBuffer,
  85.                              const msf::MSFLayout &Layout);
  86.   void commitSrcHeaderBlock(WritableBinaryStream &MsfBuffer,
  87.                             const msf::MSFLayout &Layout);
  88.  
  89.   BumpPtrAllocator &Allocator;
  90.  
  91.   std::unique_ptr<msf::MSFBuilder> Msf;
  92.   std::unique_ptr<InfoStreamBuilder> Info;
  93.   std::unique_ptr<DbiStreamBuilder> Dbi;
  94.   std::unique_ptr<GSIStreamBuilder> Gsi;
  95.   std::unique_ptr<TpiStreamBuilder> Tpi;
  96.   std::unique_ptr<TpiStreamBuilder> Ipi;
  97.  
  98.   PDBStringTableBuilder Strings;
  99.   StringTableHashTraits InjectedSourceHashTraits;
  100.   HashTable<SrcHeaderBlockEntry> InjectedSourceTable;
  101.  
  102.   SmallVector<InjectedSourceDescriptor, 2> InjectedSources;
  103.  
  104.   NamedStreamMap NamedStreams;
  105.   DenseMap<uint32_t, std::string> NamedStreamData;
  106. };
  107. }
  108. }
  109.  
  110. #endif
  111.