Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 1 | //===- PDBFileBuilder.h - PDB File 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_PDBFILEBUILDER_H |
||
10 | #define LLVM_DEBUGINFO_PDB_NATIVE_PDBFILEBUILDER_H |
||
11 | |||
12 | #include "llvm/ADT/DenseMap.h" |
||
13 | #include "llvm/ADT/SmallVector.h" |
||
14 | #include "llvm/DebugInfo/PDB/Native/HashTable.h" |
||
15 | #include "llvm/DebugInfo/PDB/Native/NamedStreamMap.h" |
||
16 | #include "llvm/DebugInfo/PDB/Native/PDBStringTableBuilder.h" |
||
17 | #include "llvm/Support/Allocator.h" |
||
18 | #include "llvm/Support/Error.h" |
||
19 | #include "llvm/Support/MemoryBuffer.h" |
||
20 | #include <memory> |
||
21 | |||
22 | namespace llvm { |
||
23 | class WritableBinaryStream; |
||
24 | namespace codeview { |
||
25 | struct GUID; |
||
26 | } |
||
27 | |||
28 | namespace msf { |
||
29 | class MSFBuilder; |
||
30 | struct MSFLayout; |
||
31 | } |
||
32 | namespace pdb { |
||
33 | struct SrcHeaderBlockEntry; |
||
34 | class DbiStreamBuilder; |
||
35 | class InfoStreamBuilder; |
||
36 | class GSIStreamBuilder; |
||
37 | class TpiStreamBuilder; |
||
38 | |||
39 | class PDBFileBuilder { |
||
40 | public: |
||
41 | explicit PDBFileBuilder(BumpPtrAllocator &Allocator); |
||
42 | ~PDBFileBuilder(); |
||
43 | PDBFileBuilder(const PDBFileBuilder &) = delete; |
||
44 | PDBFileBuilder &operator=(const PDBFileBuilder &) = delete; |
||
45 | |||
46 | Error initialize(uint32_t BlockSize); |
||
47 | |||
48 | msf::MSFBuilder &getMsfBuilder(); |
||
49 | InfoStreamBuilder &getInfoBuilder(); |
||
50 | DbiStreamBuilder &getDbiBuilder(); |
||
51 | TpiStreamBuilder &getTpiBuilder(); |
||
52 | TpiStreamBuilder &getIpiBuilder(); |
||
53 | PDBStringTableBuilder &getStringTableBuilder(); |
||
54 | GSIStreamBuilder &getGsiBuilder(); |
||
55 | |||
56 | // If HashPDBContentsToGUID is true on the InfoStreamBuilder, Guid is filled |
||
57 | // with the computed PDB GUID on return. |
||
58 | Error commit(StringRef Filename, codeview::GUID *Guid); |
||
59 | |||
60 | Expected<uint32_t> getNamedStreamIndex(StringRef Name) const; |
||
61 | Error addNamedStream(StringRef Name, StringRef Data); |
||
62 | void addInjectedSource(StringRef Name, std::unique_ptr<MemoryBuffer> Buffer); |
||
63 | |||
64 | private: |
||
65 | struct InjectedSourceDescriptor { |
||
66 | // The full name of the stream that contains the contents of this injected |
||
67 | // source. This is built as a concatenation of the literal "/src/files" |
||
68 | // plus the "vname". |
||
69 | std::string StreamName; |
||
70 | |||
71 | // The exact name of the file name as specified by the user. |
||
72 | uint32_t NameIndex; |
||
73 | |||
74 | // The string table index of the "vname" of the file. As far as we |
||
75 | // understand, this is the same as the name, except it is lowercased and |
||
76 | // forward slashes are converted to backslashes. |
||
77 | uint32_t VNameIndex; |
||
78 | std::unique_ptr<MemoryBuffer> Content; |
||
79 | }; |
||
80 | |||
81 | Error finalizeMsfLayout(); |
||
82 | Expected<uint32_t> allocateNamedStream(StringRef Name, uint32_t Size); |
||
83 | |||
84 | void commitInjectedSources(WritableBinaryStream &MsfBuffer, |
||
85 | const msf::MSFLayout &Layout); |
||
86 | void commitSrcHeaderBlock(WritableBinaryStream &MsfBuffer, |
||
87 | const msf::MSFLayout &Layout); |
||
88 | |||
89 | BumpPtrAllocator &Allocator; |
||
90 | |||
91 | std::unique_ptr<msf::MSFBuilder> Msf; |
||
92 | std::unique_ptr<InfoStreamBuilder> Info; |
||
93 | std::unique_ptr<DbiStreamBuilder> Dbi; |
||
94 | std::unique_ptr<GSIStreamBuilder> Gsi; |
||
95 | std::unique_ptr<TpiStreamBuilder> Tpi; |
||
96 | std::unique_ptr<TpiStreamBuilder> Ipi; |
||
97 | |||
98 | PDBStringTableBuilder Strings; |
||
99 | StringTableHashTraits InjectedSourceHashTraits; |
||
100 | HashTable<SrcHeaderBlockEntry> InjectedSourceTable; |
||
101 | |||
102 | SmallVector<InjectedSourceDescriptor, 2> InjectedSources; |
||
103 | |||
104 | NamedStreamMap NamedStreams; |
||
105 | DenseMap<uint32_t, std::string> NamedStreamData; |
||
106 | }; |
||
107 | } |
||
108 | } |
||
109 | |||
110 | #endif |