[llvm-branch-commits] [llvm] 467b3bb - [ELFDebugObjectPlugin] Do not wait for std::future in post-fixup phase in the absent of debug info (#178541)
Cullen Rhodes via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Feb 2 01:05:54 PST 2026
Author: Min-Yih Hsu
Date: 2026-02-02T09:05:47Z
New Revision: 467b3bb6c3dbee2ed866be3e0fa476c4b1deeee3
URL: https://github.com/llvm/llvm-project/commit/467b3bb6c3dbee2ed866be3e0fa476c4b1deeee3
DIFF: https://github.com/llvm/llvm-project/commit/467b3bb6c3dbee2ed866be3e0fa476c4b1deeee3.diff
LOG: [ELFDebugObjectPlugin] Do not wait for std::future in post-fixup phase in the absent of debug info (#178541)
If there is no debug information, we wouldn't call
`DebugObject::collectTargetAlloc` in the post-allocation phase.
Therefore, when it's in the post-fixup phase,
`DebugObject::awaitTargetMem` will fail with _"std::future_error: No
associated state"_ because the std::future was not even populated.
(cherry picked from commit 696ea11b94d119416c9618b5add09d5ac09428aa)
Added:
llvm/test/ExecutionEngine/JITLink/x86-64/ELF_no_debug_info.s
Modified:
llvm/lib/ExecutionEngine/Orc/Debugging/ELFDebugObjectPlugin.cpp
Removed:
################################################################################
diff --git a/llvm/lib/ExecutionEngine/Orc/Debugging/ELFDebugObjectPlugin.cpp b/llvm/lib/ExecutionEngine/Orc/Debugging/ELFDebugObjectPlugin.cpp
index e67eb323c3540..10e9dfdfea79f 100644
--- a/llvm/lib/ExecutionEngine/Orc/Debugging/ELFDebugObjectPlugin.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/Debugging/ELFDebugObjectPlugin.cpp
@@ -75,7 +75,14 @@ class DebugObject {
void trackFinalizedAlloc(FinalizedAlloc FA) { Alloc = std::move(FA); }
- Expected<ExecutorAddrRange> awaitTargetMem() { return FinalizeFuture.get(); }
+ bool hasPendingTargetMem() const { return FinalizeFuture.valid(); }
+
+ Expected<ExecutorAddrRange> awaitTargetMem() {
+ assert(FinalizeFuture.valid() &&
+ "FinalizeFuture is not valid. Perhaps there is no pending target "
+ "memory transaction?");
+ return FinalizeFuture.get();
+ }
void reportTargetMem(ExecutorAddrRange TargetMem) {
FinalizePromise.set_value(TargetMem);
@@ -342,6 +349,12 @@ void ELFDebugObjectPlugin::modifyPassConfig(MaterializationResponsibility &MR,
// register the memory range with the GDB JIT Interface in an allocation
// action of the LinkGraph's own allocation
DebugObject *DebugObj = getPendingDebugObj(MR);
+ assert(DebugObj && "Don't inject passes if we have no debug object");
+ // Post-allocation phases would bail out if there is no debug section,
+ // in which case we wouldn't collect target memory and therefore shouldn't
+ // wait for the transaction to finish.
+ if (!DebugObj->hasPendingTargetMem())
+ return Error::success();
Expected<ExecutorAddrRange> R = DebugObj->awaitTargetMem();
if (!R)
return R.takeError();
diff --git a/llvm/test/ExecutionEngine/JITLink/x86-64/ELF_no_debug_info.s b/llvm/test/ExecutionEngine/JITLink/x86-64/ELF_no_debug_info.s
new file mode 100644
index 0000000000000..141b04078e36b
--- /dev/null
+++ b/llvm/test/ExecutionEngine/JITLink/x86-64/ELF_no_debug_info.s
@@ -0,0 +1,20 @@
+# REQUIRES: native && x86_64-linux
+
+# RUN: rm -rf %t && mkdir %t
+# RUN: llvm-mc -triple=x86_64-unknown-linux \
+# RUN: -filetype=obj -o %t/ELF_x86-64_no_debug_info.o %s
+# RUN: llvm-jitlink %t/ELF_x86-64_no_debug_info.o
+
+# Check if everything works in the absent of any debug information.
+
+ .text
+ .globl main # -- Begin function main
+ .p2align 4
+ .type main, at function
+main: # @main
+ pushq %rbp
+ movq %rsp, %rbp
+ movl $0, -4(%rbp)
+ movl $0, %eax
+ popq %rbp
+ retq
More information about the llvm-branch-commits
mailing list