• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- InputFile.h -------------------------------------------- *- C++ --*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef LLVM_TOOLS_LLVMPDBDUMP_INPUTFILE_H
11 #define LLVM_TOOLS_LLVMPDBDUMP_INPUTFILE_H
12 
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"
23 
24 namespace llvm {
25 namespace codeview {
26 class LazyRandomTypeCollection;
27 }
28 namespace object {
29 class COFFObjectFile;
30 class SectionRef;
31 } // namespace object
32 
33 namespace pdb {
34 class InputFile;
35 class LinePrinter;
36 class PDBFile;
37 class NativeSession;
38 class SymbolGroupIterator;
39 class SymbolGroup;
40 
41 class InputFile {
42   InputFile();
43 
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;
48 
49   using TypeCollectionPtr = std::unique_ptr<codeview::LazyRandomTypeCollection>;
50 
51   TypeCollectionPtr Types;
52   TypeCollectionPtr Ids;
53 
54   enum TypeCollectionKind { kTypes, kIds };
55   codeview::LazyRandomTypeCollection &
56   getOrCreateTypeCollection(TypeCollectionKind Kind);
57 
58 public:
59   ~InputFile();
60   InputFile(InputFile &&Other) = default;
61 
62   static Expected<InputFile> open(StringRef Path,
63                                   bool AllowUnknownFile = false);
64 
65   PDBFile &pdb();
66   const PDBFile &pdb() const;
67   object::COFFObjectFile &obj();
68   const object::COFFObjectFile &obj() const;
69   MemoryBuffer &unknown();
70   const MemoryBuffer &unknown() const;
71 
72   StringRef getFilePath() const;
73 
74   bool hasTypes() const;
75   bool hasIds() const;
76 
77   codeview::LazyRandomTypeCollection &types();
78   codeview::LazyRandomTypeCollection &ids();
79 
80   iterator_range<SymbolGroupIterator> symbol_groups();
81   SymbolGroupIterator symbol_groups_begin();
82   SymbolGroupIterator symbol_groups_end();
83 
84   bool isPdb() const;
85   bool isObj() const;
86   bool isUnknown() const;
87 };
88 
89 class SymbolGroup {
90   friend class SymbolGroupIterator;
91 
92 public:
93   explicit SymbolGroup(InputFile *File, uint32_t GroupIndex = 0);
94 
95   Expected<StringRef> getNameFromStringTable(uint32_t Offset) const;
96 
97   void formatFromFileName(LinePrinter &Printer, StringRef File,
98                           bool Append = false) const;
99 
100   void formatFromChecksumsOffset(LinePrinter &Printer, uint32_t Offset,
101                                  bool Append = false) const;
102 
103   StringRef name() const;
104 
getDebugSubsections()105   codeview::DebugSubsectionArray getDebugSubsections() const {
106     return Subsections;
107   }
108   const ModuleDebugStreamRef &getPdbModuleStream() const;
109 
getFile()110   const InputFile &getFile() const { return *File; }
getFile()111   InputFile &getFile() { return *File; }
112 
113 private:
114   void initializeForPdb(uint32_t Modi);
115   void updatePdbModi(uint32_t Modi);
116   void updateDebugS(const codeview::DebugSubsectionArray &SS);
117 
118   void rebuildChecksumMap();
119   InputFile *File = nullptr;
120   StringRef Name;
121   codeview::DebugSubsectionArray Subsections;
122   std::shared_ptr<ModuleDebugStreamRef> DebugStream;
123   codeview::StringsAndChecksumsRef SC;
124   StringMap<codeview::FileChecksumEntry> ChecksumsByFile;
125 };
126 
127 class SymbolGroupIterator
128     : public iterator_facade_base<SymbolGroupIterator,
129                                   std::forward_iterator_tag, SymbolGroup> {
130 public:
131   SymbolGroupIterator();
132   explicit SymbolGroupIterator(InputFile &File);
133   SymbolGroupIterator(const SymbolGroupIterator &Other) = default;
134   SymbolGroupIterator &operator=(const SymbolGroupIterator &R) = default;
135 
136   const SymbolGroup &operator*() const;
137   SymbolGroup &operator*();
138 
139   bool operator==(const SymbolGroupIterator &R) const;
140   SymbolGroupIterator &operator++();
141 
142 private:
143   void scanToNextDebugS();
144   bool isEnd() const;
145 
146   uint32_t Index = 0;
147   Optional<object::section_iterator> SectionIter;
148   SymbolGroup Value;
149 };
150 
151 } // namespace pdb
152 } // namespace llvm
153 
154 #endif
155