Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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.