Skip to content

Commit 76c59a6

Browse files
[ORC] Decompose LazyCallThroughManager::callThroughToSymbol()
Summary: Decompose callThroughToSymbol() into findReexport(), resolveSymbol(), notifyResolved() and reportCallThroughError(). This allows derived classes to reuse the functionality while adding their own code in between. Reviewers: lhames Reviewed By: lhames Subscribers: hiraditya, steven_wu, dexonsmith, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D75084
1 parent c627b12 commit 76c59a6

File tree

2 files changed

+55
-33
lines changed

2 files changed

+55
-33
lines changed

llvm/include/llvm/ExecutionEngine/Orc/LazyReexports.h

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,28 @@ class LazyCallThroughManager {
5151
JITTargetAddress ErrorHandlerAddr,
5252
std::unique_ptr<TrampolinePool> TP);
5353

54-
JITTargetAddress callThroughToSymbol(JITTargetAddress TrampolineAddr);
54+
struct ReexportsEntry {
55+
JITDylib *SourceJD;
56+
SymbolStringPtr SymbolName;
57+
};
58+
59+
Expected<ReexportsEntry> findReexport(JITTargetAddress TrampolineAddr);
60+
Expected<JITTargetAddress> resolveSymbol(const ReexportsEntry &RE);
61+
62+
Error notifyResolved(JITTargetAddress TrampolineAddr,
63+
JITTargetAddress ResolvedAddr);
64+
65+
JITTargetAddress reportCallThroughError(Error Err) {
66+
ES.reportError(std::move(Err));
67+
return ErrorHandlerAddr;
68+
}
5569

5670
void setTrampolinePool(std::unique_ptr<TrampolinePool> TP) {
5771
this->TP = std::move(TP);
5872
}
5973

6074
private:
61-
using ReexportsMap =
62-
std::map<JITTargetAddress, std::pair<JITDylib *, SymbolStringPtr>>;
75+
using ReexportsMap = std::map<JITTargetAddress, ReexportsEntry>;
6376

6477
using NotifiersMap = std::map<JITTargetAddress, NotifyResolvedFunction>;
6578

@@ -91,6 +104,21 @@ class LocalLazyCallThroughManager : public LazyCallThroughManager {
91104
return Error::success();
92105
}
93106

107+
JITTargetAddress callThroughToSymbol(JITTargetAddress TrampolineAddr) {
108+
auto Entry = findReexport(TrampolineAddr);
109+
if (!Entry)
110+
return reportCallThroughError(Entry.takeError());
111+
112+
auto ResolvedAddr = resolveSymbol(std::move(*Entry));
113+
if (!ResolvedAddr)
114+
return reportCallThroughError(ResolvedAddr.takeError());
115+
116+
if (Error Err = notifyResolved(TrampolineAddr, *ResolvedAddr))
117+
return reportCallThroughError(std::move(Err));
118+
119+
return *ResolvedAddr;
120+
}
121+
94122
public:
95123
/// Create a LocalLazyCallThroughManager using the given ABI. See
96124
/// createLocalLazyCallThroughManager.

llvm/lib/ExecutionEngine/Orc/LazyReexports.cpp

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -30,36 +30,37 @@ Expected<JITTargetAddress> LazyCallThroughManager::getCallThroughTrampoline(
3030
if (!Trampoline)
3131
return Trampoline.takeError();
3232

33-
Reexports[*Trampoline] = std::make_pair(&SourceJD, std::move(SymbolName));
33+
Reexports[*Trampoline] = ReexportsEntry{&SourceJD, std::move(SymbolName)};
3434
Notifiers[*Trampoline] = std::move(NotifyResolved);
3535
return *Trampoline;
3636
}
3737

38-
JITTargetAddress
39-
LazyCallThroughManager::callThroughToSymbol(JITTargetAddress TrampolineAddr) {
40-
JITDylib *SourceJD = nullptr;
41-
SymbolStringPtr SymbolName;
38+
Expected<LazyCallThroughManager::ReexportsEntry>
39+
LazyCallThroughManager::findReexport(JITTargetAddress TrampolineAddr) {
40+
std::lock_guard<std::mutex> Lock(LCTMMutex);
41+
auto I = Reexports.find(TrampolineAddr);
42+
if (I == Reexports.end())
43+
return createStringError(inconvertibleErrorCode(),
44+
"Missing reexport for trampoline address %p",
45+
TrampolineAddr);
46+
return I->second;
47+
}
4248

43-
{
44-
std::lock_guard<std::mutex> Lock(LCTMMutex);
45-
auto I = Reexports.find(TrampolineAddr);
46-
if (I == Reexports.end())
47-
return ErrorHandlerAddr;
48-
SourceJD = I->second.first;
49-
SymbolName = I->second.second;
50-
}
49+
Expected<JITTargetAddress>
50+
LazyCallThroughManager::resolveSymbol(const ReexportsEntry &RE) {
51+
auto LookupResult =
52+
ES.lookup(makeJITDylibSearchOrder(RE.SourceJD,
53+
JITDylibLookupFlags::MatchAllSymbols),
54+
RE.SymbolName, SymbolState::Ready);
5155

52-
auto LookupResult = ES.lookup(
53-
makeJITDylibSearchOrder(SourceJD, JITDylibLookupFlags::MatchAllSymbols),
54-
SymbolName, SymbolState::Ready);
56+
if (!LookupResult)
57+
return LookupResult.takeError();
5558

56-
if (!LookupResult) {
57-
ES.reportError(LookupResult.takeError());
58-
return ErrorHandlerAddr;
59-
}
60-
61-
auto ResolvedAddr = LookupResult->getAddress();
59+
return LookupResult->getAddress();
60+
}
6261

62+
Error LazyCallThroughManager::notifyResolved(JITTargetAddress TrampolineAddr,
63+
JITTargetAddress ResolvedAddr) {
6364
NotifyResolvedFunction NotifyResolved;
6465
{
6566
std::lock_guard<std::mutex> Lock(LCTMMutex);
@@ -70,14 +71,7 @@ LazyCallThroughManager::callThroughToSymbol(JITTargetAddress TrampolineAddr) {
7071
}
7172
}
7273

73-
if (NotifyResolved) {
74-
if (auto Err = NotifyResolved(ResolvedAddr)) {
75-
ES.reportError(std::move(Err));
76-
return ErrorHandlerAddr;
77-
}
78-
}
79-
80-
return ResolvedAddr;
74+
return NotifyResolved ? NotifyResolved(ResolvedAddr) : Error::success();
8175
}
8276

8377
Expected<std::unique_ptr<LazyCallThroughManager>>

0 commit comments

Comments
 (0)