[llvm-branch-commits] [llvm] release/19.x: [ORC] Remove EDU from dependants list of dependencies before destroying. (PR #109355)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Sep 19 17:53:10 PDT 2024
https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/109355
Backport 7034ec491251e598d2867199f89fefa3eb16a1a0
Requested by: @lhames
>From ac0aff430e7e15c1102b1e0e255194b26778fde2 Mon Sep 17 00:00:00 2001
From: Lang Hames <lhames at gmail.com>
Date: Tue, 10 Sep 2024 13:47:17 +1000
Subject: [PATCH] [ORC] Remove EDU from dependants list of dependencies before
destroying.
Dependant lists hold raw pointers back to EDUs that depend on them. We need to
remove these entries before destroying the EDU or we'll be left with a dangling
reference that can result in use-after-free bugs.
No testcase: This has only been observed in multi-threaded setups that
reproduce the issue inconsistently.
rdar://135403614
(cherry picked from commit 7034ec491251e598d2867199f89fefa3eb16a1a0)
---
llvm/lib/ExecutionEngine/Orc/Core.cpp | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp
index 3e6de62c8b7dd9..f70c2890521d3d 100644
--- a/llvm/lib/ExecutionEngine/Orc/Core.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp
@@ -3592,6 +3592,21 @@ ExecutionSession::IL_failSymbols(JITDylib &JD,
assert(MI.DefiningEDU->Symbols.count(NonOwningSymbolStringPtr(Name)) &&
"Symbol does not appear in its DefiningEDU");
MI.DefiningEDU->Symbols.erase(NonOwningSymbolStringPtr(Name));
+
+ // Remove this EDU from the dependants lists of its dependencies.
+ for (auto &[DepJD, DepSyms] : MI.DefiningEDU->Dependencies) {
+ for (auto DepSym : DepSyms) {
+ assert(DepJD->Symbols.count(SymbolStringPtr(DepSym)) &&
+ "DepSym not in DepJD");
+ assert(DepJD->MaterializingInfos.count(SymbolStringPtr(DepSym)) &&
+ "DepSym has not MaterializingInfo");
+ auto &SymMI = DepJD->MaterializingInfos[SymbolStringPtr(DepSym)];
+ assert(SymMI.DependantEDUs.count(MI.DefiningEDU.get()) &&
+ "DefiningEDU missing from DependantEDUs list of dependency");
+ SymMI.DependantEDUs.erase(MI.DefiningEDU.get());
+ }
+ }
+
MI.DefiningEDU = nullptr;
} else {
// Otherwise if there are any EDUs waiting on this symbol then move
More information about the llvm-branch-commits
mailing list