Recommit r369190 "[llvm-readobj/llvm-readelf] - Improve/cleanup the error reporting...
[llvm-complete.git] / tools / llvm-pdbutil / InputFile.h
blobf25390c971d061c164e85584c7d5c831dc26bb2c
1 //===- InputFile.h -------------------------------------------- *- 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 //===----------------------------------------------------------------------===//
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"
23 namespace llvm {
24 namespace codeview {
25 class LazyRandomTypeCollection;
27 namespace object {
28 class COFFObjectFile;
29 class SectionRef;
30 } // namespace object
32 namespace pdb {
33 class InputFile;
34 class LinePrinter;
35 class PDBFile;
36 class NativeSession;
37 class SymbolGroupIterator;
38 class SymbolGroup;
40 class InputFile {
41 InputFile();
43 std::unique_ptr<NativeSession> PdbSession;
44 object::OwningBinary<object::Binary> CoffObject;
45 std::unique_ptr<MemoryBuffer> UnknownFile;
46 PointerUnion3<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);
57 public:
58 ~InputFile();
59 InputFile(InputFile &&Other) = default;
61 static Expected<InputFile> open(StringRef Path,
62 bool AllowUnknownFile = false);
64 PDBFile &pdb();
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;
74 bool hasIds() 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();
83 bool isPdb() const;
84 bool isObj() const;
85 bool isUnknown() const;
88 class SymbolGroup {
89 friend class SymbolGroupIterator;
91 public:
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 {
105 return Subsections;
107 const ModuleDebugStreamRef &getPdbModuleStream() const;
109 const InputFile &getFile() const { return *File; }
110 InputFile &getFile() { return *File; }
112 bool hasDebugStream() const { return DebugStream != nullptr; }
114 private:
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;
121 StringRef Name;
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> {
131 public:
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++();
143 private:
144 void scanToNextDebugS();
145 bool isEnd() const;
147 uint32_t Index = 0;
148 Optional<object::section_iterator> SectionIter;
149 SymbolGroup Value;
152 } // namespace pdb
153 } // namespace llvm
155 #endif