diff --git a/llvm/include/llvm/ExecutionEngine/Orc/LazyReexports.h b/llvm/include/llvm/ExecutionEngine/Orc/LazyReexports.h --- a/llvm/include/llvm/ExecutionEngine/Orc/LazyReexports.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/LazyReexports.h @@ -51,15 +51,28 @@ JITTargetAddress ErrorHandlerAddr, std::unique_ptr TP); - JITTargetAddress callThroughToSymbol(JITTargetAddress TrampolineAddr); + struct ReexportsEntry { + JITDylib *SourceJD; + SymbolStringPtr SymbolName; + }; + + Expected findReexport(JITTargetAddress TrampolineAddr); + Expected resolveSymbol(const ReexportsEntry &RE); + + Error notifyResolved(JITTargetAddress TrampolineAddr, + JITTargetAddress ResolvedAddr); + + JITTargetAddress reportCallThroughError(Error Err) { + ES.reportError(std::move(Err)); + return ErrorHandlerAddr; + } void setTrampolinePool(std::unique_ptr TP) { this->TP = std::move(TP); } private: - using ReexportsMap = - std::map>; + using ReexportsMap = std::map; using NotifiersMap = std::map; @@ -91,6 +104,21 @@ return Error::success(); } + JITTargetAddress callThroughToSymbol(JITTargetAddress TrampolineAddr) { + auto Entry = findReexport(TrampolineAddr); + if (!Entry) + return reportCallThroughError(Entry.takeError()); + + auto ResolvedAddr = resolveSymbol(std::move(*Entry)); + if (!ResolvedAddr) + return reportCallThroughError(ResolvedAddr.takeError()); + + if (Error Err = notifyResolved(TrampolineAddr, *ResolvedAddr)) + return reportCallThroughError(std::move(Err)); + + return *ResolvedAddr; + } + public: /// Create a LocalLazyCallThroughManager using the given ABI. See /// createLocalLazyCallThroughManager. diff --git a/llvm/lib/ExecutionEngine/Orc/LazyReexports.cpp b/llvm/lib/ExecutionEngine/Orc/LazyReexports.cpp --- a/llvm/lib/ExecutionEngine/Orc/LazyReexports.cpp +++ b/llvm/lib/ExecutionEngine/Orc/LazyReexports.cpp @@ -30,36 +30,39 @@ if (!Trampoline) return Trampoline.takeError(); - Reexports[*Trampoline] = std::make_pair(&SourceJD, std::move(SymbolName)); + Reexports[*Trampoline] = ReexportsEntry{&SourceJD, std::move(SymbolName)}; Notifiers[*Trampoline] = std::move(NotifyResolved); return *Trampoline; } -JITTargetAddress -LazyCallThroughManager::callThroughToSymbol(JITTargetAddress TrampolineAddr) { - JITDylib *SourceJD = nullptr; - SymbolStringPtr SymbolName; +Expected +LazyCallThroughManager::findReexport(JITTargetAddress TrampolineAddr) { + std::lock_guard Lock(LCTMMutex); + auto I = Reexports.find(TrampolineAddr); + if (I == Reexports.end()) + return createStringError(inconvertibleErrorCode(), + "Missing reexport for trampoline address %p", + TrampolineAddr); + + assert(Notifiers.find(TrampolineAddr) != Notifiers.end()); + return I->second; +} - { - std::lock_guard Lock(LCTMMutex); - auto I = Reexports.find(TrampolineAddr); - if (I == Reexports.end()) - return ErrorHandlerAddr; - SourceJD = I->second.first; - SymbolName = I->second.second; - } +Expected +LazyCallThroughManager::resolveSymbol(const ReexportsEntry &RE) { + auto LookupResult = + ES.lookup(makeJITDylibSearchOrder(RE.SourceJD, + JITDylibLookupFlags::MatchAllSymbols), + RE.SymbolName, SymbolState::Ready); - auto LookupResult = ES.lookup( - makeJITDylibSearchOrder(SourceJD, JITDylibLookupFlags::MatchAllSymbols), - SymbolName, SymbolState::Ready); + if (!LookupResult) + return LookupResult.takeError(); - if (!LookupResult) { - ES.reportError(LookupResult.takeError()); - return ErrorHandlerAddr; - } - - auto ResolvedAddr = LookupResult->getAddress(); + return LookupResult->getAddress(); +} +Error LazyCallThroughManager::notifyResolved(JITTargetAddress TrampolineAddr, + JITTargetAddress ResolvedAddr) { NotifyResolvedFunction NotifyResolved; { std::lock_guard Lock(LCTMMutex); @@ -70,14 +73,7 @@ } } - if (NotifyResolved) { - if (auto Err = NotifyResolved(ResolvedAddr)) { - ES.reportError(std::move(Err)); - return ErrorHandlerAddr; - } - } - - return ResolvedAddr; + return NotifyResolved ? NotifyResolved(ResolvedAddr) : Error::success(); } Expected>