137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===-- RuntimeDyldCheckerImpl.h -- RuntimeDyld test framework --*- C++ -*-===//
237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//                     The LLVM Compiler Infrastructure
437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// This file is distributed under the University of Illinois Open Source
637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// License. See LICENSE.TXT for details.
737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===----------------------------------------------------------------------===//
937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_EXECUTIONENGINE_RUNTIMEDYLD_RUNTIMEDYLDCHECKERIMPL_H
1137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_EXECUTIONENGINE_RUNTIMEDYLD_RUNTIMEDYLDCHECKERIMPL_H
1237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "RuntimeDyldImpl.h"
1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesnamespace llvm {
1637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass RuntimeDyldCheckerImpl {
1837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  friend class RuntimeDyldChecker;
1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  friend class RuntimeDyldImpl;
2037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  friend class RuntimeDyldCheckerExprEval;
210c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  friend class RuntimeDyldELF;
2237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
2337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinespublic:
2437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  RuntimeDyldCheckerImpl(RuntimeDyld &RTDyld, MCDisassembler *Disassembler,
2537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                         MCInstPrinter *InstPrinter,
2637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                         llvm::raw_ostream &ErrStream);
2737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
2837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool check(StringRef CheckExpr) const;
2937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool checkAllRulesInBuffer(StringRef RulePrefix, MemoryBuffer *MemBuf) const;
3037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
3137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesprivate:
3237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
3337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // StubMap typedefs.
3437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  typedef std::map<std::string, uint64_t> StubOffsetsMap;
3537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  struct SectionAddressInfo {
3637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    uint64_t SectionID;
3737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    StubOffsetsMap StubOffsets;
3837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  };
3937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  typedef std::map<std::string, SectionAddressInfo> SectionMap;
4037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  typedef std::map<std::string, SectionMap> StubMap;
4137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
4237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  RuntimeDyldImpl &getRTDyld() const { return *RTDyld.Dyld; }
4337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
4437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool isSymbolValid(StringRef Symbol) const;
454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  uint64_t getSymbolLocalAddr(StringRef Symbol) const;
4637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t getSymbolRemoteAddr(StringRef Symbol) const;
4737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  uint64_t readMemoryAtAddr(uint64_t Addr, unsigned Size) const;
4837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
4937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  std::pair<const SectionAddressInfo*, std::string> findSectionAddrInfo(
5037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                   StringRef FileName,
5137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                   StringRef SectionName) const;
5237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
5337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  std::pair<uint64_t, std::string> getSectionAddr(StringRef FileName,
5437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                  StringRef SectionName,
5537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                  bool IsInsideLoad) const;
5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
5737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  std::pair<uint64_t, std::string> getStubAddrFor(StringRef FileName,
5837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                  StringRef SectionName,
5937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                  StringRef Symbol,
6037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                  bool IsInsideLoad) const;
6137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  StringRef getSubsectionStartingAt(StringRef Name) const;
6237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
6337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void registerSection(StringRef FilePath, unsigned SectionID);
6437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void registerStubMap(StringRef FilePath, unsigned SectionID,
6537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                       const RuntimeDyldImpl::StubMap &RTDyldStubs);
6637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
6737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  RuntimeDyld &RTDyld;
6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  MCDisassembler *Disassembler;
6937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  MCInstPrinter *InstPrinter;
7037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  llvm::raw_ostream &ErrStream;
7137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
7237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  StubMap Stubs;
7337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines};
7437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
7537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
7637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#endif
77