Skip to content

Commit debca00

Browse files
aviatesktopolarity
authored andcommitted
staticdata: remove reinit_ccallable
This commit removes `jl_reinit_ccallable` whose purpose is unclear. Specifically, the function re-adds C-callable functions to the execution engine during the loading of sysimages/pkgimages, but the consensus is that the function is largely unnecessary because `ccall` can find symbols via `dlsym`. The function's only apparent use case is a contrived `llvmcall` example, only because we currently don't add the sysimage symbols to the JIT, but we could do anyway. `llvmcall` has always been experimental, and if it is truly needed, the functionality for finding the symbols should be properly implemented later.
1 parent 44f35d9 commit debca00

File tree

10 files changed

+56
-263
lines changed

10 files changed

+56
-263
lines changed

src/aotcompile.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -800,7 +800,7 @@ void *jl_emit_native_impl(jl_array_t *codeinfos, LLVMOrcThreadSafeModuleRef llvm
800800
else {
801801
jl_value_t *sig = jl_array_ptr_ref(codeinfos, ++i);
802802
assert(jl_is_type(item) && jl_is_type(sig));
803-
jl_compile_extern_c(wrap(&clone), &params, NULL, item, sig);
803+
jl_generate_ccallable(clone.getModuleUnlocked(), nullptr, item, sig, params);
804804
}
805805
}
806806
// finally, make sure all referenced methods get fixed up, particularly if the user declined to compile them

src/codegen-stubs.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ JL_DLLEXPORT void jl_get_llvm_gvs_fallback(void *native_code, arraylist_t *gvs)
1717
JL_DLLEXPORT void jl_get_llvm_external_fns_fallback(void *native_code, arraylist_t *gvs) UNAVAILABLE
1818
JL_DLLEXPORT void jl_get_llvm_mis_fallback(void *native_code, arraylist_t* MIs) UNAVAILABLE
1919

20-
JL_DLLEXPORT void jl_extern_c_fallback(jl_function_t *f, jl_value_t *rt, jl_value_t *argt, char *name) UNAVAILABLE
2120
JL_DLLEXPORT jl_value_t *jl_dump_method_asm_fallback(jl_method_instance_t *linfo, size_t world,
2221
char emit_mc, char getwrapper, const char* asm_variant, const char *debuginfo, char binary) UNAVAILABLE
2322
JL_DLLEXPORT jl_value_t *jl_dump_function_ir_fallback(jl_llvmf_dump_t *dump, char strip_ir_metadata, char dump_module, const char *debuginfo) UNAVAILABLE

src/gf.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4643,6 +4643,44 @@ JL_DLLEXPORT void jl_typeinf_timing_end(uint64_t start, int is_recompile)
46434643
}
46444644
}
46454645

4646+
// declare a C-callable entry point; called during code loading from the toplevel
4647+
JL_DLLEXPORT void jl_extern_c(jl_value_t *declrt, jl_tupletype_t *sigt)
4648+
{
4649+
// validate arguments. try to do as many checks as possible here to avoid
4650+
// throwing errors later during codegen.
4651+
JL_TYPECHK(@ccallable, type, declrt);
4652+
if (!jl_is_tuple_type(sigt))
4653+
jl_type_error("@ccallable", (jl_value_t*)jl_anytuple_type_type, (jl_value_t*)sigt);
4654+
// check that f is a guaranteed singleton type
4655+
jl_datatype_t *ft = (jl_datatype_t*)jl_tparam0(sigt);
4656+
if (!jl_is_datatype(ft) || !jl_is_datatype_singleton(ft))
4657+
jl_error("@ccallable: function object must be a singleton");
4658+
4659+
// compute / validate return type
4660+
if (!jl_is_concrete_type(declrt) || jl_is_kind(declrt))
4661+
jl_error("@ccallable: return type must be concrete and correspond to a C type");
4662+
if (!jl_type_mappable_to_c(declrt))
4663+
jl_error("@ccallable: return type doesn't correspond to a C type");
4664+
4665+
// validate method signature
4666+
size_t i, nargs = jl_nparams(sigt);
4667+
for (i = 1; i < nargs; i++) {
4668+
jl_value_t *ati = jl_tparam(sigt, i);
4669+
if (!jl_is_concrete_type(ati) || jl_is_kind(ati) || !jl_type_mappable_to_c(ati))
4670+
jl_error("@ccallable: argument types must be concrete");
4671+
}
4672+
4673+
// save a record of this so that the alias is generated when we write an object file
4674+
jl_method_t *meth = (jl_method_t*)jl_methtable_lookup(ft->name->mt, (jl_value_t*)sigt, jl_atomic_load_acquire(&jl_world_counter));
4675+
if (!jl_is_method(meth))
4676+
jl_error("@ccallable: could not find requested method");
4677+
JL_GC_PUSH1(&meth);
4678+
meth->ccallable = jl_svec2(declrt, (jl_value_t*)sigt);
4679+
jl_gc_wb(meth, meth->ccallable);
4680+
JL_GC_POP();
4681+
}
4682+
4683+
46464684
#ifdef __cplusplus
46474685
}
46484686
#endif

