Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

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

  1. //===- TpiStreamBuilder.h - PDB Tpi Stream 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_TPISTREAMBUILDER_H
  10. #define LLVM_DEBUGINFO_PDB_NATIVE_TPISTREAMBUILDER_H
  11.  
  12. #include "llvm/DebugInfo/CodeView/CVRecord.h"
  13. #include "llvm/DebugInfo/CodeView/TypeIndex.h"
  14. #include "llvm/DebugInfo/PDB/Native/RawConstants.h"
  15. #include "llvm/Support/Allocator.h"
  16. #include "llvm/Support/BinaryStreamRef.h"
  17. #include "llvm/Support/Error.h"
  18.  
  19. #include <vector>
  20.  
  21. namespace llvm {
  22. class BinaryByteStream;
  23. template <typename T> struct BinaryItemTraits;
  24.  
  25. template <> struct BinaryItemTraits<llvm::codeview::CVType> {
  26.   static size_t length(const codeview::CVType &Item) { return Item.length(); }
  27.   static ArrayRef<uint8_t> bytes(const codeview::CVType &Item) {
  28.     return Item.data();
  29.   }
  30. };
  31.  
  32. namespace msf {
  33. class MSFBuilder;
  34. struct MSFLayout;
  35. }
  36. namespace pdb {
  37. struct TpiStreamHeader;
  38.  
  39. class TpiStreamBuilder {
  40. public:
  41.   explicit TpiStreamBuilder(msf::MSFBuilder &Msf, uint32_t StreamIdx);
  42.   ~TpiStreamBuilder();
  43.  
  44.   TpiStreamBuilder(const TpiStreamBuilder &) = delete;
  45.   TpiStreamBuilder &operator=(const TpiStreamBuilder &) = delete;
  46.  
  47.   void setVersionHeader(PdbRaw_TpiVer Version);
  48.   void addTypeRecord(ArrayRef<uint8_t> Type, std::optional<uint32_t> Hash);
  49.   void addTypeRecords(ArrayRef<uint8_t> Types, ArrayRef<uint16_t> Sizes,
  50.                       ArrayRef<uint32_t> Hashes);
  51.  
  52.   Error finalizeMsfLayout();
  53.  
  54.   uint32_t getRecordCount() const { return TypeRecordCount; }
  55.  
  56.   Error commit(const msf::MSFLayout &Layout, WritableBinaryStreamRef Buffer);
  57.  
  58.   uint32_t calculateSerializedLength();
  59.  
  60. private:
  61.   void updateTypeIndexOffsets(ArrayRef<uint16_t> Sizes);
  62.  
  63.   uint32_t calculateHashBufferSize() const;
  64.   uint32_t calculateIndexOffsetSize() const;
  65.   Error finalize();
  66.  
  67.   msf::MSFBuilder &Msf;
  68.   BumpPtrAllocator &Allocator;
  69.  
  70.   uint32_t TypeRecordCount = 0;
  71.   size_t TypeRecordBytes = 0;
  72.  
  73.   PdbRaw_TpiVer VerHeader = PdbRaw_TpiVer::PdbTpiV80;
  74.   std::vector<ArrayRef<uint8_t>> TypeRecBuffers;
  75.   std::vector<uint32_t> TypeHashes;
  76.   std::vector<codeview::TypeIndexOffset> TypeIndexOffsets;
  77.   uint32_t HashStreamIndex = kInvalidStreamIndex;
  78.   std::unique_ptr<BinaryByteStream> HashValueStream;
  79.  
  80.   const TpiStreamHeader *Header;
  81.   uint32_t Idx;
  82. };
  83. } // namespace pdb
  84. }
  85.  
  86. #endif
  87.