Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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