- //===- TpiStreamBuilder.h - PDB Tpi Stream Creation -------------*- C++ -*-===// 
- // 
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 
- // See https://llvm.org/LICENSE.txt for license information. 
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 
- // 
- //===----------------------------------------------------------------------===// 
-   
- #ifndef LLVM_DEBUGINFO_PDB_NATIVE_TPISTREAMBUILDER_H 
- #define LLVM_DEBUGINFO_PDB_NATIVE_TPISTREAMBUILDER_H 
-   
- #include "llvm/DebugInfo/CodeView/CVRecord.h" 
- #include "llvm/DebugInfo/CodeView/TypeIndex.h" 
- #include "llvm/DebugInfo/PDB/Native/RawConstants.h" 
- #include "llvm/Support/Allocator.h" 
- #include "llvm/Support/BinaryStreamRef.h" 
- #include "llvm/Support/Error.h" 
-   
- #include <vector> 
-   
- namespace llvm { 
- class BinaryByteStream; 
- template <typename T> struct BinaryItemTraits; 
-   
- template <> struct BinaryItemTraits<llvm::codeview::CVType> { 
-   static size_t length(const codeview::CVType &Item) { return Item.length(); } 
-   static ArrayRef<uint8_t> bytes(const codeview::CVType &Item) { 
-     return Item.data(); 
-   } 
- }; 
-   
- namespace msf { 
- class MSFBuilder; 
- struct MSFLayout; 
- } 
- namespace pdb { 
- struct TpiStreamHeader; 
-   
- class TpiStreamBuilder { 
- public: 
-   explicit TpiStreamBuilder(msf::MSFBuilder &Msf, uint32_t StreamIdx); 
-   ~TpiStreamBuilder(); 
-   
-   TpiStreamBuilder(const TpiStreamBuilder &) = delete; 
-   TpiStreamBuilder &operator=(const TpiStreamBuilder &) = delete; 
-   
-   void setVersionHeader(PdbRaw_TpiVer Version); 
-   void addTypeRecord(ArrayRef<uint8_t> Type, std::optional<uint32_t> Hash); 
-   void addTypeRecords(ArrayRef<uint8_t> Types, ArrayRef<uint16_t> Sizes, 
-                       ArrayRef<uint32_t> Hashes); 
-   
-   Error finalizeMsfLayout(); 
-   
-   uint32_t getRecordCount() const { return TypeRecordCount; } 
-   
-   Error commit(const msf::MSFLayout &Layout, WritableBinaryStreamRef Buffer); 
-   
-   uint32_t calculateSerializedLength(); 
-   
- private: 
-   void updateTypeIndexOffsets(ArrayRef<uint16_t> Sizes); 
-   
-   uint32_t calculateHashBufferSize() const; 
-   uint32_t calculateIndexOffsetSize() const; 
-   Error finalize(); 
-   
-   msf::MSFBuilder &Msf; 
-   BumpPtrAllocator &Allocator; 
-   
-   uint32_t TypeRecordCount = 0; 
-   size_t TypeRecordBytes = 0; 
-   
-   PdbRaw_TpiVer VerHeader = PdbRaw_TpiVer::PdbTpiV80; 
-   std::vector<ArrayRef<uint8_t>> TypeRecBuffers; 
-   std::vector<uint32_t> TypeHashes; 
-   std::vector<codeview::TypeIndexOffset> TypeIndexOffsets; 
-   uint32_t HashStreamIndex = kInvalidStreamIndex; 
-   std::unique_ptr<BinaryByteStream> HashValueStream; 
-   
-   const TpiStreamHeader *Header; 
-   uint32_t Idx; 
- }; 
- } // namespace pdb 
- } 
-   
- #endif 
-