1 //===- PDBFileBuilder.h - PDB File Creation ---------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_DEBUGINFO_PDB_RAW_PDBFILEBUILDER_H
10 #define LLVM_DEBUGINFO_PDB_RAW_PDBFILEBUILDER_H
12 #include "llvm/ADT/ArrayRef.h"
13 #include "llvm/ADT/BitVector.h"
14 #include "llvm/ADT/Optional.h"
15 #include "llvm/DebugInfo/PDB/Native/NamedStreamMap.h"
16 #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
17 #include "llvm/DebugInfo/PDB/Native/PDBStringTableBuilder.h"
18 #include "llvm/DebugInfo/PDB/Native/RawConstants.h"
19 #include "llvm/DebugInfo/PDB/Native/RawTypes.h"
20 #include "llvm/Support/Allocator.h"
21 #include "llvm/Support/Endian.h"
22 #include "llvm/Support/Error.h"
23 #include "llvm/Support/MemoryBuffer.h"
33 class DbiStreamBuilder
;
34 class InfoStreamBuilder
;
35 class GSIStreamBuilder
;
36 class TpiStreamBuilder
;
38 class PDBFileBuilder
{
40 explicit PDBFileBuilder(BumpPtrAllocator
&Allocator
);
42 PDBFileBuilder(const PDBFileBuilder
&) = delete;
43 PDBFileBuilder
&operator=(const PDBFileBuilder
&) = delete;
45 Error
initialize(uint32_t BlockSize
);
47 msf::MSFBuilder
&getMsfBuilder();
48 InfoStreamBuilder
&getInfoBuilder();
49 DbiStreamBuilder
&getDbiBuilder();
50 TpiStreamBuilder
&getTpiBuilder();
51 TpiStreamBuilder
&getIpiBuilder();
52 PDBStringTableBuilder
&getStringTableBuilder();
53 GSIStreamBuilder
&getGsiBuilder();
55 // If HashPDBContentsToGUID is true on the InfoStreamBuilder, Guid is filled
56 // with the computed PDB GUID on return.
57 Error
commit(StringRef Filename
, codeview::GUID
*Guid
);
59 Expected
<uint32_t> getNamedStreamIndex(StringRef Name
) const;
60 Error
addNamedStream(StringRef Name
, StringRef Data
);
61 void addInjectedSource(StringRef Name
, std::unique_ptr
<MemoryBuffer
> Buffer
);
64 struct InjectedSourceDescriptor
{
65 // The full name of the stream that contains the contents of this injected
66 // source. This is built as a concatenation of the literal "/src/files"
68 std::string StreamName
;
70 // The exact name of the file name as specified by the user.
73 // The string table index of the "vname" of the file. As far as we
74 // understand, this is the same as the name, except it is lowercased and
75 // forward slashes are converted to backslashes.
77 std::unique_ptr
<MemoryBuffer
> Content
;
80 Error
finalizeMsfLayout();
81 Expected
<uint32_t> allocateNamedStream(StringRef Name
, uint32_t Size
);
83 void commitFpm(WritableBinaryStream
&MsfBuffer
, const msf::MSFLayout
&Layout
);
84 void commitInjectedSources(WritableBinaryStream
&MsfBuffer
,
85 const msf::MSFLayout
&Layout
);
86 void commitSrcHeaderBlock(WritableBinaryStream
&MsfBuffer
,
87 const msf::MSFLayout
&Layout
);
89 BumpPtrAllocator
&Allocator
;
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
;
98 PDBStringTableBuilder Strings
;
99 StringTableHashTraits InjectedSourceHashTraits
;
100 HashTable
<SrcHeaderBlockEntry
> InjectedSourceTable
;
102 SmallVector
<InjectedSourceDescriptor
, 2> InjectedSources
;
104 NamedStreamMap NamedStreams
;
105 DenseMap
<uint32_t, std::string
> NamedStreamData
;