Skip to content

Commit d3109b8

Browse files
JeffBezansonsimeonschaub
authored andcommitted
fix JuliaLang#36391, ensure anything precompiled ends up in output (JuliaLang#36451)
1 parent 8db759c commit d3109b8

File tree

5 files changed

+16
-6
lines changed

5 files changed

+16
-6
lines changed

src/dump.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,8 @@ static void jl_serialize_value_(jl_serializer_state *s, jl_value_t *v, int as_li
662662
int flags = validate << 0;
663663
if (codeinst->invoke == jl_fptr_const_return)
664664
flags |= 1 << 2;
665+
if (codeinst->precompile)
666+
flags |= 1 << 3;
665667
write_uint8(s->s, flags);
666668
jl_serialize_value(s, (jl_value_t*)codeinst->def);
667669
if (validate || codeinst->min_world == 0) {
@@ -1494,6 +1496,8 @@ static jl_value_t *jl_deserialize_value_code_instance(jl_serializer_state *s, jl
14941496
jl_gc_wb(codeinst, codeinst->rettype);
14951497
if (constret)
14961498
codeinst->invoke = jl_fptr_const_return;
1499+
if ((flags >> 3) & 1)
1500+
codeinst->precompile = 1;
14971501
codeinst->next = (jl_code_instance_t*)jl_deserialize_value(s, (jl_value_t**)&codeinst->next);
14981502
jl_gc_wb(codeinst, codeinst->next);
14991503
if (validate)

src/gf.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,7 @@ JL_DLLEXPORT jl_code_instance_t *jl_new_codeinst(
397397
}
398398
codeinst->specptr.fptr = NULL;
399399
codeinst->isspecsig = 0;
400+
codeinst->precompile = 0;
400401
codeinst->next = NULL;
401402
JL_GC_POP();
402403
return codeinst;
@@ -2089,6 +2090,7 @@ jl_code_instance_t *jl_compile_method_internal(jl_method_instance_t *mi, size_t
20892090
jl_atomic_store_release(&codeinst->invoke, ucache->invoke);
20902091
jl_mi_cache_insert(mi, codeinst);
20912092
}
2093+
codeinst->precompile = 1;
20922094
return codeinst;
20932095
}
20942096

@@ -2194,9 +2196,11 @@ static void _generate_from_hint(jl_method_instance_t *mi, size_t world)
21942196
// don't bother generating output in the current environment
21952197
if (generating_llvm) {
21962198
jl_value_t *codeinst = jl_rettype_inferred(mi, world, world);
2197-
if (codeinst != jl_nothing)
2199+
if (codeinst != jl_nothing) {
21982200
if (((jl_code_instance_t*)codeinst)->invoke == jl_fptr_const_return)
21992201
return; // probably not a good idea to generate code
2202+
((jl_code_instance_t*)codeinst)->precompile = 1;
2203+
}
22002204
// If we are saving LLVM or native code, generate the LLVM IR so that it'll
22012205
// be included in the saved LLVM module.
22022206
// TODO: compilation is now stateless

src/jltypes.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2356,7 +2356,7 @@ void jl_init_types(void) JL_GC_DISABLED
23562356
jl_code_instance_type =
23572357
jl_new_datatype(jl_symbol("CodeInstance"), core,
23582358
jl_any_type, jl_emptysvec,
2359-
jl_perm_symsvec(10,
2359+
jl_perm_symsvec(11,
23602360
"def",
23612361
"next",
23622362
"min_world",
@@ -2366,8 +2366,8 @@ void jl_init_types(void) JL_GC_DISABLED
23662366
"inferred",
23672367
//"edges",
23682368
//"absolute_max",
2369-
"isspecsig", "invoke", "specptr"), // function object decls
2370-
jl_svec(10,
2369+
"isspecsig", "precompile", "invoke", "specptr"), // function object decls
2370+
jl_svec(11,
23712371
jl_method_instance_type,
23722372
jl_any_type,
23732373
jl_ulong_type,
@@ -2378,6 +2378,7 @@ void jl_init_types(void) JL_GC_DISABLED
23782378
//jl_any_type,
23792379
//jl_bool_type,
23802380
jl_bool_type,
2381+
jl_bool_type,
23812382
jl_any_type, jl_any_type), // fptrs
23822383
0, 1, 1);
23832384
jl_svecset(jl_code_instance_type->types, 1, jl_code_instance_type);
@@ -2498,8 +2499,8 @@ void jl_init_types(void) JL_GC_DISABLED
24982499
jl_svecset(jl_methtable_type->types, 11, jl_uint8_type);
24992500
jl_svecset(jl_method_type->types, 13, jl_method_instance_type);
25002501
jl_svecset(jl_method_instance_type->types, 5, jl_code_instance_type);
2501-
jl_svecset(jl_code_instance_type->types, 8, jl_voidpointer_type);
25022502
jl_svecset(jl_code_instance_type->types, 9, jl_voidpointer_type);
2503+
jl_svecset(jl_code_instance_type->types, 10, jl_voidpointer_type);
25032504

25042505
jl_compute_field_offsets(jl_datatype_type);
25052506
jl_compute_field_offsets(jl_typename_type);

src/julia.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,7 @@ typedef struct _jl_code_instance_t {
355355

356356
// compilation state cache
357357
uint8_t isspecsig; // if specptr is a specialized function signature for specTypes->rettype
358+
uint8_t precompile; // if set, this will be added to the output system image
358359
jl_callptr_t invoke; // jlcall entry point
359360
jl_generic_specptr_t specptr; // private data for `jlcall entry point`
360361
} jl_code_instance_t;

src/precompile.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ static int precompile_enq_specialization_(jl_method_instance_t *mi, void *closur
326326
!jl_ir_flag_inlineable((jl_array_t*)codeinst->inferred)) {
327327
do_compile = 1;
328328
}
329-
else if (codeinst->invoke != NULL) {
329+
else if (codeinst->invoke != NULL || codeinst->precompile) {
330330
do_compile = 1;
331331
}
332332
}

0 commit comments

Comments
 (0)