1 //===- InputFile.h -------------------------------------------- *- C++ --*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_TOOLS_LLVMPDBDUMP_INPUTFILE_H
11 #define LLVM_TOOLS_LLVMPDBDUMP_INPUTFILE_H
13 #include "llvm/ADT/Optional.h"
14 #include "llvm/ADT/PointerUnion.h"
15 #include "llvm/ADT/StringMap.h"
16 #include "llvm/ADT/iterator.h"
17 #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
18 #include "llvm/DebugInfo/CodeView/StringsAndChecksums.h"
19 #include "llvm/DebugInfo/PDB/Native/ModuleDebugStream.h"
20 #include "llvm/Object/Binary.h"
21 #include "llvm/Object/ObjectFile.h"
22 #include "llvm/Support/Error.h"
26 class LazyRandomTypeCollection;
38 class SymbolGroupIterator;
44 std::unique_ptr<NativeSession> PdbSession;
45 object::OwningBinary<object::Binary> CoffObject;
46 std::unique_ptr<MemoryBuffer> UnknownFile;
47 PointerUnion3<PDBFile *, object::COFFObjectFile *, MemoryBuffer *> PdbOrObj;
49 using TypeCollectionPtr = std::unique_ptr<codeview::LazyRandomTypeCollection>;
51 TypeCollectionPtr Types;
52 TypeCollectionPtr Ids;
54 enum TypeCollectionKind { kTypes, kIds };
55 codeview::LazyRandomTypeCollection &
56 getOrCreateTypeCollection(TypeCollectionKind Kind);
60 InputFile(InputFile &&Other) = default;
62 static Expected<InputFile> open(StringRef Path,
63 bool AllowUnknownFile = false);
66 const PDBFile &pdb() const;
67 object::COFFObjectFile &obj();
68 const object::COFFObjectFile &obj() const;
69 MemoryBuffer &unknown();
70 const MemoryBuffer &unknown() const;
72 StringRef getFilePath() const;
74 bool hasTypes() const;
77 codeview::LazyRandomTypeCollection &types();
78 codeview::LazyRandomTypeCollection &ids();
80 iterator_range<SymbolGroupIterator> symbol_groups();
81 SymbolGroupIterator symbol_groups_begin();
82 SymbolGroupIterator symbol_groups_end();
86 bool isUnknown() const;
90 friend class SymbolGroupIterator;
93 explicit SymbolGroup(InputFile *File, uint32_t GroupIndex = 0);
95 Expected<StringRef> getNameFromStringTable(uint32_t Offset) const;
97 void formatFromFileName(LinePrinter &Printer, StringRef File,
98 bool Append = false) const;
100 void formatFromChecksumsOffset(LinePrinter &Printer, uint32_t Offset,
101 bool Append = false) const;
103 StringRef name() const;
105 codeview::DebugSubsectionArray getDebugSubsections() const {
108 const ModuleDebugStreamRef &getPdbModuleStream() const;
110 const InputFile &getFile() const { return *File; }
111 InputFile &getFile() { return *File; }
114 void initializeForPdb(uint32_t Modi);
115 void updatePdbModi(uint32_t Modi);
116 void updateDebugS(const codeview::DebugSubsectionArray &SS);
118 void rebuildChecksumMap();
119 InputFile *File = nullptr;
121 codeview::DebugSubsectionArray Subsections;
122 std::shared_ptr<ModuleDebugStreamRef> DebugStream;
123 codeview::StringsAndChecksumsRef SC;
124 StringMap<codeview::FileChecksumEntry> ChecksumsByFile;
127 class SymbolGroupIterator
128 : public iterator_facade_base<SymbolGroupIterator,
129 std::forward_iterator_tag, SymbolGroup> {
131 SymbolGroupIterator();
132 explicit SymbolGroupIterator(InputFile &File);
133 SymbolGroupIterator(const SymbolGroupIterator &Other) = default;
134 SymbolGroupIterator &operator=(const SymbolGroupIterator &R) = default;
136 const SymbolGroup &operator*() const;
137 SymbolGroup &operator*();
139 bool operator==(const SymbolGroupIterator &R) const;
140 SymbolGroupIterator &operator++();
143 void scanToNextDebugS();
147 Optional<object::section_iterator> SectionIter;