Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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