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