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> findSymbolByAddress(uint64_t Address,
46                                                          PDB_SymType Type) = 0;
47   virtual std::unique_ptr<PDBSymbol> findSymbolByRVA(uint32_t RVA,
48                                                      PDB_SymType Type) = 0;
49   virtual std::unique_ptr<PDBSymbol>
50   findSymbolBySectOffset(uint32_t Sect, uint32_t Offset, PDB_SymType Type) = 0;
51 
52   virtual std::unique_ptr<IPDBEnumLineNumbers>
53   findLineNumbers(const PDBSymbolCompiland &Compiland,
54                   const IPDBSourceFile &File) const = 0;
55   virtual std::unique_ptr<IPDBEnumLineNumbers>
56   findLineNumbersByAddress(uint64_t Address, uint32_t Length) const = 0;
57   virtual std::unique_ptr<IPDBEnumLineNumbers>
58   findLineNumbersByRVA(uint32_t RVA, uint32_t Length) const = 0;
59   virtual std::unique_ptr<IPDBEnumLineNumbers>
60   findLineNumbersBySectOffset(uint32_t Section, uint32_t Offset,
61                               uint32_t Length) const = 0;
62 
63   virtual std::unique_ptr<IPDBEnumSourceFiles>
64   findSourceFiles(const PDBSymbolCompiland *Compiland, llvm::StringRef Pattern,
65                   PDB_NameSearchFlags Flags) const = 0;
66   virtual std::unique_ptr<IPDBSourceFile>
67   findOneSourceFile(const PDBSymbolCompiland *Compiland,
68                     llvm::StringRef Pattern,
69                     PDB_NameSearchFlags Flags) const = 0;
70   virtual std::unique_ptr<IPDBEnumChildren<PDBSymbolCompiland>>
71   findCompilandsForSourceFile(llvm::StringRef Pattern,
72                               PDB_NameSearchFlags Flags) const = 0;
73   virtual std::unique_ptr<PDBSymbolCompiland>
74   findOneCompilandForSourceFile(llvm::StringRef Pattern,
75                                 PDB_NameSearchFlags Flags) const = 0;
76 
77   virtual std::unique_ptr<IPDBEnumSourceFiles> getAllSourceFiles() const = 0;
78   virtual std::unique_ptr<IPDBEnumSourceFiles>
79   getSourceFilesForCompiland(const PDBSymbolCompiland &Compiland) const = 0;
80   virtual std::unique_ptr<IPDBSourceFile>
81   getSourceFileById(uint32_t FileId) const = 0;
82 
83   virtual std::unique_ptr<IPDBEnumDataStreams> getDebugStreams() const = 0;
84 
85   virtual std::unique_ptr<IPDBEnumTables> getEnumTables() const = 0;
86 
87   virtual std::unique_ptr<IPDBEnumInjectedSources>
88   getInjectedSources() const = 0;
89 
90   virtual std::unique_ptr<IPDBEnumSectionContribs>
91   getSectionContribs() const = 0;
92 
93   virtual std::unique_ptr<IPDBEnumFrameData>
94   getFrameData() const = 0;
95 };
96 } // namespace pdb
97 } // namespace llvm
98 
99 #endif
100