diff options
| author | Lang Hames <lhames@gmail.com> | 2019-04-08 21:50:48 +0000 | 
|---|---|---|
| committer | Lang Hames <lhames@gmail.com> | 2019-04-08 21:50:48 +0000 | 
| commit | 941f247d30c447903107aa614ea46fb1e4019698 (patch) | |
| tree | 1689e12590a67f0d1044b9b90edc616040de5f1e /llvm/lib/ExecutionEngine/RuntimeDyld | |
| parent | fecbf5918b818f319f97b1f60ac591c159c0f089 (diff) | |
| download | bcm5719-llvm-941f247d30c447903107aa614ea46fb1e4019698.tar.gz bcm5719-llvm-941f247d30c447903107aa614ea46fb1e4019698.zip  | |
[RuntimeDyld] Decouple RuntimeDyldChecker from RuntimeDyld.
This will allow RuntimeDyldChecker (and rtdyld-check tests) to test a new JIT
linker: JITLink (https://reviews.llvm.org/D58704).
llvm-svn: 357947
Diffstat (limited to 'llvm/lib/ExecutionEngine/RuntimeDyld')
5 files changed, 230 insertions, 283 deletions
diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp index 589cdcbcb0d..dee8ecda13a 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp @@ -12,7 +12,6 @@  #include "llvm/ExecutionEngine/RuntimeDyld.h"  #include "RuntimeDyldCOFF.h" -#include "RuntimeDyldCheckerImpl.h"  #include "RuntimeDyldELF.h"  #include "RuntimeDyldImpl.h"  #include "RuntimeDyldMachO.h" @@ -375,10 +374,34 @@ RuntimeDyldImpl::loadObjectImpl(const object::ObjectFile &Obj) {        else          return IOrErr.takeError(); -    // If there is an attached checker, notify it about the stubs for this -    // section so that they can be verified. -    if (Checker) -      Checker->registerStubMap(Obj.getFileName(), SectionID, Stubs); +    // If there is a NotifyStubEmitted callback set, call it to register any +    // stubs created for this section. +    if (NotifyStubEmitted) { +      StringRef FileName = Obj.getFileName(); +      StringRef SectionName = Sections[SectionID].getName(); +      for (auto &KV : Stubs) { + +        auto &VR = KV.first; +        uint64_t StubAddr = KV.second; + +        // If this is a named stub, just call NotifyStubEmitted. +        if (VR.SymbolName) { +          NotifyStubEmitted(FileName, SectionName, VR.SymbolName, StubAddr); +          continue; +        } + +        // Otherwise we will have to try a reverse lookup on the globla symbol table. +        for (auto &GSTMapEntry : GlobalSymbolTable) { +          StringRef SymbolName = GSTMapEntry.first(); +          auto &GSTEntry = GSTMapEntry.second; +          if (GSTEntry.getSectionID() == VR.SectionID && +              GSTEntry.getOffset() == VR.Offset) { +            NotifyStubEmitted(FileName, SectionName, SymbolName, StubAddr); +            break; +          } +        } +      } +    }    }    // Process remaining sections @@ -721,9 +744,6 @@ Error RuntimeDyldImpl::emitCommonSymbols(const ObjectFile &Obj,      Addr += Size;    } -  if (Checker) -    Checker->registerSection(Obj.getFileName(), SectionID); -    return Error::success();  } @@ -840,9 +860,6 @@ RuntimeDyldImpl::emitSection(const ObjectFile &Obj,    if (!IsRequired)      Sections.back().setLoadAddress(0); -  if (Checker) -    Checker->registerSection(Obj.getFileName(), SectionID); -    return SectionID;  } @@ -1225,42 +1242,43 @@ RuntimeDyld::RuntimeDyld(RuntimeDyld::MemoryManager &MemMgr,    // permissions are applied.    Dyld = nullptr;    ProcessAllSections = false; -  Checker = nullptr;  }  RuntimeDyld::~RuntimeDyld() {}  static std::unique_ptr<RuntimeDyldCOFF> -createRuntimeDyldCOFF(Triple::ArchType Arch, RuntimeDyld::MemoryManager &MM, -                      JITSymbolResolver &Resolver, bool ProcessAllSections, -                      RuntimeDyldCheckerImpl *Checker) { +createRuntimeDyldCOFF( +                     Triple::ArchType Arch, RuntimeDyld::MemoryManager &MM, +                     JITSymbolResolver &Resolver, bool ProcessAllSections, +                     RuntimeDyld::NotifyStubEmittedFunction NotifyStubEmitted) {    std::unique_ptr<RuntimeDyldCOFF> Dyld =      RuntimeDyldCOFF::create(Arch, MM, Resolver);    Dyld->setProcessAllSections(ProcessAllSections); -  Dyld->setRuntimeDyldChecker(Checker); +  Dyld->setNotifyStubEmitted(std::move(NotifyStubEmitted));    return Dyld;  }  static std::unique_ptr<RuntimeDyldELF>  createRuntimeDyldELF(Triple::ArchType Arch, RuntimeDyld::MemoryManager &MM,                       JITSymbolResolver &Resolver, bool ProcessAllSections, -                     RuntimeDyldCheckerImpl *Checker) { +                     RuntimeDyld::NotifyStubEmittedFunction NotifyStubEmitted) {    std::unique_ptr<RuntimeDyldELF> Dyld =        RuntimeDyldELF::create(Arch, MM, Resolver);    Dyld->setProcessAllSections(ProcessAllSections); -  Dyld->setRuntimeDyldChecker(Checker); +  Dyld->setNotifyStubEmitted(std::move(NotifyStubEmitted));    return Dyld;  }  static std::unique_ptr<RuntimeDyldMachO> -createRuntimeDyldMachO(Triple::ArchType Arch, RuntimeDyld::MemoryManager &MM, -                       JITSymbolResolver &Resolver, -                       bool ProcessAllSections, -                       RuntimeDyldCheckerImpl *Checker) { +createRuntimeDyldMachO( +                     Triple::ArchType Arch, RuntimeDyld::MemoryManager &MM, +                     JITSymbolResolver &Resolver, +                     bool ProcessAllSections, +                     RuntimeDyld::NotifyStubEmittedFunction NotifyStubEmitted) {    std::unique_ptr<RuntimeDyldMachO> Dyld =      RuntimeDyldMachO::create(Arch, MM, Resolver);    Dyld->setProcessAllSections(ProcessAllSections); -  Dyld->setRuntimeDyldChecker(Checker); +  Dyld->setNotifyStubEmitted(std::move(NotifyStubEmitted));    return Dyld;  } @@ -1270,15 +1288,16 @@ RuntimeDyld::loadObject(const ObjectFile &Obj) {      if (Obj.isELF())        Dyld =            createRuntimeDyldELF(static_cast<Triple::ArchType>(Obj.getArch()), -                               MemMgr, Resolver, ProcessAllSections, Checker); +                               MemMgr, Resolver, ProcessAllSections, +                               std::move(NotifyStubEmitted));      else if (Obj.isMachO())        Dyld = createRuntimeDyldMachO(                 static_cast<Triple::ArchType>(Obj.getArch()), MemMgr, Resolver, -               ProcessAllSections, Checker); +               ProcessAllSections, std::move(NotifyStubEmitted));      else if (Obj.isCOFF())        Dyld = createRuntimeDyldCOFF(                 static_cast<Triple::ArchType>(Obj.getArch()), MemMgr, Resolver, -               ProcessAllSections, Checker); +               ProcessAllSections, std::move(NotifyStubEmitted));      else        report_fatal_error("Incompatible object format!");    } @@ -1297,6 +1316,11 @@ void *RuntimeDyld::getSymbolLocalAddress(StringRef Name) const {    return Dyld->getSymbolLocalAddress(Name);  } +unsigned RuntimeDyld::getSymbolSectionID(StringRef Name) const { +  assert(Dyld && "No RuntimeDyld instance attached"); +  return Dyld->getSymbolSectionID(Name); +} +  JITEvaluatedSymbol RuntimeDyld::getSymbol(StringRef Name) const {    if (!Dyld)      return nullptr; @@ -1335,6 +1359,16 @@ void RuntimeDyld::finalizeWithMemoryManagerLocking() {    }  } +StringRef RuntimeDyld::getSectionContent(unsigned SectionID) const { +  assert(Dyld && "No Dyld instance attached"); +  return Dyld->getSectionContent(SectionID); +} + +uint64_t RuntimeDyld::getSectionLoadAddress(unsigned SectionID) const { +  assert(Dyld && "No Dyld instance attached"); +  return Dyld->getSectionLoadAddress(SectionID); +} +  void RuntimeDyld::registerEHFrames() {    if (Dyld)      Dyld->registerEHFrames(); diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp index 28c8a69939e..8ec6207ee70 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp @@ -8,15 +8,14 @@  #include "llvm/ExecutionEngine/RuntimeDyldChecker.h"  #include "RuntimeDyldCheckerImpl.h" -#include "RuntimeDyldImpl.h"  #include "llvm/ADT/STLExtras.h"  #include "llvm/MC/MCContext.h"  #include "llvm/MC/MCDisassembler/MCDisassembler.h"  #include "llvm/MC/MCInst.h" +#include "llvm/Support/Endian.h"  #include "llvm/Support/MSVCErrorWorkarounds.h"  #include "llvm/Support/Path.h"  #include <cctype> -#include <future>  #include <memory>  #include <utility> @@ -665,25 +664,36 @@ private:    bool decodeInst(StringRef Symbol, MCInst &Inst, uint64_t &Size) const {      MCDisassembler *Dis = Checker.Disassembler; -    StringRef SectionMem = Checker.getSubsectionStartingAt(Symbol); -    ArrayRef<uint8_t> SectionBytes(SectionMem.bytes_begin(), SectionMem.size()); +    StringRef SymbolMem = Checker.getSymbolContent(Symbol); +    ArrayRef<uint8_t> SymbolBytes(SymbolMem.bytes_begin(), SymbolMem.size());      MCDisassembler::DecodeStatus S = -        Dis->getInstruction(Inst, Size, SectionBytes, 0, nulls(), nulls()); +        Dis->getInstruction(Inst, Size, SymbolBytes, 0, nulls(), nulls());      return (S == MCDisassembler::Success);    }  };  } -RuntimeDyldCheckerImpl::RuntimeDyldCheckerImpl(RuntimeDyld &RTDyld, -                                               MCDisassembler *Disassembler, -                                               MCInstPrinter *InstPrinter, -                                               raw_ostream &ErrStream) -    : RTDyld(RTDyld), Disassembler(Disassembler), InstPrinter(InstPrinter), -      ErrStream(ErrStream) { -  RTDyld.Checker = this; -} +RuntimeDyldCheckerImpl::RuntimeDyldCheckerImpl( +                      IsSymbolValidFunction IsSymbolValid, +                      GetSymbolAddressFunction GetSymbolAddress, +                      GetSymbolContentFunction GetSymbolContent, +                      GetSectionLoadAddressFunction GetSectionLoadAddress, +                      GetSectionContentFunction GetSectionContent, +                      GetStubOffsetInSectionFunction GetStubOffsetInSection, +                      support::endianness Endianness, +                      MCDisassembler *Disassembler, +                      MCInstPrinter *InstPrinter, +                      raw_ostream &ErrStream) +    : IsSymbolValid(std::move(IsSymbolValid)), +      GetSymbolAddress(std::move(GetSymbolAddress)), +      GetSymbolContent(std::move(GetSymbolContent)), +      GetSectionLoadAddress(std::move(GetSectionLoadAddress)), +      GetSectionContent(std::move(GetSectionContent)), +      GetStubOffsetInSection(std::move(GetStubOffsetInSection)), +      Endianness(Endianness), Disassembler(Disassembler), +      InstPrinter(InstPrinter), ErrStream(ErrStream) {}  bool RuntimeDyldCheckerImpl::check(StringRef CheckExpr) const {    CheckExpr = CheckExpr.trim(); @@ -728,243 +738,133 @@ bool RuntimeDyldCheckerImpl::checkAllRulesInBuffer(StringRef RulePrefix,    return DidAllTestsPass && (NumRules != 0);  } -Expected<JITSymbolResolver::LookupResult> RuntimeDyldCheckerImpl::lookup( -    const JITSymbolResolver::LookupSet &Symbols) const { - -#ifdef _MSC_VER -  using ExpectedLookupResult = MSVCPExpected<JITSymbolResolver::LookupResult>; -#else -  using ExpectedLookupResult = Expected<JITSymbolResolver::LookupResult>; -#endif - -  auto ResultP = std::make_shared<std::promise<ExpectedLookupResult>>(); -  auto ResultF = ResultP->get_future(); - -  getRTDyld().Resolver.lookup( -      Symbols, [=](Expected<JITSymbolResolver::LookupResult> Result) { -        ResultP->set_value(std::move(Result)); -      }); -  return ResultF.get(); -} -  bool RuntimeDyldCheckerImpl::isSymbolValid(StringRef Symbol) const { -  if (getRTDyld().getSymbol(Symbol)) -    return true; -  auto Result = lookup({Symbol}); - -  if (!Result) { -    logAllUnhandledErrors(Result.takeError(), errs(), "RTDyldChecker: "); -    return false; -  } - -  assert(Result->count(Symbol) && "Missing symbol result"); -  return true; +  return IsSymbolValid(Symbol);  }  uint64_t RuntimeDyldCheckerImpl::getSymbolLocalAddr(StringRef Symbol) const { -  return static_cast<uint64_t>( -      reinterpret_cast<uintptr_t>(getRTDyld().getSymbolLocalAddress(Symbol))); +  auto Contents = GetSymbolContent(Symbol); +  if (!Contents) { +    logAllUnhandledErrors(Contents.takeError(), errs(), "RTDyldChecker: "); +    return 0; +  } +  return static_cast<uint64_t>(reinterpret_cast<uintptr_t>(Contents->data()));  }  uint64_t RuntimeDyldCheckerImpl::getSymbolRemoteAddr(StringRef Symbol) const { -  if (auto InternalSymbol = getRTDyld().getSymbol(Symbol)) -    return InternalSymbol.getAddress(); - -  auto Result = lookup({Symbol}); -  if (!Result) { -    logAllUnhandledErrors(Result.takeError(), errs(), "RTDyldChecker: "); +  auto Addr = GetSymbolAddress(Symbol); +  if (!Addr) { +    logAllUnhandledErrors(Addr.takeError(), errs(), "RTDyldChecker: ");      return 0;    } -  auto I = Result->find(Symbol); -  assert(I != Result->end() && "Missing symbol result"); -  return I->second.getAddress(); + +  return *Addr;  }  uint64_t RuntimeDyldCheckerImpl::readMemoryAtAddr(uint64_t SrcAddr,                                                    unsigned Size) const {    uintptr_t PtrSizedAddr = static_cast<uintptr_t>(SrcAddr);    assert(PtrSizedAddr == SrcAddr && "Linker memory pointer out-of-range."); -  uint8_t *Src = reinterpret_cast<uint8_t*>(PtrSizedAddr); -  return getRTDyld().readBytesUnaligned(Src, Size); +  void *Ptr = reinterpret_cast<void*>(PtrSizedAddr); + +  switch (Size) { +  case 1: +    return support::endian::read<uint8_t>(Ptr, Endianness); +  case 2: +    return support::endian::read<uint16_t>(Ptr, Endianness); +  case 4: +    return support::endian::read<uint32_t>(Ptr, Endianness); +  case 8: +    return support::endian::read<uint64_t>(Ptr, Endianness); +  } +  llvm_unreachable("Unsupported read size");  } - -std::pair<const RuntimeDyldCheckerImpl::SectionAddressInfo*, std::string> -RuntimeDyldCheckerImpl::findSectionAddrInfo(StringRef FileName, -                                            StringRef SectionName) const { - -  auto SectionMapItr = Stubs.find(FileName); -  if (SectionMapItr == Stubs.end()) { -    std::string ErrorMsg = "File '"; -    ErrorMsg += FileName; -    ErrorMsg += "' not found. "; -    if (Stubs.empty()) -      ErrorMsg += "No stubs registered."; -    else { -      ErrorMsg += "Available files are:"; -      for (const auto& StubEntry : Stubs) { -        ErrorMsg += " '"; -        ErrorMsg += StubEntry.first; -        ErrorMsg += "'"; -      } -    } -    ErrorMsg += "\n"; -    return std::make_pair(nullptr, ErrorMsg); +StringRef RuntimeDyldCheckerImpl::getSymbolContent(StringRef Symbol) const { +  auto Content = GetSymbolContent(Symbol); +  if (!Content) { +    logAllUnhandledErrors(Content.takeError(), errs(), "RTDyldChecker: "); +    return StringRef();    } - -  auto SectionInfoItr = SectionMapItr->second.find(SectionName); -  if (SectionInfoItr == SectionMapItr->second.end()) -    return std::make_pair(nullptr, -                          ("Section '" + SectionName + "' not found in file '" + -                           FileName + "'\n").str()); - -  return std::make_pair(&SectionInfoItr->second, std::string("")); +  return *Content;  }  std::pair<uint64_t, std::string> RuntimeDyldCheckerImpl::getSectionAddr(      StringRef FileName, StringRef SectionName, bool IsInsideLoad) const { -  const SectionAddressInfo *SectionInfo = nullptr; -  { -    std::string ErrorMsg; -    std::tie(SectionInfo, ErrorMsg) = -      findSectionAddrInfo(FileName, SectionName); -    if (ErrorMsg != "") -      return std::make_pair(0, ErrorMsg); +  uint64_t Addr = 0; +  std::string ErrMsg; + +  // If this address is being looked up in "load" mode, return the content +  // pointer. +  if (IsInsideLoad) { +    if (auto Content = GetSectionContent(FileName, SectionName)) +      Addr = pointerToJITTargetAddress(Content->data()); +    else { +      raw_string_ostream ErrMsgStream(ErrMsg); +      logAllUnhandledErrors(Content.takeError(), ErrMsgStream, +                            "RTDyldChecker: "); +    } +    return std::make_pair(Addr, std::move(ErrMsg));    } -  unsigned SectionID = SectionInfo->SectionID; -  uint64_t Addr; -  if (IsInsideLoad) -    Addr = static_cast<uint64_t>(reinterpret_cast<uintptr_t>( -        getRTDyld().Sections[SectionID].getAddress())); +  // ... otherwise return the target pointer. +  if (auto LoadAddr = GetSectionLoadAddress(FileName, SectionName)) +    Addr = *LoadAddr;    else -    Addr = getRTDyld().Sections[SectionID].getLoadAddress(); +    return std::make_pair(Addr, ("Section (" + FileName + ", " + +                                 SectionName + ") does not exist").str()); -  return std::make_pair(Addr, std::string("")); +  return std::make_pair(Addr, std::move(ErrMsg));  }  std::pair<uint64_t, std::string> RuntimeDyldCheckerImpl::getStubAddrFor(      StringRef FileName, StringRef SectionName, StringRef SymbolName,      bool IsInsideLoad) const { -  const SectionAddressInfo *SectionInfo = nullptr; -  { -    std::string ErrorMsg; -    std::tie(SectionInfo, ErrorMsg) = -      findSectionAddrInfo(FileName, SectionName); -    if (ErrorMsg != "") -      return std::make_pair(0, ErrorMsg); -  } - -  unsigned SectionID = SectionInfo->SectionID; -  const StubOffsetsMap &SymbolStubs = SectionInfo->StubOffsets; -  auto StubOffsetItr = SymbolStubs.find(SymbolName); -  if (StubOffsetItr == SymbolStubs.end()) -    return std::make_pair(0, -                          ("Stub for symbol '" + SymbolName + "' not found. " -                           "If '" + SymbolName + "' is an internal symbol this " -                           "may indicate that the stub target offset is being " -                           "computed incorrectly.\n").str()); - -  uint64_t StubOffset = StubOffsetItr->second; - -  uint64_t Addr; -  if (IsInsideLoad) { -    uintptr_t SectionBase = reinterpret_cast<uintptr_t>( -        getRTDyld().Sections[SectionID].getAddress()); -    Addr = static_cast<uint64_t>(SectionBase) + StubOffset; -  } else { -    uint64_t SectionBase = getRTDyld().Sections[SectionID].getLoadAddress(); -    Addr = SectionBase + StubOffset; -  } - -  return std::make_pair(Addr, std::string("")); -} - -StringRef -RuntimeDyldCheckerImpl::getSubsectionStartingAt(StringRef Name) const { -  RTDyldSymbolTable::const_iterator pos = -      getRTDyld().GlobalSymbolTable.find(Name); -  if (pos == getRTDyld().GlobalSymbolTable.end()) -    return StringRef(); -  const auto &SymInfo = pos->second; -  uint8_t *SectionAddr = getRTDyld().getSectionAddress(SymInfo.getSectionID()); -  return StringRef(reinterpret_cast<const char *>(SectionAddr) + -                       SymInfo.getOffset(), -                   getRTDyld().Sections[SymInfo.getSectionID()].getSize() - -                       SymInfo.getOffset()); -} - -Optional<uint64_t> -RuntimeDyldCheckerImpl::getSectionLoadAddress(void *LocalAddress) const { -  for (auto &S : getRTDyld().Sections) { -    if (S.getAddress() == LocalAddress) -      return S.getLoadAddress(); -  } -  return Optional<uint64_t>(); -} - -void RuntimeDyldCheckerImpl::registerSection( -    StringRef FilePath, unsigned SectionID) { -  StringRef FileName = sys::path::filename(FilePath); -  const SectionEntry &Section = getRTDyld().Sections[SectionID]; -  StringRef SectionName = Section.getName(); - -  Stubs[FileName][SectionName].SectionID = SectionID; -} +  auto SectionAddr = getSectionAddr(FileName, SectionName, IsInsideLoad); -void RuntimeDyldCheckerImpl::registerStubMap( -    StringRef FilePath, unsigned SectionID, -    const RuntimeDyldImpl::StubMap &RTDyldStubs) { -  StringRef FileName = sys::path::filename(FilePath); -  const SectionEntry &Section = getRTDyld().Sections[SectionID]; -  StringRef SectionName = Section.getName(); +  if (!SectionAddr.second.empty()) +    return SectionAddr; -  Stubs[FileName][SectionName].SectionID = SectionID; +  auto StubOffset = GetStubOffsetInSection(FileName, SectionName, SymbolName); -  for (auto &StubMapEntry : RTDyldStubs) { -    std::string SymbolName = ""; - -    if (StubMapEntry.first.SymbolName) -      SymbolName = StubMapEntry.first.SymbolName; -    else { -      // If this is a (Section, Offset) pair, do a reverse lookup in the -      // global symbol table to find the name. -      for (auto &GSTEntry : getRTDyld().GlobalSymbolTable) { -        const auto &SymInfo = GSTEntry.second; -        if (SymInfo.getSectionID() == StubMapEntry.first.SectionID && -            SymInfo.getOffset() == -              static_cast<uint64_t>(StubMapEntry.first.Offset)) { -          SymbolName = GSTEntry.first(); -          break; -        } -      } +  if (!StubOffset) { +    std::string ErrMsg; +    { +      raw_string_ostream ErrMsgStream(ErrMsg); +      logAllUnhandledErrors(StubOffset.takeError(), ErrMsgStream, +                            "RTDyldChecker: ");      } - -    if (SymbolName != "") -      Stubs[FileName][SectionName].StubOffsets[SymbolName] = -        StubMapEntry.second; +    return std::make_pair((uint64_t)0, std::move(ErrMsg));    } + +  return std::make_pair(SectionAddr.first + *StubOffset, "");  } -RuntimeDyldChecker::RuntimeDyldChecker(RuntimeDyld &RTDyld, -                                       MCDisassembler *Disassembler, -                                       MCInstPrinter *InstPrinter, -                                       raw_ostream &ErrStream) -    : Impl(make_unique<RuntimeDyldCheckerImpl>(RTDyld, Disassembler, -                                               InstPrinter, ErrStream)) {} +RuntimeDyldChecker::RuntimeDyldChecker( +                      IsSymbolValidFunction IsSymbolValid, +                      GetSymbolAddressFunction GetSymbolAddress, +                      GetSymbolContentFunction GetSymbolContent, +                      GetSectionLoadAddressFunction GetSectionLoadAddress, +                      GetSectionContentFunction GetSectionContent, +                      GetStubOffsetInSectionFunction GetStubOffsetInSection, +                      support::endianness Endianness, +                      MCDisassembler *Disassembler, +                      MCInstPrinter *InstPrinter, +                      raw_ostream &ErrStream) +    : Impl(make_unique<RuntimeDyldCheckerImpl>( +                                            std::move(IsSymbolValid), +                                            std::move(GetSymbolAddress), +                                            std::move(GetSymbolContent), +                                            std::move(GetSectionLoadAddress), +                                            std::move(GetSectionContent), +                                            std::move(GetStubOffsetInSection), +                                            Endianness, Disassembler, +                                            InstPrinter, ErrStream)) {}  RuntimeDyldChecker::~RuntimeDyldChecker() {} -RuntimeDyld& RuntimeDyldChecker::getRTDyld() { -  return Impl->RTDyld; -} - -const RuntimeDyld& RuntimeDyldChecker::getRTDyld() const { -  return Impl->RTDyld; -} -  bool RuntimeDyldChecker::check(StringRef CheckExpr) const {    return Impl->check(CheckExpr);  } @@ -979,8 +879,3 @@ RuntimeDyldChecker::getSectionAddr(StringRef FileName, StringRef SectionName,                                     bool LocalAddress) {    return Impl->getSectionAddr(FileName, SectionName, LocalAddress);  } - -Optional<uint64_t> -RuntimeDyldChecker::getSectionLoadAddress(void *LocalAddress) const { -  return Impl->getSectionLoadAddress(LocalAddress); -} diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h index 988fac28719..0debd29cfd3 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h @@ -15,14 +15,35 @@ namespace llvm {  class RuntimeDyldCheckerImpl {    friend class RuntimeDyldChecker; -  friend class RuntimeDyldImpl;    friend class RuntimeDyldCheckerExprEval; -  friend class RuntimeDyldELF; + +  using IsSymbolValidFunction = +    RuntimeDyldChecker::IsSymbolValidFunction; +  using GetSymbolAddressFunction = +    RuntimeDyldChecker::GetSymbolAddressFunction; +  using GetSymbolContentFunction = +    RuntimeDyldChecker::GetSymbolContentFunction; + +  using GetSectionLoadAddressFunction = +    RuntimeDyldChecker::GetSectionLoadAddressFunction; +  using GetSectionContentFunction = +    RuntimeDyldChecker::GetSectionContentFunction; + +  using GetStubOffsetInSectionFunction = +    RuntimeDyldChecker::GetStubOffsetInSectionFunction;  public: -  RuntimeDyldCheckerImpl(RuntimeDyld &RTDyld, MCDisassembler *Disassembler, -                         MCInstPrinter *InstPrinter, -                         llvm::raw_ostream &ErrStream); +  RuntimeDyldCheckerImpl( +                      IsSymbolValidFunction IsSymbolValid, +                      GetSymbolAddressFunction GetSymbolAddress, +                      GetSymbolContentFunction GetSymbolContent, +                      GetSectionLoadAddressFunction GetSectionLoadAddress, +                      GetSectionContentFunction GetSectionContent, +                      GetStubOffsetInSectionFunction GetStubOffsetInSection, +                      support::endianness Endianness, +                      MCDisassembler *Disassembler, +                      MCInstPrinter *InstPrinter, +                      llvm::raw_ostream &ErrStream);    bool check(StringRef CheckExpr) const;    bool checkAllRulesInBuffer(StringRef RulePrefix, MemoryBuffer *MemBuf) const; @@ -30,15 +51,6 @@ public:  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; @@ -48,9 +60,7 @@ private:    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; +  StringRef getSymbolContent(StringRef Symbol) const;    std::pair<uint64_t, std::string> getSectionAddr(StringRef FileName,                                                    StringRef SectionName, @@ -60,20 +70,19 @@ private:                                                    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; +  IsSymbolValidFunction IsSymbolValid; +  GetSymbolAddressFunction GetSymbolAddress; +  GetSymbolContentFunction GetSymbolContent; +  GetSectionLoadAddressFunction GetSectionLoadAddress; +  GetSectionContentFunction GetSectionContent; +  GetStubOffsetInSectionFunction GetStubOffsetInSection; +  support::endianness Endianness;    MCDisassembler *Disassembler;    MCInstPrinter *InstPrinter;    llvm::raw_ostream &ErrStream; - -  StubMap Stubs;  };  } diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp index f00c6d16b07..60041a45e2b 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp @@ -1856,9 +1856,6 @@ Error RuntimeDyldELF::finalizeLoad(const ObjectFile &Obj,      Sections[GOTSectionID] =          SectionEntry(".got", Addr, TotalSize, TotalSize, 0); -    if (Checker) -      Checker->registerSection(Obj.getFileName(), GOTSectionID); -      // For now, initialize all GOT entries to zero.  We'll fill them in as      // needed when GOT-based relocations are applied.      memset(Addr, 0, TotalSize); diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h index a4f1c55ca39..615a7280a3a 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h @@ -240,7 +240,6 @@ typedef StringMap<SymbolTableEntry> RTDyldSymbolTable;  class RuntimeDyldImpl {    friend class RuntimeDyld::LoadedObjectInfo; -  friend class RuntimeDyldCheckerImpl;  protected:    static const unsigned AbsoluteSymbolSection = ~0U; @@ -250,9 +249,6 @@ protected:    // The symbol resolver to use for external symbols.    JITSymbolResolver &Resolver; -  // Attached RuntimeDyldChecker instance. Null if no instance attached. -  RuntimeDyldCheckerImpl *Checker; -    // A list of all sections emitted by the dynamic linker.  These sections are    // referenced in the code by means of their index in this list - SectionID.    typedef SmallVector<SectionEntry, 64> SectionList; @@ -312,20 +308,16 @@ protected:    // the end of the list while the list is being processed.    sys::Mutex lock; +  using NotifyStubEmittedFunction = +    RuntimeDyld::NotifyStubEmittedFunction; +  NotifyStubEmittedFunction NotifyStubEmitted; +    virtual unsigned getMaxStubSize() = 0;    virtual unsigned getStubAlignment() = 0;    bool HasError;    std::string ErrorStr; -  uint64_t getSectionLoadAddress(unsigned SectionID) const { -    return Sections[SectionID].getLoadAddress(); -  } - -  uint8_t *getSectionAddress(unsigned SectionID) const { -    return Sections[SectionID].getAddress(); -  } -    void writeInt16BE(uint8_t *Addr, uint16_t Value) {      if (IsTargetLittleEndian)        sys::swapByteOrder(Value); @@ -471,7 +463,7 @@ protected:  public:    RuntimeDyldImpl(RuntimeDyld::MemoryManager &MemMgr,                    JITSymbolResolver &Resolver) -    : MemMgr(MemMgr), Resolver(Resolver), Checker(nullptr), +    : MemMgr(MemMgr), Resolver(Resolver),        ProcessAllSections(false), HasError(false) {    } @@ -481,13 +473,22 @@ public:      this->ProcessAllSections = ProcessAllSections;    } -  void setRuntimeDyldChecker(RuntimeDyldCheckerImpl *Checker) { -    this->Checker = Checker; -  } -    virtual std::unique_ptr<RuntimeDyld::LoadedObjectInfo>    loadObject(const object::ObjectFile &Obj) = 0; +  uint64_t getSectionLoadAddress(unsigned SectionID) const { +    return Sections[SectionID].getLoadAddress(); +  } + +  uint8_t *getSectionAddress(unsigned SectionID) const { +    return Sections[SectionID].getAddress(); +  } + +  StringRef getSectionContent(unsigned SectionID) const { +    return StringRef(reinterpret_cast<char*>(Sections[SectionID].getAddress()), +                     Sections[SectionID].getSize()); +  } +    uint8_t* getSymbolLocalAddress(StringRef Name) const {      // FIXME: Just look up as a function for now. Overly simple of course.      // Work in progress. @@ -501,6 +502,13 @@ public:      return getSectionAddress(SymInfo.getSectionID()) + SymInfo.getOffset();    } +  unsigned getSymbolSectionID(StringRef Name) const { +    auto GSTItr = GlobalSymbolTable.find(Name); +    if (GSTItr == GlobalSymbolTable.end()) +      return ~0U; +    return GSTItr->second.getSectionID(); +  } +    JITEvaluatedSymbol getSymbol(StringRef Name) const {      // FIXME: Just look up as a function for now. Overly simple of course.      // Work in progress. @@ -559,6 +567,10 @@ public:    virtual bool isCompatibleFile(const ObjectFile &Obj) const = 0; +  void setNotifyStubEmitted(NotifyStubEmittedFunction NotifyStubEmitted) { +    this->NotifyStubEmitted = std::move(NotifyStubEmitted); +  } +    virtual void registerEHFrames();    void deregisterEHFrames();  | 

