Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit cd77b83

Browse files
committedJul 27, 2019
Add roots field to CodeInstance
This is designed to eliminate confusion in the serialization by ensuring that offsets are relative to a "private" roots table. This may allow more extensive caching of inference results, because it should eliminate root-indexing conflicts between different instances of the same method.
1 parent 9daaed6 commit cd77b83

File tree

11 files changed

+94
-69
lines changed

11 files changed

+94
-69
lines changed
 

‎base/compiler/ssair/inlining.jl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -702,7 +702,7 @@ function analyze_method!(idx::Int, sig::Signature, @nospecialize(metharg), meths
702702
return spec_lambda(atype_unlimited, sv, invoke_data)
703703
end
704704

705-
isconst, src = find_inferred(mi, atypes, sv, stmttyp)
705+
isconst, src, roots = find_inferred(mi, atypes, sv, stmttyp)
706706
if isconst
707707
add_backedge!(mi, sv)
708708
return ConstantCase(src, method, Any[methsp...], metharg)
@@ -722,7 +722,7 @@ function analyze_method!(idx::Int, sig::Signature, @nospecialize(metharg), meths
722722
add_backedge!(mi, sv)
723723

724724
if !isa(src, CodeInfo)
725-
src = ccall(:jl_uncompress_ast, Any, (Any, Ptr{Cvoid}, Any), method, C_NULL, src::Vector{UInt8})::CodeInfo
725+
src = ccall(:jl_uncompress_ast, Any, (Any, Ptr{Cvoid}, Any, Any), method, C_NULL, src::Vector{UInt8}, roots)::CodeInfo
726726
end
727727

728728
@timeit "inline IR inflation" begin
@@ -1294,10 +1294,10 @@ function find_inferred(mi::MethodInstance, @nospecialize(atypes), sv::Optimizati
12941294
if isa(inf_result, InferenceResult)
12951295
let inferred_src = inf_result.src
12961296
if isa(inferred_src, CodeInfo)
1297-
return svec(false, inferred_src)
1297+
return svec(false, inferred_src, nothing)
12981298
end
12991299
if isa(inferred_src, Const) && is_inlineable_constant(inferred_src.val)
1300-
return svec(true, quoted(inferred_src.val),)
1300+
return svec(true, quoted(inferred_src.val), nothing)
13011301
end
13021302
end
13031303
end
@@ -1306,9 +1306,9 @@ function find_inferred(mi::MethodInstance, @nospecialize(atypes), sv::Optimizati
13061306
if linfo isa CodeInstance
13071307
if invoke_api(linfo) == 2
13081308
# in this case function can be inlined to a constant
1309-
return svec(true, quoted(linfo.rettype_const))
1309+
return svec(true, quoted(linfo.rettype_const), linfo.localroots)
13101310
end
1311-
return svec(false, linfo.inferred)
1311+
return svec(false, linfo.inferred, linfo.localroots)
13121312
end
1313-
return svec(false, nothing)
1313+
return svec(false, nothing, nothing)
13141314
end

‎base/compiler/typeinfer.jl

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ end
8383
# update the MethodInstance and notify the edges
8484
function cache_result(result::InferenceResult, min_valid::UInt, max_valid::UInt)
8585
def = result.linfo.def
86-
toplevel = !isa(result.linfo.def, Method)
86+
toplevel = !isa(def, Method)
8787
if toplevel
8888
min_valid = UInt(0)
8989
max_valid = UInt(0)
@@ -129,12 +129,19 @@ function cache_result(result::InferenceResult, min_valid::UInt, max_valid::UInt)
129129
end
130130
end
131131
end
132-
if !isa(inferred_result, Union{CodeInfo, Vector{UInt8}})
133-
inferred_result = nothing
132+
if isa(inferred_result, CodeInfo)
133+
ccall(:jl_set_method_inferred, Ref{CodeInstance}, (Any, Any, Any, Any, Any, Int32, UInt, UInt),
134+
result.linfo, widenconst(result.result), rettype_const, inferred_result, C_NULL,
135+
const_flags, min_valid, max_valid)
136+
elseif isa(inferred_result, SimpleVector)
137+
ccall(:jl_set_method_inferred, Ref{CodeInstance}, (Any, Any, Any, Any, Any, Int32, UInt, UInt),
138+
result.linfo, widenconst(result.result), rettype_const, inferred_result[1], inferred_result[2],
139+
const_flags, min_valid, max_valid)
140+
else
141+
ccall(:jl_set_method_inferred, Ref{CodeInstance}, (Any, Any, Any, Any, Any, Int32, UInt, UInt),
142+
result.linfo, widenconst(result.result), rettype_const, nothing, C_NULL,
143+
const_flags, min_valid, max_valid)
134144
end
135-
ccall(:jl_set_method_inferred, Ref{CodeInstance}, (Any, Any, Any, Any, Int32, UInt, UInt),
136-
result.linfo, widenconst(result.result), rettype_const, inferred_result,
137-
const_flags, min_valid, max_valid)
138145
end
139146
result.linfo.inInference = false
140147
nothing

‎base/compiler/utilities.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ function retrieve_code_info(linfo::MethodInstance)
105105
if c === nothing && isdefined(m, :source)
106106
src = m.source
107107
if isa(src, Array{UInt8,1})
108-
c = ccall(:jl_uncompress_ast, Any, (Any, Ptr{Cvoid}, Any), m, C_NULL, src)
108+
c = ccall(:jl_uncompress_ast, Any, (Any, Ptr{Cvoid}, Any, Any), m, C_NULL, src, m.roots)
109109
else
110110
c = copy(src::CodeInfo)
111111
end

‎base/reflection.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -912,8 +912,8 @@ uncompressed_ast(m::Method) = isdefined(m, :source) ? _uncompressed_ast(m, m.sou
912912
isdefined(m, :generator) ? error("Method is @generated; try `code_lowered` instead.") :
913913
error("Code for this Method is not available.")
914914
_uncompressed_ast(m::Method, s::CodeInfo) = copy(s)
915-
_uncompressed_ast(m::Method, s::Array{UInt8,1}) = ccall(:jl_uncompress_ast, Any, (Any, Ptr{Cvoid}, Any), m, C_NULL, s)::CodeInfo
916-
_uncompressed_ast(ci::Core.CodeInstance, s::Array{UInt8,1}) = ccall(:jl_uncompress_ast, Any, (Any, Any, Any), ci.def.def::Method, ci, s)::CodeInfo
915+
_uncompressed_ast(m::Method, s::Array{UInt8,1}) = ccall(:jl_uncompress_ast, Any, (Any, Ptr{Cvoid}, Any, Any), m, C_NULL, s, m.roots)::CodeInfo
916+
_uncompressed_ast(ci::Core.CodeInstance, s::Array{UInt8,1}) = ccall(:jl_uncompress_ast, Any, (Any, Any, Any, Any), ci.def.def::Method, ci, s, ci.localroots)::CodeInfo
917917

918918
function method_instances(@nospecialize(f), @nospecialize(t), world::UInt = typemax(UInt))
919919
tt = signature_type(f, t)

‎src/codegen.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1125,7 +1125,7 @@ jl_code_instance_t *jl_compile_linfo(jl_method_instance_t *mi, jl_code_info_t *s
11251125
}
11261126
// found inferred code, prep it for codegen
11271127
if ((jl_value_t*)src != jl_nothing)
1128-
src = jl_uncompress_ast(mi->def.method, codeinst, (jl_array_t*)src);
1128+
src = jl_uncompress_ast(mi->def.method, codeinst, (jl_array_t*)src, (jl_array_t*)(codeinst->localroots));
11291129
if (!jl_is_code_info(src)) {
11301130
src = jl_type_infer(mi, world, 0);
11311131
if (!src)
@@ -1157,7 +1157,7 @@ jl_code_instance_t *jl_compile_linfo(jl_method_instance_t *mi, jl_code_info_t *s
11571157
}
11581158
}
11591159
assert((jl_value_t*)src != jl_nothing);
1160-
src = jl_uncompress_ast(mi->def.method, NULL, (jl_array_t*)src);
1160+
src = jl_uncompress_ast(mi->def.method, NULL, (jl_array_t*)src, mi->def.method->roots);
11611161
}
11621162
assert(jl_is_code_info(src));
11631163

@@ -1175,6 +1175,7 @@ jl_code_instance_t *jl_compile_linfo(jl_method_instance_t *mi, jl_code_info_t *s
11751175
uncached->functionObjectsDecls.functionObject = NULL;
11761176
uncached->functionObjectsDecls.specFunctionObject = NULL;
11771177
uncached->inferred = jl_nothing;
1178+
uncached->localroots = jl_alloc_vec_any(0);
11781179
if (uncached->invoke != jl_fptr_const_return)
11791180
uncached->invoke = NULL;
11801181
uncached->specptr.fptr = NULL;
@@ -1240,8 +1241,11 @@ jl_code_instance_t *jl_compile_linfo(jl_method_instance_t *mi, jl_code_info_t *s
12401241
jl_options.debug_level > 1) {
12411242
// update the stored code
12421243
if (codeinst->inferred != (jl_value_t*)src) {
1243-
if (jl_is_method(mi->def.method))
1244-
src = (jl_code_info_t*)jl_compress_ast(mi->def.method, src);
1244+
if (jl_is_method(mi->def.method)) {
1245+
jl_svec_t *srcroots = jl_compress_ast(mi->def.method, src);
1246+
src = (jl_code_info_t*) jl_svecref(srcroots, 0);
1247+
codeinst->localroots = (jl_array_t*) jl_svecref(srcroots, 1);
1248+
}
12451249
codeinst->inferred = (jl_value_t*)src;
12461250
jl_gc_wb(codeinst, src);
12471251
}
@@ -1504,7 +1508,7 @@ void *jl_get_llvmf_defn(jl_method_instance_t *mi, size_t world, bool getwrapper,
15041508
jl_code_instance_t *codeinst = (jl_code_instance_t*)ci;
15051509
src = (jl_code_info_t*)codeinst->inferred;
15061510
if ((jl_value_t*)src != jl_nothing && !jl_is_code_info(src) && jl_is_method(mi->def.method))
1507-
src = jl_uncompress_ast(mi->def.method, codeinst, (jl_array_t*)src);
1511+
src = jl_uncompress_ast(mi->def.method, codeinst, (jl_array_t*)src, (jl_array_t*)(codeinst->localroots));
15081512
jlrettype = codeinst->rettype;
15091513
}
15101514
if (!src || (jl_value_t*)src == jl_nothing) {
@@ -1514,7 +1518,7 @@ void *jl_get_llvmf_defn(jl_method_instance_t *mi, size_t world, bool getwrapper,
15141518
if (!src && jl_is_method(mi->def.method)) {
15151519
src = mi->def.method->generator ? jl_code_for_staged(mi) : (jl_code_info_t*)mi->def.method->source;
15161520
if (src && !jl_is_code_info(src) && jl_is_method(mi->def.method))
1517-
src = jl_uncompress_ast(mi->def.method, NULL, (jl_array_t*)src);
1521+
src = jl_uncompress_ast(mi->def.method, NULL, (jl_array_t*)src, mi->def.method->roots);
15181522
}
15191523
}
15201524
if (src == NULL || (jl_value_t*)src == jl_nothing || !jl_is_code_info(src))

‎src/dump.c

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ typedef struct {
141141
ios_t *s;
142142
DUMP_MODES mode;
143143
// method we're compressing for in MODE_IR
144-
jl_method_t *method;
144+
jl_module_t *module;
145+
jl_array_t *roots;
145146
jl_ptls_t ptls;
146147
jl_array_t *loaded_modules_array;
147148
} jl_serializer_state;
@@ -484,7 +485,7 @@ static int is_ast_node(jl_value_t *v)
484485

485486
static int literal_val_id(jl_serializer_state *s, jl_value_t *v) JL_GC_DISABLED
486487
{
487-
jl_array_t *rs = s->method->roots;
488+
jl_array_t *rs = s->roots;
488489
int i, l = jl_array_len(rs);
489490
if (jl_is_symbol(v) || jl_is_concrete_type(v)) {
490491
for (i = 0; i < l; i++) {
@@ -535,7 +536,7 @@ static void jl_serialize_value_(jl_serializer_state *s, jl_value_t *v, int as_li
535536
}
536537

537538
if (s->mode == MODE_IR) {
538-
if (v == (jl_value_t*)s->method->module) {
539+
if (v == (jl_value_t*)s->module) {
539540
write_uint8(s->s, TAG_NEARBYMODULE);
540541
return;
541542
}
@@ -640,7 +641,7 @@ static void jl_serialize_value_(jl_serializer_state *s, jl_value_t *v, int as_li
640641
ios_write(s->s, jl_symbol_name((jl_sym_t*)v), l);
641642
}
642643
else if (jl_is_globalref(v)) {
643-
if (s->mode == MODE_IR && jl_globalref_mod(v) == s->method->module) {
644+
if (s->mode == MODE_IR && jl_globalref_mod(v) == s->module) {
644645
write_uint8(s->s, TAG_NEARBYGLOBAL);
645646
jl_serialize_value(s, jl_globalref_name(v));
646647
}
@@ -885,13 +886,15 @@ static void jl_serialize_value_(jl_serializer_state *s, jl_value_t *v, int as_li
885886
jl_serialize_value(s, (jl_value_t*)codeinst->def);
886887
if (validate || codeinst->min_world == 0) {
887888
jl_serialize_value(s, codeinst->inferred);
889+
jl_serialize_value(s, codeinst->localroots);
888890
jl_serialize_value(s, codeinst->rettype_const);
889891
jl_serialize_value(s, codeinst->rettype);
890892
}
891893
else {
892894
// skip storing useless data
893895
jl_serialize_value(s, NULL);
894896
jl_serialize_value(s, NULL);
897+
jl_serialize_value(s, NULL);
895898
jl_serialize_value(s, jl_any_type);
896899
}
897900
jl_serialize_value(s, codeinst->next);
@@ -1387,7 +1390,7 @@ static jl_value_t *jl_deserialize_datatype(jl_serializer_state *s, int pos, jl_v
13871390
assert(0 && "corrupt deserialization state");
13881391
abort();
13891392
}
1390-
assert(s->method == NULL && s->mode != MODE_IR && "no new data-types expected during MODE_IR");
1393+
assert(s->roots == NULL && s->mode != MODE_IR && "no new data-types expected during MODE_IR");
13911394
assert(pos == backref_list.len - 1 && "nothing should have been deserialized since assigning pos");
13921395
backref_list.items[pos] = dt;
13931396
dt->size = size;
@@ -1762,7 +1765,11 @@ static jl_value_t *jl_deserialize_value_code_instance(jl_serializer_state *s, jl
17621765
codeinst->def = (jl_method_instance_t*)jl_deserialize_value(s, (jl_value_t**)&codeinst->def);
17631766
jl_gc_wb(codeinst, codeinst->def);
17641767
codeinst->inferred = jl_deserialize_value(s, &codeinst->inferred);
1765-
jl_gc_wb(codeinst, codeinst->inferred);
1768+
if (codeinst->inferred)
1769+
jl_gc_wb(codeinst, codeinst->inferred);
1770+
codeinst->localroots = (jl_array_t*) jl_deserialize_value(s, (jl_value_t**) &(codeinst->localroots));
1771+
if (codeinst->localroots)
1772+
jl_gc_wb(codeinst, codeinst->localroots);
17661773
codeinst->rettype_const = jl_deserialize_value(s, &codeinst->rettype_const);
17671774
if (codeinst->rettype_const)
17681775
jl_gc_wb(codeinst, codeinst->rettype_const);
@@ -2023,7 +2030,7 @@ static jl_value_t *jl_deserialize_value(jl_serializer_state *s, jl_value_t **loc
20232030
tag = read_uint8(s->s);
20242031
return deser_tag[tag];
20252032
case TAG_BACKREF: JL_FALLTHROUGH; case TAG_SHORT_BACKREF:
2026-
assert(s->method == NULL && s->mode != MODE_IR);
2033+
assert(s->roots == NULL && s->mode != MODE_IR);
20272034
uintptr_t offs = (tag == TAG_BACKREF) ? read_int32(s->s) : read_uint16(s->s);
20282035
int isflagref = 0;
20292036
isflagref = !!(offs & 1);
@@ -2042,9 +2049,9 @@ static jl_value_t *jl_deserialize_value(jl_serializer_state *s, jl_value_t **loc
20422049
}
20432050
return (jl_value_t*)bp;
20442051
case TAG_METHODROOT:
2045-
return jl_array_ptr_ref(s->method->roots, read_uint8(s->s));
2052+
return jl_array_ptr_ref(s->roots, read_uint8(s->s));
20462053
case TAG_LONG_METHODROOT:
2047-
return jl_array_ptr_ref(s->method->roots, read_uint16(s->s));
2054+
return jl_array_ptr_ref(s->roots, read_uint16(s->s));
20482055
case TAG_SVEC: JL_FALLTHROUGH; case TAG_LONG_SVEC:
20492056
return jl_deserialize_value_svec(s, tag);
20502057
case TAG_COMMONSYM:
@@ -2152,12 +2159,12 @@ static jl_value_t *jl_deserialize_value(jl_serializer_state *s, jl_value_t **loc
21522159
case TAG_UINT8:
21532160
return jl_box_uint8(read_uint8(s->s));
21542161
case TAG_NEARBYGLOBAL:
2155-
assert(s->method != NULL);
2162+
assert(s->module != NULL);
21562163
v = jl_deserialize_value(s, NULL);
2157-
return jl_module_globalref(s->method->module, (jl_sym_t*)v);
2164+
return jl_module_globalref(s->module, (jl_sym_t*)v);
21582165
case TAG_NEARBYMODULE:
2159-
assert(s->method != NULL);
2160-
return (jl_value_t*)s->method->module;
2166+
assert(s->module != NULL);
2167+
return (jl_value_t*)s->module;
21612168
case TAG_GLOBALREF:
21622169
return jl_deserialize_value_globalref(s);
21632170
case TAG_SINGLETON:
@@ -2479,7 +2486,7 @@ JL_DLLEXPORT void jl_init_restored_modules(jl_array_t *init_order)
24792486

24802487
// --- entry points ---
24812488

2482-
JL_DLLEXPORT jl_array_t *jl_compress_ast(jl_method_t *m, jl_code_info_t *code)
2489+
JL_DLLEXPORT jl_svec_t *jl_compress_ast(jl_method_t *m, jl_code_info_t *code)
24832490
{
24842491
JL_TIMING(AST_COMPRESS);
24852492
JL_LOCK(&m->writelock); // protect the roots array (Might GC)
@@ -2490,13 +2497,11 @@ JL_DLLEXPORT jl_array_t *jl_compress_ast(jl_method_t *m, jl_code_info_t *code)
24902497
int en = jl_gc_enable(0); // Might GC
24912498
size_t i;
24922499

2493-
if (m->roots == NULL) {
2494-
m->roots = jl_alloc_vec_any(0);
2495-
jl_gc_wb(m, m->roots);
2496-
}
2500+
jl_array_t *localroots = jl_alloc_vec_any(0);
24972501
jl_serializer_state s = {
24982502
&dest, MODE_IR,
2499-
m,
2503+
m->module,
2504+
localroots,
25002505
jl_get_ptls_states(),
25012506
NULL
25022507
};
@@ -2552,26 +2557,24 @@ JL_DLLEXPORT jl_array_t *jl_compress_ast(jl_method_t *m, jl_code_info_t *code)
25522557
}
25532558

25542559
ios_flush(s.s);
2555-
jl_array_t *v = jl_take_buffer(&dest);
2560+
jl_svec_t *v = jl_svec2(jl_take_buffer(&dest), localroots);
25562561
ios_close(s.s);
2557-
if (jl_array_len(m->roots) == 0) {
2558-
m->roots = NULL;
2559-
}
25602562
JL_GC_PUSH1(&v);
25612563
jl_gc_enable(en);
25622564
JL_UNLOCK(&m->writelock); // Might GC
25632565
JL_GC_POP();
25642566
return v;
25652567
}
25662568

2567-
JL_DLLEXPORT jl_code_info_t *jl_uncompress_ast(jl_method_t *m, jl_code_instance_t *metadata, jl_array_t *data)
2569+
JL_DLLEXPORT jl_code_info_t *jl_uncompress_ast(jl_method_t *m, jl_code_instance_t *metadata, jl_array_t *data, jl_array_t *localroots)
25682570
{
25692571
if (jl_is_code_info(data))
25702572
return (jl_code_info_t*)data;
25712573
JL_TIMING(AST_UNCOMPRESS);
25722574
JL_LOCK(&m->writelock); // protect the roots array (Might GC)
25732575
assert(jl_is_method(m));
25742576
assert(jl_typeis(data, jl_array_uint8_type));
2577+
assert(localroots);
25752578
size_t i;
25762579
ios_t src;
25772580
ios_mem(&src, 0);
@@ -2580,7 +2583,8 @@ JL_DLLEXPORT jl_code_info_t *jl_uncompress_ast(jl_method_t *m, jl_code_instance_
25802583
int en = jl_gc_enable(0); // Might GC
25812584
jl_serializer_state s = {
25822585
&src, MODE_IR,
2583-
m,
2586+
m->module,
2587+
localroots,
25842588
jl_get_ptls_states(),
25852589
NULL
25862590
};
@@ -2817,6 +2821,7 @@ JL_DLLEXPORT int jl_save_incremental(const char *fname, jl_array_t *worklist)
28172821
jl_serializer_state s = {
28182822
&f, MODE_MODULE,
28192823
NULL,
2824+
NULL,
28202825
jl_get_ptls_states(),
28212826
mod_array
28222827
};
@@ -3198,6 +3203,7 @@ static jl_value_t *_jl_restore_incremental(ios_t *f, jl_array_t *mod_array)
31983203
jl_serializer_state s = {
31993204
f, MODE_MODULE,
32003205
NULL,
3206+
NULL,
32013207
ptls,
32023208
mod_array
32033209
};

‎src/gf.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ JL_DLLEXPORT jl_method_t *jl_new_method_uninit(jl_module_t*);
131131
JL_DLLEXPORT jl_code_instance_t* jl_set_method_inferred(
132132
jl_method_instance_t *mi, jl_value_t *rettype,
133133
jl_value_t *inferred_const, jl_value_t *inferred,
134+
jl_array_t *localroots,
134135
int32_t const_flags, size_t min_world, size_t max_world);
135136

136137
jl_datatype_t *jl_mk_builtin_func(jl_datatype_t *dt, const char *name, jl_fptr_args_t fptr) JL_GC_DISABLED
@@ -155,7 +156,7 @@ jl_datatype_t *jl_mk_builtin_func(jl_datatype_t *dt, const char *name, jl_fptr_a
155156
m->unspecialized = mi;
156157
jl_gc_wb(m, mi);
157158

158-
jl_code_instance_t *codeinst = jl_set_method_inferred(mi, (jl_value_t*)jl_any_type, jl_nothing, jl_nothing,
159+
jl_code_instance_t *codeinst = jl_set_method_inferred(mi, (jl_value_t*)jl_any_type, jl_nothing, jl_nothing, NULL,
159160
0, 1, ~(size_t)0);
160161
codeinst->specptr.fptr1 = fptr;
161162
codeinst->invoke = jl_fptr_args;
@@ -266,13 +267,14 @@ JL_DLLEXPORT jl_code_instance_t *jl_get_method_inferred(
266267
codeinst = codeinst->next;
267268
}
268269
return jl_set_method_inferred(
269-
mi, rettype, NULL, NULL,
270+
mi, rettype, NULL, NULL, NULL,
270271
0, min_world, max_world);
271272
}
272273

273274
JL_DLLEXPORT jl_code_instance_t *jl_set_method_inferred(
274275
jl_method_instance_t *mi, jl_value_t *rettype,
275276
jl_value_t *inferred_const, jl_value_t *inferred,
277+
jl_array_t *localroots,
276278
int32_t const_flags, size_t min_world, size_t max_world
277279
/*, jl_array_t *edges, int absolute_max*/)
278280
{
@@ -288,6 +290,7 @@ JL_DLLEXPORT jl_code_instance_t *jl_set_method_inferred(
288290
codeinst->functionObjectsDecls.specFunctionObject = NULL;
289291
codeinst->rettype = rettype;
290292
codeinst->inferred = inferred;
293+
codeinst->localroots = localroots;
291294
//codeinst->edges = NULL;
292295
if ((const_flags & 2) == 0)
293296
inferred_const = NULL;
@@ -1738,7 +1741,7 @@ jl_code_instance_t *jl_compile_method_internal(jl_method_instance_t *mi, size_t
17381741
if (jl_is_method(def) && def->unspecialized) {
17391742
jl_code_instance_t *unspec = def->unspecialized->cache;
17401743
if (unspec && unspec->invoke != NULL) {
1741-
jl_code_instance_t *codeinst = jl_set_method_inferred(mi, (jl_value_t*)jl_any_type, NULL, NULL,
1744+
jl_code_instance_t *codeinst = jl_set_method_inferred(mi, (jl_value_t*)jl_any_type, NULL, NULL, NULL,
17421745
0, 1, ~(size_t)0);
17431746
codeinst->specptr = unspec->specptr;
17441747
codeinst->rettype_const = unspec->rettype_const;
@@ -1748,7 +1751,7 @@ jl_code_instance_t *jl_compile_method_internal(jl_method_instance_t *mi, size_t
17481751
}
17491752
jl_code_info_t *src = jl_code_for_interpreter(mi);
17501753
if (!jl_code_requires_compiler(src)) {
1751-
jl_code_instance_t *codeinst = jl_set_method_inferred(mi, (jl_value_t*)jl_any_type, NULL, NULL,
1754+
jl_code_instance_t *codeinst = jl_set_method_inferred(mi, (jl_value_t*)jl_any_type, NULL, NULL, NULL,
17521755
0, 1, ~(size_t)0);
17531756
jl_atomic_store_release(&codeinst->invoke, jl_fptr_interpret_call);
17541757
return codeinst;
@@ -1786,7 +1789,7 @@ jl_code_instance_t *jl_compile_method_internal(jl_method_instance_t *mi, size_t
17861789
ucache->invoke != jl_fptr_interpret_call) {
17871790
return ucache;
17881791
}
1789-
jl_code_instance_t *codeinst = jl_set_method_inferred(mi, (jl_value_t*)jl_any_type, NULL, NULL,
1792+
jl_code_instance_t *codeinst = jl_set_method_inferred(mi, (jl_value_t*)jl_any_type, NULL, NULL, NULL,
17901793
0, 1, ~(size_t)0);
17911794
codeinst->specptr = ucache->specptr;
17921795
codeinst->rettype_const = ucache->rettype_const;

‎src/interpreter.c

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -790,22 +790,20 @@ jl_code_info_t *jl_code_for_interpreter(jl_method_instance_t *mi)
790790
if (jl_is_method(mi->def.value)) {
791791
if (!src || (jl_value_t*)src == jl_nothing) {
792792
if (mi->def.method->source) {
793-
src = (jl_code_info_t*)mi->def.method->source;
793+
src = jl_uncompress_ast(mi->def.method, NULL, mi->def.method->source,
794+
mi->def.method->roots);
794795
}
795796
else {
796797
assert(mi->def.method->generator);
797798
src = jl_code_for_staged(mi);
798799
}
799800
}
800-
if (src && (jl_value_t*)src != jl_nothing) {
801-
JL_GC_PUSH1(&src);
802-
src = jl_uncompress_ast(mi->def.method, NULL, (jl_array_t*)src);
803-
mi->uninferred = (jl_value_t*)src;
804-
jl_gc_wb(mi, src);
805-
JL_GC_POP();
801+
if (!src || !jl_is_code_info(src)) {
802+
jl_error("source missing for method called in interpreter");
806803
}
807-
}
808-
if (!src || !jl_is_code_info(src)) {
804+
mi->uninferred = (jl_value_t*)src;
805+
jl_gc_wb(mi, src);
806+
} else if (!src || !jl_is_code_info(src)) {
809807
jl_error("source missing for method called in interpreter");
810808
}
811809
return src;

‎src/jltypes.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2181,26 +2181,28 @@ void jl_init_types(void) JL_GC_DISABLED
21812181
jl_code_instance_type =
21822182
jl_new_datatype(jl_symbol("CodeInstance"), core,
21832183
jl_any_type, jl_emptysvec,
2184-
jl_perm_symsvec(11,
2184+
jl_perm_symsvec(12,
21852185
"def",
21862186
"next",
21872187
"min_world",
21882188
"max_world",
21892189
"rettype",
21902190
"rettype_const",
21912191
"inferred",
2192+
"localroots",
21922193
//"edges",
21932194
//"absolute_max",
21942195
"invoke", "specptr",
21952196
"", ""), // function object decls
2196-
jl_svec(11,
2197+
jl_svec(12,
21972198
jl_method_instance_type,
21982199
jl_any_type,
21992200
jl_ulong_type,
22002201
jl_ulong_type,
22012202
jl_any_type,
22022203
jl_any_type,
22032204
jl_any_type,
2205+
jl_any_type,
22042206
//jl_any_type,
22052207
//jl_bool_type,
22062208
jl_any_type, jl_any_type, // fptrs
@@ -2316,10 +2318,10 @@ void jl_init_types(void) JL_GC_DISABLED
23162318
jl_svecset(jl_methtable_type->types, 10, jl_uint8_type);
23172319
jl_svecset(jl_method_type->types, 11, jl_method_instance_type);
23182320
jl_svecset(jl_method_instance_type->types, 5, jl_code_instance_type);
2319-
jl_svecset(jl_code_instance_type->types, 7, jl_voidpointer_type);
23202321
jl_svecset(jl_code_instance_type->types, 8, jl_voidpointer_type);
23212322
jl_svecset(jl_code_instance_type->types, 9, jl_voidpointer_type);
23222323
jl_svecset(jl_code_instance_type->types, 10, jl_voidpointer_type);
2324+
jl_svecset(jl_code_instance_type->types, 11, jl_voidpointer_type);
23232325

23242326
jl_compute_field_offsets(jl_datatype_type);
23252327
jl_compute_field_offsets(jl_typename_type);

‎src/julia.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ typedef struct _jl_code_instance_t {
341341
jl_value_t *rettype; // return type for fptr
342342
jl_value_t *rettype_const; // inferred constant return value, or null
343343
jl_value_t *inferred; // inferred jl_code_info_t, or jl_nothing, or null
344+
jl_array_t *localroots; // roots for this specific MethodInstance
344345
//TODO: jl_array_t *edges; // stored information about edges from this object
345346
//TODO: uint8_t absolute_max; // whether true max world is unknown
346347

@@ -1592,8 +1593,8 @@ JL_DLLEXPORT void jl_register_newmeth_tracer(void (*callback)(jl_method_t *trace
15921593
// AST access
15931594
JL_DLLEXPORT jl_value_t *jl_copy_ast(jl_value_t *expr JL_MAYBE_UNROOTED);
15941595

1595-
JL_DLLEXPORT jl_array_t *jl_compress_ast(jl_method_t *m, jl_code_info_t *code);
1596-
JL_DLLEXPORT jl_code_info_t *jl_uncompress_ast(jl_method_t *m, jl_code_instance_t *metadata, jl_array_t *data);
1596+
JL_DLLEXPORT jl_svec_t *jl_compress_ast(jl_method_t *m, jl_code_info_t *code);
1597+
JL_DLLEXPORT jl_code_info_t *jl_uncompress_ast(jl_method_t *m, jl_code_instance_t *metadata, jl_array_t *data, jl_array_t *roots);
15971598
JL_DLLEXPORT uint8_t jl_ast_flag_inferred(jl_array_t *data) JL_NOTSAFEPOINT;
15981599
JL_DLLEXPORT uint8_t jl_ast_flag_inlineable(jl_array_t *data) JL_NOTSAFEPOINT;
15991600
JL_DLLEXPORT uint8_t jl_ast_flag_pure(jl_array_t *data) JL_NOTSAFEPOINT;

‎src/method.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -556,10 +556,14 @@ static void jl_method_set_source(jl_method_t *m, jl_code_info_t *src)
556556
jl_gc_wb(src, copy);
557557
m->slot_syms = jl_compress_argnames(src->slotnames);
558558
jl_gc_wb(m, m->slot_syms);
559-
if (gen_only)
559+
if (gen_only) {
560560
m->source = NULL;
561-
else
562-
m->source = (jl_value_t*)jl_compress_ast(m, src);
561+
}
562+
else {
563+
jl_svec_t *srcroots = jl_compress_ast(m, src);
564+
m->source = jl_svecref(srcroots, 0);
565+
m->roots = (jl_array_t*) jl_svecref(srcroots, 1);
566+
}
563567
jl_gc_wb(m, m->source);
564568
JL_GC_POP();
565569
}

0 commit comments

Comments
 (0)
Please sign in to comment.