Skip to content

Commit bf1cfe7

Browse files
committed
Fix illegal attribute propagation in LLVM JIT.
Commit 7255943 started copying more attributes from AttributeTemplate to the functions we generate on the fly. In the case of deform functions, which return void, this meant that "noundef", from AttributeTemplate's return value (a Datum) was copied to a void type. Older LLVM releases were OK with that, but LLVM 18 crashes. Update our llvm_copy_attributes() function to skip copying the attribute for the return value, if the target function returns void. Thanks to Dmitry Dolgov for help chasing this down. Back-patch to all supported releases, like 7255943. Reported-by: Pavel Stehule <pavel.stehule@gmail.com> Reviewed-by: Dmitry Dolgov <9erthalion6@gmail.com> Discussion: https://postgr.es/m/CAFj8pRACpVFr7LMdVYENUkScG5FCYMZDDdSGNU-tch%2Bw98OxYg%40mail.gmail.com
1 parent db4a028 commit bf1cfe7

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

src/backend/jit/llvm/llvmjit.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -565,8 +565,11 @@ llvm_copy_attributes(LLVMValueRef v_from, LLVMValueRef v_to)
565565
/* copy function attributes */
566566
llvm_copy_attributes_at_index(v_from, v_to, LLVMAttributeFunctionIndex);
567567

568-
/* and the return value attributes */
569-
llvm_copy_attributes_at_index(v_from, v_to, LLVMAttributeReturnIndex);
568+
if (LLVMGetTypeKind(LLVMGetFunctionReturnType(v_to)) != LLVMVoidTypeKind)
569+
{
570+
/* and the return value attributes */
571+
llvm_copy_attributes_at_index(v_from, v_to, LLVMAttributeReturnIndex);
572+
}
570573

571574
/* and each function parameter's attribute */
572575
param_count = LLVMCountParams(v_from);

0 commit comments

Comments
 (0)