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 |