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