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,@function +main: # @main + pushq %rbp + movq %rsp, %rbp + movl $0, -4(%rbp) + movl $0, %eax + popq %rbp + retq _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
