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; }
113 bool hasDebugStream() const { return DebugStream != nullptr; }
116 void initializeForPdb(uint32_t Modi);
117 void updatePdbModi(uint32_t Modi);
118 void updateDebugS(const codeview::DebugSubsectionArray &SS);
120 void rebuildChecksumMap();
121 InputFile *File = nullptr;
123 codeview::DebugSubsectionArray Subsections;
124 std::shared_ptr<ModuleDebugStreamRef> DebugStream;
125 codeview::StringsAndChecksumsRef SC;
126 StringMap<codeview::FileChecksumEntry> ChecksumsByFile;
129 class SymbolGroupIterator
130 : public iterator_facade_base<SymbolGroupIterator,
131 std::forward_iterator_tag, SymbolGroup> {
133 SymbolGroupIterator();
134 explicit SymbolGroupIterator(InputFile &File);
135 SymbolGroupIterator(const SymbolGroupIterator &Other) = default;
136 SymbolGroupIterator &operator=(const SymbolGroupIterator &R) = default;
138 const SymbolGroup &operator*() const;
139 SymbolGroup &operator*();
141 bool operator==(const SymbolGroupIterator &R) const;
142 SymbolGroupIterator &operator++();
145 void scanToNextDebugS();
149 Optional<object::section_iterator> SectionIter;