1 //===- IPDBSession.h - base interface for a PDB symbol context --*- 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_IPDBSESSION_H
10 #define LLVM_DEBUGINFO_PDB_IPDBSESSION_H
11 
12 #include "PDBSymbol.h"
13 #include "PDBTypes.h"
14 #include "llvm/ADT/StringRef.h"
15 #include "llvm/Support/Casting.h"
16 #include <memory>
17 
18 namespace llvm {
19 namespace pdb {
20 class PDBSymbolCompiland;
21 class PDBSymbolExe;
22 
23 /// IPDBSession defines an interface used to provide a context for querying
24 /// debug information from a debug data source (for example, a PDB).
25 class IPDBSession {
26 public:
27   virtual ~IPDBSession();
28 
29   virtual uint64_t getLoadAddress() const = 0;
30   virtual bool setLoadAddress(uint64_t Address) = 0;
31   virtual std::unique_ptr<PDBSymbolExe> getGlobalScope() = 0;
32   virtual std::unique_ptr<PDBSymbol>
33   getSymbolById(SymIndexId SymbolId) const = 0;
34 
35   virtual bool addressForVA(uint64_t VA, uint32_t &Section,
36                             uint32_t &Offset) const = 0;
37   virtual bool addressForRVA(uint32_t RVA, uint32_t &Section,
38                              uint32_t &Offset) const = 0;
39 
40   template <typename T>
41   std::unique_ptr<T> getConcreteSymbolById(SymIndexId SymbolId) const {
42     return unique_dyn_cast_or_null<T>(getSymbolById(SymbolId));
43   }
44 
45   virtual std::unique_ptr<PDBSymbol>
46   findSymbolByAddress(uint64_t Address, PDB_SymType Type) const = 0;
47   virtual std::unique_ptr<PDBSymbol>
48   findSymbolByRVA(uint32_t RVA, PDB_SymType Type) const = 0;
49   virtual std::unique_ptr<PDBSymbol>
50   findSymbolBySectOffset(uint32_t Sect, uint32_t Offset,
51                          PDB_SymType Type) const = 0;
52 
53   virtual std::unique_ptr<IPDBEnumLineNumbers>
54   findLineNumbers(const PDBSymbolCompiland &Compiland,
55                   const IPDBSourceFile &File) const = 0;
56   virtual std::unique_ptr<IPDBEnumLineNumbers>
57   findLineNumbersByAddress(uint64_t Address, uint32_t Length) const = 0;
58   virtual std::unique_ptr<IPDBEnumLineNumbers>
59   findLineNumbersByRVA(uint32_t RVA, uint32_t Length) const = 0;
60   virtual std::unique_ptr<IPDBEnumLineNumbers>
61   findLineNumbersBySectOffset(uint32_t Section, uint32_t Offset,
62                               uint32_t Length) const = 0;
63 
64   virtual std::unique_ptr<IPDBEnumSourceFiles>
65   findSourceFiles(const PDBSymbolCompiland *Compiland, llvm::StringRef Pattern,
66                   PDB_NameSearchFlags Flags) const = 0;
67   virtual std::unique_ptr<IPDBSourceFile>
68   findOneSourceFile(const PDBSymbolCompiland *Compiland,
69                     llvm::StringRef Pattern,
70                     PDB_NameSearchFlags Flags) const = 0;
71   virtual std::unique_ptr<IPDBEnumChildren<PDBSymbolCompiland>>
72   findCompilandsForSourceFile(llvm::StringRef Pattern,
73                               PDB_NameSearchFlags Flags) const = 0;
74   virtual std::unique_ptr<PDBSymbolCompiland>
75   findOneCompilandForSourceFile(llvm::StringRef Pattern,
76                                 PDB_NameSearchFlags Flags) const = 0;
77 
78   virtual std::unique_ptr<IPDBEnumSourceFiles> getAllSourceFiles() const = 0;
79   virtual std::unique_ptr<IPDBEnumSourceFiles>
80   getSourceFilesForCompiland(const PDBSymbolCompiland &Compiland) const = 0;
81   virtual std::unique_ptr<IPDBSourceFile>
82   getSourceFileById(uint32_t FileId) const = 0;
83 
84   virtual std::unique_ptr<IPDBEnumDataStreams> getDebugStreams() const = 0;
85 
86   virtual std::unique_ptr<IPDBEnumTables> getEnumTables() const = 0;
87 
88   virtual std::unique_ptr<IPDBEnumInjectedSources>
89   getInjectedSources() const = 0;
90 
91   virtual std::unique_ptr<IPDBEnumSectionContribs>
92   getSectionContribs() const = 0;
93 
94   virtual std::unique_ptr<IPDBEnumFrameData>
95   getFrameData() const = 0;
96 };
97 } // namespace pdb
98 } // namespace llvm
99 
100 #endif
101