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
21namespace llvm {
22class BinaryByteStream;
23template <typename T> struct BinaryItemTraits;
24
25template <> 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
32namespace msf {
33class MSFBuilder;
34struct MSFLayout;
35}
36namespace pdb {
37struct TpiStreamHeader;
38
39class TpiStreamBuilder {
40public:
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
60private:
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

source code of llvm/include/llvm/DebugInfo/PDB/Native/TpiStreamBuilder.h