Skip to content

Commit 8064e00

Browse files
committed
Put C-callable functions in to jl_sysimg_fvars.
1 parent 6610867 commit 8064e00

File tree

4 files changed

+21
-10
lines changed

4 files changed

+21
-10
lines changed

src/aotcompile.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,8 +311,13 @@ void *jl_create_native(jl_array_t *methods, const jl_cgparams_t cgparams, int _p
311311
// to compile, or an svec(rettype, sig) describing a C-callable alias to create.
312312
jl_value_t *item = jl_array_ptr_ref(methods, i);
313313
if (jl_is_simplevector(item)) {
314-
if (worlds == 1)
315-
jl_compile_extern_c(clone.get(), &params, NULL, jl_svecref(item, 0), jl_svecref(item, 1));
314+
if (worlds == 1) {
315+
Function *F = (Function *)jl_compile_extern_c(clone.get(), &params,
316+
NULL, jl_svecref(item, 0),
317+
jl_svecref(item, 1));
318+
assert(F);
319+
data->jl_sysimg_fvars.push_back(F);
320+
}
316321
continue;
317322
}
318323
mi = (jl_method_instance_t*)item;

src/codegen.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5369,7 +5369,8 @@ static jl_cgval_t emit_cfunction(jl_codectx_t &ctx, jl_value_t *output_type, con
53695369

53705370
// do codegen to create a C-callable alias/wrapper, or if sysimg_handle is set,
53715371
// restore one from a loaded system image.
5372-
void jl_generate_ccallable(void *llvmmod, void *sysimg_handle, jl_value_t *declrt, jl_value_t *sigt, jl_codegen_params_t &params)
5372+
Function *jl_generate_ccallable(void *llvmmod, void *sysimg_handle, jl_value_t *declrt,
5373+
jl_value_t *sigt, jl_codegen_params_t &params)
53735374
{
53745375
jl_datatype_t *ft = (jl_datatype_t*)jl_tparam0(sigt);
53755376
jl_value_t *ff = ft->instance;
@@ -5393,6 +5394,7 @@ void jl_generate_ccallable(void *llvmmod, void *sysimg_handle, jl_value_t *declr
53935394
}
53945395
jl_value_t *err;
53955396
{ // scope block for sig
5397+
Function *F = NULL;
53965398
function_sig_t sig("cfunction", lcrt, crt, toboxed,
53975399
argtypes, NULL, false, CallingConv::C, false, &params);
53985400
if (sig.err_msg.empty()) {
@@ -5408,10 +5410,11 @@ void jl_generate_ccallable(void *llvmmod, void *sysimg_handle, jl_value_t *declr
54085410
}
54095411
else {
54105412
jl_method_instance_t *lam = jl_get_specialization1((jl_tupletype_t*)sigt, world, &min_valid, &max_valid, 0);
5411-
gen_cfun_wrapper((Module*)llvmmod, params, sig, ff, name, declrt, lam, NULL, NULL, NULL);
5413+
F = gen_cfun_wrapper((Module *)llvmmod, params, sig, ff, name, declrt, lam,
5414+
NULL, NULL, NULL);
54125415
}
54135416
JL_GC_POP();
5414-
return;
5417+
return F;
54155418
}
54165419
err = jl_get_exceptionf(jl_errorexception_type, "%s", sig.err_msg.c_str());
54175420
}

src/jitlayers.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,11 +203,12 @@ static jl_callptr_t _jl_compile_codeinst(
203203
return fptr;
204204
}
205205

206-
void jl_generate_ccallable(void *llvmmod, void *sysimg_handle, jl_value_t *declrt, jl_value_t *sigt, jl_codegen_params_t &params);
206+
Function *jl_generate_ccallable(void *llvmmod, void *sysimg_handle, jl_value_t *declrt,
207+
jl_value_t *sigt, jl_codegen_params_t &params);
207208

208209
// compile a C-callable alias
209-
extern "C" JL_DLLEXPORT
210-
void jl_compile_extern_c(void *llvmmod, void *p, void *sysimg, jl_value_t *declrt, jl_value_t *sigt)
210+
extern "C" JL_DLLEXPORT void *jl_compile_extern_c(void *llvmmod, void *p, void *sysimg,
211+
jl_value_t *declrt, jl_value_t *sigt)
211212
{
212213
JL_LOCK(&codegen_lock);
213214
jl_codegen_params_t params;
@@ -217,7 +218,7 @@ void jl_compile_extern_c(void *llvmmod, void *p, void *sysimg, jl_value_t *declr
217218
Module *into = (Module*)llvmmod;
218219
if (into == NULL)
219220
into = jl_create_llvm_module("cextern");
220-
jl_generate_ccallable(into, sysimg, declrt, sigt, *pparams);
221+
Function *F = jl_generate_ccallable(into, sysimg, declrt, sigt, *pparams);
221222
if (!sysimg) {
222223
if (p == NULL) {
223224
jl_jit_globals(params.globals);
@@ -229,6 +230,7 @@ void jl_compile_extern_c(void *llvmmod, void *p, void *sysimg, jl_value_t *declr
229230
jl_add_to_ee(std::unique_ptr<Module>(into));
230231
}
231232
JL_UNLOCK(&codegen_lock);
233+
return F;
232234
}
233235

234236
bool jl_type_mappable_to_c(jl_value_t *ty);

src/julia_internal.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,8 @@ jl_binding_t *jl_get_module_binding(jl_module_t *m JL_PROPAGATES_ROOT, jl_sym_t
513513
void jl_binding_deprecation_warning(jl_module_t *m, jl_binding_t *b);
514514
extern jl_array_t *jl_module_init_order JL_GLOBALLY_ROOTED;
515515
extern htable_t jl_current_modules JL_GLOBALLY_ROOTED;
516-
JL_DLLEXPORT void jl_compile_extern_c(void *llvmmod, void *params, void *sysimg, jl_value_t *declrt, jl_value_t *sigt);
516+
JL_DLLEXPORT void *jl_compile_extern_c(void *llvmmod, void *params, void *sysimg,
517+
jl_value_t *declrt, jl_value_t *sigt);
517518

518519
// Each tuple can exist in one of 4 Vararg states:
519520
// NONE: no vararg Tuple{Int,Float32}

0 commit comments

Comments
 (0)