text: //===-- RuntimeDyldCheckerImpl.h -- RuntimeDyld test framework --*- C++ -*-===//
  //
  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  // See https://llvm.org/LICENSE.txt for license information.
  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  //
  //===----------------------------------------------------------------------===//
  
  #ifndef LLVM_LIB_EXECUTIONENGINE_RUNTIMEDYLD_RUNTIMEDYLDCHECKERIMPL_H
  #define LLVM_LIB_EXECUTIONENGINE_RUNTIMEDYLD_RUNTIMEDYLDCHECKERIMPL_H
  
  #include "RuntimeDyldImpl.h"
  
  namespace llvm {
  
  class RuntimeDyldCheckerImpl {
    friend class RuntimeDyldChecker;
    friend class RuntimeDyldImpl;
    friend class RuntimeDyldCheckerExprEval;
    friend class RuntimeDyldELF;
  
  public:
    RuntimeDyldCheckerImpl(RuntimeDyld &RTDyld, MCDisassembler *Disassembler,
                           MCInstPrinter *InstPrinter,
                           llvm::raw_ostream &ErrStream);
  
    bool check(StringRef CheckExpr) const;
    bool checkAllRulesInBuffer(StringRef RulePrefix, MemoryBuffer *MemBuf) const;
  
  private:
  
    // StubMap typedefs.
    typedef std::map<std::string, uint64_t> StubOffsetsMap;
    struct SectionAddressInfo {
      uint64_t SectionID;
      StubOffsetsMap StubOffsets;
    };
    typedef std::map<std::string, SectionAddressInfo> SectionMap;
    typedef std::map<std::string, SectionMap> StubMap;
  
    RuntimeDyldImpl &getRTDyld() const { return *RTDyld.Dyld; }
  
    Expected<JITSymbolResolver::LookupResult>
    lookup(const JITSymbolResolver::LookupSet &Symbols) const;
  
    bool isSymbolValid(StringRef Symbol) const;
    uint64_t getSymbolLocalAddr(StringRef Symbol) const;
    uint64_t getSymbolRemoteAddr(StringRef Symbol) const;
    uint64_t readMemoryAtAddr(uint64_t Addr, unsigned Size) const;
  
    std::pair<const SectionAddressInfo*, std::string> findSectionAddrInfo(
                                                     StringRef FileName,
                                                     StringRef SectionName) const;
  
    std::pair<uint64_t, std::string> getSectionAddr(StringRef FileName,
                                                    StringRef SectionName,
                                                    bool IsInsideLoad) const;
  
    std::pair<uint64_t, std::string> getStubAddrFor(StringRef FileName,
                                                    StringRef SectionName,
                                                    StringRef Symbol,
                                                    bool IsInsideLoad) const;
    StringRef getSubsectionStartingAt(StringRef Name) const;
  
    Optional<uint64_t> getSectionLoadAddress(void *LocalAddr) const;
  
    void registerSection(StringRef FilePath, unsigned SectionID);
    void registerStubMap(StringRef FilePath, unsigned SectionID,
                         const RuntimeDyldImpl::StubMap &RTDyldStubs);
  
    RuntimeDyld &RTDyld;
    MCDisassembler *Disassembler;
    MCInstPrinter *InstPrinter;
    llvm::raw_ostream &ErrStream;
  
    StubMap Stubs;
  };
  }
  
  #endif
  