Skip to content

Commit

Permalink
codegen: use correct rettype ABI for aotcompile (#57082)
Browse files Browse the repository at this point in the history
This only really can differ in aotcompile, so it was hard to notice that
that the attempted code simplification in db25494 wasn't correct and
could lead to ABI mismatches at runtime.

Fixes #57018
  • Loading branch information
vtjnash authored Jan 21, 2025
1 parent ff5f66c commit 7a1a6f3
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 11 deletions.
2 changes: 1 addition & 1 deletion src/aotcompile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2223,7 +2223,7 @@ void jl_get_llvmf_defn_impl(jl_llvmf_dump_t* dump, jl_method_instance_t *mi, jl_
output.imaging_mode = jl_options.image_codegen;
output.temporary_roots = jl_alloc_array_1d(jl_array_any_type, 0);
JL_GC_PUSH1(&output.temporary_roots);
auto decls = jl_emit_code(m, mi, src, NULL, output);
auto decls = jl_emit_code(m, mi, src, mi->specTypes, src->rettype, output);
output.temporary_roots = nullptr;
JL_GC_POP(); // GC the global_targets array contents now since reflection doesn't need it

Expand Down
17 changes: 8 additions & 9 deletions src/codegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4381,7 +4381,7 @@ static jl_llvm_functions_t
jl_method_instance_t *lam,
jl_code_info_t *src,
jl_value_t *abi,
jl_value_t *rettype,
jl_value_t *jlrettype,
jl_codegen_params_t &params);

static void emit_hasnofield_error_ifnot(jl_codectx_t &ctx, Value *ok, jl_datatype_t *type, jl_cgval_t name);
Expand Down Expand Up @@ -5533,12 +5533,12 @@ static jl_value_t *get_ci_abi(jl_code_instance_t *ci)
return jl_get_ci_mi(ci)->specTypes;
}

static jl_cgval_t emit_call_specfun_other(jl_codectx_t &ctx, jl_code_instance_t *ci, jl_value_t *jlretty, StringRef specFunctionObject, jl_code_instance_t *fromexternal,
static jl_cgval_t emit_call_specfun_other(jl_codectx_t &ctx, jl_code_instance_t *ci, StringRef specFunctionObject, jl_code_instance_t *fromexternal,
ArrayRef<jl_cgval_t> argv, size_t nargs, jl_returninfo_t::CallingConv *cc, unsigned *return_roots, jl_value_t *inferred_retty, Value *age_ok)
{
jl_method_instance_t *mi = jl_get_ci_mi(ci);
bool is_opaque_closure = jl_is_method(mi->def.value) && mi->def.method->is_for_opaque_closure;
return emit_call_specfun_other(ctx, is_opaque_closure, get_ci_abi(ci), jlretty, NULL,
return emit_call_specfun_other(ctx, is_opaque_closure, get_ci_abi(ci), ci->rettype, NULL,
specFunctionObject, fromexternal, argv, nargs, cc, return_roots, inferred_retty, age_ok);
}

Expand Down Expand Up @@ -5688,7 +5688,7 @@ static jl_cgval_t emit_invoke(jl_codectx_t &ctx, const jl_cgval_t &lival, ArrayR
jl_returninfo_t::CallingConv cc = jl_returninfo_t::CallingConv::Boxed;
unsigned return_roots = 0;
if (specsig)
result = emit_call_specfun_other(ctx, codeinst, codeinst->rettype, protoname, external ? codeinst : nullptr, argv, nargs, &cc, &return_roots, rt, age_ok);
result = emit_call_specfun_other(ctx, codeinst, protoname, external ? codeinst : nullptr, argv, nargs, &cc, &return_roots, rt, age_ok);
else
result = emit_call_specfun_boxed(ctx, codeinst->rettype, protoname, external ? codeinst : nullptr, argv, nargs, rt, age_ok);
if (need_to_emit) {
Expand Down Expand Up @@ -10029,7 +10029,8 @@ jl_llvm_functions_t jl_emit_code(
orc::ThreadSafeModule &m,
jl_method_instance_t *li,
jl_code_info_t *src,
jl_value_t *abi,
jl_value_t *abi_at,
jl_value_t *abi_rt,
jl_codegen_params_t &params)
{
JL_TIMING(CODEGEN, CODEGEN_LLVM);
Expand All @@ -10038,10 +10039,8 @@ jl_llvm_functions_t jl_emit_code(
assert((params.params == &jl_default_cgparams /* fast path */ || !params.cache ||
compare_cgparams(params.params, &jl_default_cgparams)) &&
"functions compiled with custom codegen params must not be cached");
if (!abi)
abi = li->specTypes;
JL_TRY {
decls = emit_function(m, li, src, abi, src->rettype, params);
decls = emit_function(m, li, src, abi_at, abi_rt, params);
auto stream = *jl_ExecutionEngine->get_dump_emitted_mi_name_stream();
if (stream) {
jl_printf(stream, "%s\t", decls.specFunctionObject.c_str());
Expand Down Expand Up @@ -10112,7 +10111,7 @@ jl_llvm_functions_t jl_emit_codeinst(
return jl_llvm_functions_t(); // user error
}
//assert(jl_egal((jl_value_t*)jl_atomic_load_relaxed(&codeinst->debuginfo), (jl_value_t*)src->debuginfo) && "trying to generate code for a codeinst for an incompatible src");
jl_llvm_functions_t decls = jl_emit_code(m, jl_get_ci_mi(codeinst), src, get_ci_abi(codeinst), params);
jl_llvm_functions_t decls = jl_emit_code(m, jl_get_ci_mi(codeinst), src, get_ci_abi(codeinst), codeinst->rettype, params);
return decls;
}

Expand Down
3 changes: 2 additions & 1 deletion src/jitlayers.h
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,8 @@ jl_llvm_functions_t jl_emit_code(
orc::ThreadSafeModule &M,
jl_method_instance_t *mi,
jl_code_info_t *src,
jl_value_t *abi,
jl_value_t *abi_at,
jl_value_t *abi_rt,
jl_codegen_params_t &params);

jl_llvm_functions_t jl_emit_codeinst(
Expand Down

0 comments on commit 7a1a6f3

Please sign in to comment.