diff options
author | Lang Hames <lhames@gmail.com> | 2024-11-28 15:25:20 +1100 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2024-11-28 15:29:16 +1100 |
commit | f710b042336d93fd1080124d3ec889702b77a730 (patch) | |
tree | 8cb751042228cf4d06da654b4f60896eef90aefc /llvm/lib | |
parent | 2918a47f421b3d41eb54dbd8751c6e8df2adbe23 (diff) | |
download | llvm-f710b042336d93fd1080124d3ec889702b77a730.zip llvm-f710b042336d93fd1080124d3ec889702b77a730.tar.gz llvm-f710b042336d93fd1080124d3ec889702b77a730.tar.bz2 |
[ORC] Fail early in ExecutionSession::registerJITDispatchHandlers.
Check that we're not reusing any handler tag addresses before installing any
handlers. This ensures that either all of the handlers are installed*, or none
of them are, simplifying error recovery.
* Ignoring handlers whose tags couldn't be resolved at all: these were never
installed.
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/Core.cpp | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp index 7804199..43c8cda 100644 --- a/llvm/lib/ExecutionEngine/Orc/Core.cpp +++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp @@ -1878,31 +1878,39 @@ ExecutionSession::lookup(ArrayRef<JITDylib *> SearchOrder, StringRef Name, Error ExecutionSession::registerJITDispatchHandlers( JITDylib &JD, JITDispatchHandlerAssociationMap WFs) { - auto TagAddrs = lookup({{&JD, JITDylibLookupFlags::MatchAllSymbols}}, - SymbolLookupSet::fromMapKeys( - WFs, SymbolLookupFlags::WeaklyReferencedSymbol)); - if (!TagAddrs) - return TagAddrs.takeError(); + auto TagSyms = lookup({{&JD, JITDylibLookupFlags::MatchAllSymbols}}, + SymbolLookupSet::fromMapKeys( + WFs, SymbolLookupFlags::WeaklyReferencedSymbol)); + if (!TagSyms) + return TagSyms.takeError(); // Associate tag addresses with implementations. std::lock_guard<std::mutex> Lock(JITDispatchHandlersMutex); - for (auto &KV : *TagAddrs) { - auto TagAddr = KV.second.getAddress(); + + // Check that no tags are being overwritten. + for (auto &[TagName, TagSym] : *TagSyms) { + auto TagAddr = TagSym.getAddress(); if (JITDispatchHandlers.count(TagAddr)) - return make_error<StringError>("Tag " + formatv("{0:x16}", TagAddr) + - " (for " + *KV.first + + return make_error<StringError>("Tag " + formatv("{0:x}", TagAddr) + + " (for " + *TagName + ") already registered", inconvertibleErrorCode()); - auto I = WFs.find(KV.first); + } + + // At this point we're guaranteed to succeed. Install the handlers. + for (auto &[TagName, TagSym] : *TagSyms) { + auto TagAddr = TagSym.getAddress(); + auto I = WFs.find(TagName); assert(I != WFs.end() && I->second && "JITDispatchHandler implementation missing"); - JITDispatchHandlers[KV.second.getAddress()] = + JITDispatchHandlers[TagAddr] = std::make_shared<JITDispatchHandlerFunction>(std::move(I->second)); LLVM_DEBUG({ - dbgs() << "Associated function tag \"" << *KV.first << "\" (" - << formatv("{0:x}", KV.second.getAddress()) << ") with handler\n"; + dbgs() << "Associated function tag \"" << *TagName << "\" (" + << formatv("{0:x}", TagAddr) << ") with handler\n"; }); } + return Error::success(); } |