1 //===- InputFile.h -------------------------------------------- *- 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_TOOLS_LLVMPDBDUMP_INPUTFILE_H
10 #define LLVM_TOOLS_LLVMPDBDUMP_INPUTFILE_H
12 #include "llvm/ADT/Optional.h"
13 #include "llvm/ADT/PointerUnion.h"
14 #include "llvm/ADT/StringMap.h"
15 #include "llvm/ADT/iterator.h"
16 #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
17 #include "llvm/DebugInfo/CodeView/StringsAndChecksums.h"
18 #include "llvm/DebugInfo/PDB/Native/ModuleDebugStream.h"
19 #include "llvm/Object/Binary.h"
20 #include "llvm/Object/ObjectFile.h"
21 #include "llvm/Support/Error.h"
25 class LazyRandomTypeCollection;
37 class SymbolGroupIterator;
43 std::unique_ptr<NativeSession> PdbSession;
44 object::OwningBinary<object::Binary> CoffObject;
45 std::unique_ptr<MemoryBuffer> UnknownFile;
46 PointerUnion<PDBFile *, object::COFFObjectFile *, MemoryBuffer *> PdbOrObj;
48 using TypeCollectionPtr = std::unique_ptr<codeview::LazyRandomTypeCollection>;
50 TypeCollectionPtr Types;
51 TypeCollectionPtr Ids;
53 enum TypeCollectionKind { kTypes, kIds };
54 codeview::LazyRandomTypeCollection &
55 getOrCreateTypeCollection(TypeCollectionKind Kind);
59 InputFile(InputFile &&Other) = default;
61 static Expected<InputFile> open(StringRef Path,
62 bool AllowUnknownFile = false);
65 const PDBFile &pdb() const;
66 object::COFFObjectFile &obj();
67 const object::COFFObjectFile &obj() const;
68 MemoryBuffer &unknown();
69 const MemoryBuffer &unknown() const;
71 StringRef getFilePath() const;
73 bool hasTypes() const;
76 codeview::LazyRandomTypeCollection &types();
77 codeview::LazyRandomTypeCollection &ids();
79 iterator_range<SymbolGroupIterator> symbol_groups();
80 SymbolGroupIterator symbol_groups_begin();
81 SymbolGroupIterator symbol_groups_end();
85 bool isUnknown() const;
89 friend class SymbolGroupIterator;
92 explicit SymbolGroup(InputFile *File, uint32_t GroupIndex = 0);
94 Expected<StringRef> getNameFromStringTable(uint32_t Offset) const;
96 void formatFromFileName(LinePrinter &Printer, StringRef File,
97 bool Append = false) const;
99 void formatFromChecksumsOffset(LinePrinter &Printer, uint32_t Offset,
100 bool Append = false) const;
102 StringRef name() const;
104 codeview::DebugSubsectionArray getDebugSubsections() const {
107 const ModuleDebugStreamRef &getPdbModuleStream() const;
109 const InputFile &getFile() const { return *File; }
110 InputFile &getFile() { return *File; }
112 bool hasDebugStream() const { return DebugStream != nullptr; }
115 void initializeForPdb(uint32_t Modi);
116 void updatePdbModi(uint32_t Modi);
117 void updateDebugS(const codeview::DebugSubsectionArray &SS);
119 void rebuildChecksumMap();
120 InputFile *File = nullptr;
122 codeview::DebugSubsectionArray Subsections;
123 std::shared_ptr<ModuleDebugStreamRef> DebugStream;
124 codeview::StringsAndChecksumsRef SC;
125 StringMap<codeview::FileChecksumEntry> ChecksumsByFile;
128 class SymbolGroupIterator
129 : public iterator_facade_base<SymbolGroupIterator,
130 std::forward_iterator_tag, SymbolGroup> {
132 SymbolGroupIterator();
133 explicit SymbolGroupIterator(InputFile &File);
134 SymbolGroupIterator(const SymbolGroupIterator &Other) = default;
135 SymbolGroupIterator &operator=(const SymbolGroupIterator &R) = default;
137 const SymbolGroup &operator*() const;
138 SymbolGroup &operator*();
140 bool operator==(const SymbolGroupIterator &R) const;
141 SymbolGroupIterator &operator++();
144 void scanToNextDebugS();
148 Optional<object::section_iterator> SectionIter;