src/jitlayers.cpp

Lines changed: 0 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -804,141 +804,6 @@ void jl_emit_codeinst_to_jit_impl(
804804
emittedmodules[codeinst] = std::move(result_m);
805805
}
806806

807-
808-
const char *jl_generate_ccallable(Module *llvmmod, void *sysimg_handle, jl_value_t *declrt, jl_value_t *sigt, jl_codegen_params_t &params);
809-
810-
// compile a C-callable alias
811-
extern "C" JL_DLLEXPORT_CODEGEN
812-
int jl_compile_extern_c_impl(LLVMOrcThreadSafeModuleRef llvmmod, void *p, void *sysimg, jl_value_t *declrt, jl_value_t *sigt)
813-
{
814-
auto ct = jl_current_task;
815-
bool timed = (ct->reentrant_timing & 1) == 0;
816-
if (timed)
817-
ct->reentrant_timing |= 1;
818-
uint64_t compiler_start_time = 0;
819-
uint8_t measure_compile_time_enabled = jl_atomic_load_relaxed(&jl_measure_compile_time_enabled);
820-
if (measure_compile_time_enabled)
821-
compiler_start_time = jl_hrtime();
822-
jl_codegen_params_t *pparams = (jl_codegen_params_t*)p;
823-
DataLayout DL = pparams ? pparams->DL : jl_ExecutionEngine->getDataLayout();
824-
Triple TargetTriple = pparams ? pparams->TargetTriple : jl_ExecutionEngine->getTargetTriple();
825-
orc::ThreadSafeContext ctx;
826-
auto into = unwrap(llvmmod);
827-
orc::ThreadSafeModule backing;
828-
bool success = true;
829-
const char *name = "";
830-
if (into == NULL) {
831-
ctx = pparams ? pparams->tsctx : jl_ExecutionEngine->makeContext();
832-
backing = jl_create_ts_module("cextern", ctx, DL, TargetTriple);
833-
into = &backing;
834-
}
835-
{ // params scope
836-
jl_codegen_params_t params(into->getContext(), DL, TargetTriple);
837-
if (pparams == NULL) {
838-
params.cache = p == NULL;
839-
params.imaging_mode = 0;
840-
params.tsctx.getContext()->setDiscardValueNames(true);
841-
pparams = &params;
842-
}
843-
Module &M = *into->getModuleUnlocked();
844-
assert(pparams->tsctx.getContext() == &M.getContext());
845-
name = jl_generate_ccallable(&M, sysimg, declrt, sigt, *pparams);
846-
if (!sysimg && !p) {
847-
{ // drop lock to keep analyzer happy (since it doesn't know we have the only reference to it)
848-
auto release = std::move(params.tsctx_lock);
849-
}
850-
{ // lock scope
851-
jl_unique_gcsafe_lock lock(extern_c_lock);
852-
if (jl_ExecutionEngine->getGlobalValueAddress(name))
853-
success = false;
854-
}
855-
params.tsctx_lock = params.tsctx.getLock(); // re-acquire lock
856-
if (success && params.cache) {
857-
size_t newest_world = jl_atomic_load_acquire(&jl_world_counter);
858-
for (auto &it : params.workqueue) { // really just zero or one, and just the ABI not the rest of the metadata
859-
jl_code_instance_t *codeinst = it.first;
860-
JL_GC_PROMISE_ROOTED(codeinst);
861-
jl_code_instance_t *newest_ci = jl_type_infer(jl_get_ci_mi(codeinst), newest_world, SOURCE_MODE_ABI);
862-
if (newest_ci) {
863-
if (jl_egal(codeinst->rettype, newest_ci->rettype))
864-
it.first = codeinst;
865-
jl_compile_codeinst_now(newest_ci);
866-
}
867-
}
868-
jl_analyze_workqueue(nullptr, params, true);
869-
assert(params.workqueue.empty());
870-
finish_params(&M, params, sharedmodules);
871-
}
872-
}
873-
pparams = nullptr;
874-
}
875-
if (!sysimg && success && llvmmod == NULL) {
876-
{ // lock scope
877-
jl_unique_gcsafe_lock lock(extern_c_lock);
878-
if (!jl_ExecutionEngine->getGlobalValueAddress(name)) {
879-
{
880-
auto Lock = backing.getContext().getLock();
881-
jl_ExecutionEngine->optimizeDLSyms(*backing.getModuleUnlocked()); // safepoint
882-
}
883-
jl_ExecutionEngine->addModule(std::move(backing));
884-
success = jl_ExecutionEngine->getGlobalValueAddress(name);
885-
assert(success);
886-
}
887-
}
888-
}
889-
if (timed) {
890-
if (measure_compile_time_enabled) {
891-
auto end = jl_hrtime();
892-
jl_atomic_fetch_add_relaxed(&jl_cumulative_compile_time, end - compiler_start_time);
893-
}
894-
ct->reentrant_timing &= ~1ull;
895-
}
896-
return success;
897-
}
898-
899-
// declare a C-callable entry point; called during code loading from the toplevel
900-
extern "C" JL_DLLEXPORT_CODEGEN
901-
void jl_extern_c_impl(jl_value_t *declrt, jl_tupletype_t *sigt)
902-
{
903-
// validate arguments. try to do as many checks as possible here to avoid
904-
// throwing errors later during codegen.
905-
JL_TYPECHK(@ccallable, type, declrt);
906-
if (!jl_is_tuple_type(sigt))
907-
jl_type_error("@ccallable", (jl_value_t*)jl_anytuple_type_type, (jl_value_t*)sigt);
908-
// check that f is a guaranteed singleton type
909-
jl_datatype_t *ft = (jl_datatype_t*)jl_tparam0(sigt);
910-
if (!jl_is_datatype(ft) || !jl_is_datatype_singleton(ft))
911-
jl_error("@ccallable: function object must be a singleton");
912-
913-
// compute / validate return type
914-
if (!jl_is_concrete_type(declrt) || jl_is_kind(declrt))
915-
jl_error("@ccallable: return type must be concrete and correspond to a C type");
916-
if (!jl_type_mappable_to_c(declrt))
917-
jl_error("@ccallable: return type doesn't correspond to a C type");
918-
919-
// validate method signature
920-
size_t i, nargs = jl_nparams(sigt);
921-
for (i = 1; i < nargs; i++) {
922-
jl_value_t *ati = jl_tparam(sigt, i);
923-
if (!jl_is_concrete_type(ati) || jl_is_kind(ati) || !jl_type_mappable_to_c(ati))
924-
jl_error("@ccallable: argument types must be concrete");
925-
}
926-
927-
// save a record of this so that the alias is generated when we write an object file
928-
jl_method_t *meth = (jl_method_t*)jl_methtable_lookup(ft->name->mt, (jl_value_t*)sigt, jl_atomic_load_acquire(&jl_world_counter));
929-
if (!jl_is_method(meth))
930-
jl_error("@ccallable: could not find requested method");
931-
JL_GC_PUSH1(&meth);
932-
meth->ccallable = jl_svec2(declrt, (jl_value_t*)sigt);
933-
jl_gc_wb(meth, meth->ccallable);
934-
JL_GC_POP();
935-
936-
// create the alias in the current runtime environment
937-
int success = jl_compile_extern_c(NULL, NULL, NULL, declrt, (jl_value_t*)sigt);
938-
if (!success)
939-
jl_error("@ccallable was already defined for this method name");
940-
}
941-
942807
extern "C" JL_DLLEXPORT_CODEGEN
943808
int jl_compile_codeinst_impl(jl_code_instance_t *ci)
944809
{

src/jitlayers.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,8 @@ struct jl_codegen_params_t {
284284
~jl_codegen_params_t() JL_NOTSAFEPOINT JL_NOTSAFEPOINT_LEAVE = default;
285285
};
286286

287+
const char *jl_generate_ccallable(Module *llvmmod, void *sysimg_handle, jl_value_t *declrt, jl_value_t *sigt, jl_codegen_params_t &params);
288+
287289
jl_llvm_functions_t jl_emit_code(
288290
orc::ThreadSafeModule &M,
289291
jl_method_instance_t *mi,

src/jl_exported_funcs.inc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,6 @@
511511
YY(jl_dump_function_ir) \
512512
YY(jl_dump_method_asm) \
513513
YY(jl_emit_codeinst_to_jit) \
514-
YY(jl_extern_c) \
515514
YY(jl_get_llvmf_defn) \
516515
YY(jl_get_llvm_function) \
517516
YY(jl_get_llvm_module) \
@@ -528,7 +527,6 @@
528527
YY(jl_register_fptrs) \
529528
YY(jl_generate_fptr_for_unspecialized) \
530529
YY(jl_compile_codeinst) \
531-
YY(jl_compile_extern_c) \
532530
YY(jl_teardown_codegen) \
533531
YY(jl_jit_total_bytes) \
534532
YY(jl_create_native) \

src/julia_internal.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2027,7 +2027,6 @@ JL_DLLEXPORT uint32_t jl_crc32c(uint32_t crc, const char *buf, size_t len);
20272027

20282028
JL_DLLIMPORT void jl_generate_fptr_for_unspecialized(jl_code_instance_t *unspec);
20292029
JL_DLLIMPORT int jl_compile_codeinst(jl_code_instance_t *unspec);
2030-
JL_DLLIMPORT int jl_compile_extern_c(LLVMOrcThreadSafeModuleRef llvmmod, void *params, void *sysimg, jl_value_t *declrt, jl_value_t *sigt);
20312030
JL_DLLIMPORT void jl_emit_codeinst_to_jit(jl_code_instance_t *codeinst, jl_code_info_t *src);
20322031

20332032
typedef struct {

src/staticdata.c

Lines changed: 3 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,6 @@
4444
4545
- step 3 combines the different sections (fields of `jl_serializer_state`) into one
4646
47-
- step 4 writes the values of the hard-coded tagged items and `ccallable_list`
48-
4947
Much of the "real work" during deserialization is done by `get_item_for_reloc`. But a few items require specific
5048
attention:
5149
- uniquing: during deserialization, the target item (an "external" type or MethodInstance) must be checked against
@@ -556,7 +554,6 @@ typedef struct {
556554
arraylist_t uniquing_objs; // a list of locations that reference non-types that must be de-duplicated
557555
arraylist_t fixup_types; // a list of locations of types requiring (re)caching
558556
arraylist_t fixup_objs; // a list of locations of objects requiring (re)caching
559-
arraylist_t ccallable_list; // @ccallable entry points to install
560557
// mapping from a buildid_idx to a depmods_idx
561558
jl_array_t *buildid_depmods_idxs;
562559
// record of build_ids for all external linkages, in order of serialization for the current sysimg/pkgimg
@@ -1875,8 +1872,6 @@ static void jl_write_values(jl_serializer_state *s) JL_GC_DISABLED
18751872
else {
18761873
newm->nroots_sysimg = m->roots ? jl_array_len(m->roots) : 0;
18771874
}
1878-
if (m->ccallable)
1879-
arraylist_push(&s->ccallable_list, (void*)reloc_offset);
18801875
}
18811876
else if (jl_is_method_instance(v)) {
18821877
assert(f == s->s);
@@ -2557,29 +2552,6 @@ static void jl_root_new_gvars(jl_serializer_state *s, jl_image_t *image, uint32_
25572552
}
25582553
}
25592554

2560-
2561-
static void jl_compile_extern(jl_method_t *m, void *sysimg_handle) JL_GC_DISABLED
2562-
{
2563-
// install ccallable entry point in JIT
2564-
assert(m); // makes clang-sa happy
2565-
jl_svec_t *sv = m->ccallable;
2566-
int success = jl_compile_extern_c(NULL, NULL, sysimg_handle, jl_svecref(sv, 0), jl_svecref(sv, 1));
2567-
if (!success)
2568-
jl_safe_printf("WARNING: @ccallable was already defined for this method name\n"); // enjoy a very bad time
2569-
assert(success || !sysimg_handle);
2570-
}
2571-
2572-
2573-
static void jl_reinit_ccallable(arraylist_t *ccallable_list, char *base, void *sysimg_handle)
2574-
{
2575-
for (size_t i = 0; i < ccallable_list->len; i++) {
2576-
uintptr_t item = (uintptr_t)ccallable_list->items[i];
2577-
jl_method_t *m = (jl_method_t*)(base + item);
2578-
jl_compile_extern(m, sysimg_handle);
2579-
}
2580-
}
2581-
2582-
25832555
// Code below helps slim down the images by
25842556
// removing cached types not referenced in the stream
25852557
static jl_svec_t *jl_prune_type_cache_hash(jl_svec_t *cache) JL_GC_DISABLED
@@ -3106,7 +3078,6 @@ static void jl_save_system_image_to_stream(ios_t *f, jl_array_t *mod_array,
31063078
arraylist_new(&s.uniquing_objs, 0);
31073079
arraylist_new(&s.fixup_types, 0);
31083080
arraylist_new(&s.fixup_objs, 0);
3109-
arraylist_new(&s.ccallable_list, 0);
31103081
s.buildid_depmods_idxs = image_to_depmodidx(mod_array);
31113082
s.link_ids_relocs = jl_alloc_array_1d(jl_array_int32_type, 0);
31123083
s.link_ids_gctags = jl_alloc_array_1d(jl_array_int32_type, 0);
@@ -3363,7 +3334,6 @@ static void jl_save_system_image_to_stream(ios_t *f, jl_array_t *mod_array,
33633334
write_uint32(f, jl_array_len(s.link_ids_external_fnvars));
33643335
ios_write(f, (char*)jl_array_data(s.link_ids_external_fnvars, uint32_t), jl_array_len(s.link_ids_external_fnvars) * sizeof(uint32_t));
33653336
write_uint32(f, external_fns_begin);
3366-
jl_write_arraylist(s.s, &s.ccallable_list);
33673337
}
33683338

33693339
assert(object_worklist.len == 0);
@@ -3375,7 +3345,6 @@ static void jl_save_system_image_to_stream(ios_t *f, jl_array_t *mod_array,
33753345
arraylist_free(&s.uniquing_objs);
33763346
arraylist_free(&s.fixup_types);
33773347
arraylist_free(&s.fixup_objs);
3378-
arraylist_free(&s.ccallable_list);
33793348
arraylist_free(&s.memowner_list);
33803349
arraylist_free(&s.memref_list);
33813350
arraylist_free(&s.relocs_list);
@@ -3677,7 +3646,7 @@ static void jl_restore_system_image_from_stream_(ios_t *f, jl_image_t *image, jl
36773646
jl_array_t **extext_methods, jl_array_t **internal_methods,
36783647
jl_array_t **new_ext_cis, jl_array_t **method_roots_list,
36793648
jl_array_t **edges,
3680-
char **base, arraylist_t *ccallable_list, pkgcachesizes *cachesizes) JL_GC_DISABLED
3649+
pkgcachesizes *cachesizes) JL_GC_DISABLED
36813650
{
36823651
jl_task_t *ct = jl_current_task;
36833652
int en = jl_gc_enable(0);
@@ -3804,7 +3773,6 @@ static void jl_restore_system_image_from_stream_(ios_t *f, jl_image_t *image, jl
38043773
ios_read(f, (char*)jl_array_data(s.link_ids_external_fnvars, uint32_t), nlinks_external_fnvars * sizeof(uint32_t));
38053774
}
38063775
uint32_t external_fns_begin = read_uint32(f);
3807-
jl_read_arraylist(s.s, ccallable_list ? ccallable_list : &s.ccallable_list);
38083776
if (s.incremental) {
38093777
assert(restored && init_order && extext_methods && internal_methods && new_ext_cis && method_roots_list && edges);
38103778
*restored = (jl_array_t*)jl_delayed_reloc(&s, offset_restored);
@@ -3824,8 +3792,6 @@ static void jl_restore_system_image_from_stream_(ios_t *f, jl_image_t *image, jl
38243792

38253793
char *image_base = (char*)&sysimg.buf[0];
38263794
reloc_t *relocs_base = (reloc_t*)&relocs.buf[0];
3827-
if (base)
3828-
*base = image_base;
38293795

38303796
s.s = &sysimg;
38313797
jl_read_reloclist(&s, s.link_ids_gctags, GC_OLD | GC_IN_IMAGE); // gctags
@@ -4185,11 +4151,6 @@ static void jl_restore_system_image_from_stream_(ios_t *f, jl_image_t *image, jl
41854151

41864152
s.s = &sysimg;
41874153
jl_update_all_fptrs(&s, image); // fptr relocs and registration
4188-
if (!ccallable_list) {
4189-
// TODO: jl_sysimg_handle or img_handle?
4190-
jl_reinit_ccallable(&s.ccallable_list, image_base, jl_sysimg_handle);
4191-
arraylist_free(&s.ccallable_list);
4192-
}
41934154
s.s = NULL;
41944155

41954156
ios_close(&fptr_record);
@@ -4267,8 +4228,6 @@ static jl_value_t *jl_restore_package_image_from_stream(void* pkgimage_handle, i
42674228

42684229
assert(datastartpos > 0 && datastartpos < dataendpos);
42694230
needs_permalloc = jl_options.permalloc_pkgimg || needs_permalloc;
4270-
char *base;
4271-
arraylist_t ccallable_list;
42724231

42734232
jl_value_t *restored = NULL;
42744233
jl_array_t *init_order = NULL, *extext_methods = NULL, *internal_methods = NULL, *new_ext_cis = NULL, *method_roots_list = NULL, *edges = NULL;
@@ -4298,7 +4257,7 @@ static jl_value_t *jl_restore_package_image_from_stream(void* pkgimage_handle, i
42984257
ios_static_buffer(f, sysimg, len);
42994258
pkgcachesizes cachesizes;
43004259
jl_restore_system_image_from_stream_(f, image, depmods, checksum, (jl_array_t**)&restored, &init_order, &extext_methods, &internal_methods, &new_ext_cis, &method_roots_list,
4301-
&edges, &base, &ccallable_list, &cachesizes);
4260+
&edges, &cachesizes);
43024261
JL_SIGATOMIC_END();
43034262

43044263
// Add roots to methods
@@ -4328,10 +4287,6 @@ static jl_value_t *jl_restore_package_image_from_stream(void* pkgimage_handle, i
43284287
// now permit more methods to be added again
43294288
JL_UNLOCK(&world_counter_lock);
43304289

4331-
// reinit ccallables
4332-
jl_reinit_ccallable(&ccallable_list, base, pkgimage_handle);
4333-
arraylist_free(&ccallable_list);
4334-
43354290
jl_value_t *ext_edges = new_ext_cis ? (jl_value_t*)new_ext_cis : jl_nothing;
43364291

43374292
if (completeinfo) {
@@ -4359,7 +4314,7 @@ static jl_value_t *jl_restore_package_image_from_stream(void* pkgimage_handle, i
43594314
static void jl_restore_system_image_from_stream(ios_t *f, jl_image_t *image, uint32_t checksum)
43604315
{
43614316
JL_TIMING(LOAD_IMAGE, LOAD_Sysimg);
4362-
jl_restore_system_image_from_stream_(f, image, NULL, checksum | ((uint64_t)0xfdfcfbfa << 32), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
4317+
jl_restore_system_image_from_stream_(f, image, NULL, checksum | ((uint64_t)0xfdfcfbfa << 32), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
43634318
}
43644319

43654320
JL_DLLEXPORT jl_value_t *jl_restore_incremental_from_buf(void* pkgimage_handle, const char *buf, jl_image_t *image, size_t sz, jl_array_t *depmods, int completeinfo, const char *pkgname, int needs_permalloc)

0 commit comments

Comments
 (0)