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 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
);
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
;