1 | //===- NativeSession.h - Native implementation of IPDBSession ---*- 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 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef LLVM_DEBUGINFO_PDB_NATIVE_NATIVESESSION_H |
10 | #define LLVM_DEBUGINFO_PDB_NATIVE_NATIVESESSION_H |
11 | |
12 | #include "llvm/ADT/IntervalMap.h" |
13 | #include "llvm/ADT/StringRef.h" |
14 | #include "llvm/DebugInfo/PDB/IPDBSession.h" |
15 | #include "llvm/DebugInfo/PDB/Native/SymbolCache.h" |
16 | #include "llvm/DebugInfo/PDB/PDBTypes.h" |
17 | #include "llvm/Support/Allocator.h" |
18 | #include "llvm/Support/Error.h" |
19 | |
20 | namespace llvm { |
21 | class MemoryBuffer; |
22 | namespace pdb { |
23 | class PDBFile; |
24 | class NativeExeSymbol; |
25 | class IPDBSourceFile; |
26 | class ModuleDebugStreamRef; |
27 | class PDBSymbol; |
28 | class PDBSymbolCompiland; |
29 | class PDBSymbolExe; |
30 | template <typename ChildType> class IPDBEnumChildren; |
31 | |
32 | class NativeSession : public IPDBSession { |
33 | struct PdbSearchOptions { |
34 | StringRef ExePath; |
35 | // FIXME: Add other PDB search options (_NT_SYMBOL_PATH, symsrv) |
36 | }; |
37 | |
38 | public: |
39 | NativeSession(std::unique_ptr<PDBFile> PdbFile, |
40 | std::unique_ptr<BumpPtrAllocator> Allocator); |
41 | ~NativeSession() override; |
42 | |
43 | static Error createFromPdb(std::unique_ptr<MemoryBuffer> MB, |
44 | std::unique_ptr<IPDBSession> &Session); |
45 | static Error createFromPdbPath(StringRef PdbPath, |
46 | std::unique_ptr<IPDBSession> &Session); |
47 | static Error createFromExe(StringRef Path, |
48 | std::unique_ptr<IPDBSession> &Session); |
49 | static Expected<std::string> searchForPdb(const PdbSearchOptions &Opts); |
50 | |
51 | uint64_t getLoadAddress() const override; |
52 | bool setLoadAddress(uint64_t Address) override; |
53 | std::unique_ptr<PDBSymbolExe> getGlobalScope() override; |
54 | std::unique_ptr<PDBSymbol> getSymbolById(SymIndexId SymbolId) const override; |
55 | |
56 | bool addressForVA(uint64_t VA, uint32_t &Section, |
57 | uint32_t &Offset) const override; |
58 | bool addressForRVA(uint32_t RVA, uint32_t &Section, |
59 | uint32_t &Offset) const override; |
60 | |
61 | std::unique_ptr<PDBSymbol> findSymbolByAddress(uint64_t Address, |
62 | PDB_SymType Type) override; |
63 | std::unique_ptr<PDBSymbol> findSymbolByRVA(uint32_t RVA, |
64 | PDB_SymType Type) override; |
65 | std::unique_ptr<PDBSymbol> findSymbolBySectOffset(uint32_t Sect, |
66 | uint32_t Offset, |
67 | PDB_SymType Type) override; |
68 | |
69 | std::unique_ptr<IPDBEnumLineNumbers> |
70 | findLineNumbers(const PDBSymbolCompiland &Compiland, |
71 | const IPDBSourceFile &File) const override; |
72 | std::unique_ptr<IPDBEnumLineNumbers> |
73 | findLineNumbersByAddress(uint64_t Address, uint32_t Length) const override; |
74 | std::unique_ptr<IPDBEnumLineNumbers> |
75 | findLineNumbersByRVA(uint32_t RVA, uint32_t Length) const override; |
76 | std::unique_ptr<IPDBEnumLineNumbers> |
77 | findLineNumbersBySectOffset(uint32_t Section, uint32_t Offset, |
78 | uint32_t Length) const override; |
79 | |
80 | std::unique_ptr<IPDBEnumSourceFiles> |
81 | findSourceFiles(const PDBSymbolCompiland *Compiland, llvm::StringRef Pattern, |
82 | PDB_NameSearchFlags Flags) const override; |
83 | std::unique_ptr<IPDBSourceFile> |
84 | findOneSourceFile(const PDBSymbolCompiland *Compiland, |
85 | llvm::StringRef Pattern, |
86 | PDB_NameSearchFlags Flags) const override; |
87 | std::unique_ptr<IPDBEnumChildren<PDBSymbolCompiland>> |
88 | findCompilandsForSourceFile(llvm::StringRef Pattern, |
89 | PDB_NameSearchFlags Flags) const override; |
90 | std::unique_ptr<PDBSymbolCompiland> |
91 | findOneCompilandForSourceFile(llvm::StringRef Pattern, |
92 | PDB_NameSearchFlags Flags) const override; |
93 | std::unique_ptr<IPDBEnumSourceFiles> getAllSourceFiles() const override; |
94 | std::unique_ptr<IPDBEnumSourceFiles> getSourceFilesForCompiland( |
95 | const PDBSymbolCompiland &Compiland) const override; |
96 | std::unique_ptr<IPDBSourceFile> |
97 | getSourceFileById(uint32_t FileId) const override; |
98 | |
99 | std::unique_ptr<IPDBEnumDataStreams> getDebugStreams() const override; |
100 | |
101 | std::unique_ptr<IPDBEnumTables> getEnumTables() const override; |
102 | |
103 | std::unique_ptr<IPDBEnumInjectedSources> getInjectedSources() const override; |
104 | |
105 | std::unique_ptr<IPDBEnumSectionContribs> getSectionContribs() const override; |
106 | |
107 | std::unique_ptr<IPDBEnumFrameData> getFrameData() const override; |
108 | |
109 | PDBFile &getPDBFile() { return *Pdb; } |
110 | const PDBFile &getPDBFile() const { return *Pdb; } |
111 | |
112 | NativeExeSymbol &getNativeGlobalScope() const; |
113 | SymbolCache &getSymbolCache() { return Cache; } |
114 | const SymbolCache &getSymbolCache() const { return Cache; } |
115 | uint32_t getRVAFromSectOffset(uint32_t Section, uint32_t Offset) const; |
116 | uint64_t getVAFromSectOffset(uint32_t Section, uint32_t Offset) const; |
117 | bool moduleIndexForVA(uint64_t VA, uint16_t &ModuleIndex) const; |
118 | bool moduleIndexForSectOffset(uint32_t Sect, uint32_t Offset, |
119 | uint16_t &ModuleIndex) const; |
120 | Expected<ModuleDebugStreamRef> getModuleDebugStream(uint32_t Index) const; |
121 | |
122 | private: |
123 | void initializeExeSymbol(); |
124 | void parseSectionContribs(); |
125 | |
126 | std::unique_ptr<PDBFile> Pdb; |
127 | std::unique_ptr<BumpPtrAllocator> Allocator; |
128 | |
129 | SymbolCache Cache; |
130 | SymIndexId ExeSymbol = 0; |
131 | uint64_t LoadAddress = 0; |
132 | |
133 | /// Map from virtual address to module index. |
134 | using IMap = |
135 | IntervalMap<uint64_t, uint16_t, 8, IntervalMapHalfOpenInfo<uint64_t>>; |
136 | IMap::Allocator IMapAllocator; |
137 | IMap AddrToModuleIndex; |
138 | }; |
139 | } // namespace pdb |
140 | } // namespace llvm |
141 | |
142 | #endif |
143 | |