Skip to content

Commit 88a1cbf

Browse files
committed
Copy over CodeInstances too
1 parent 48c91b3 commit 88a1cbf

2 files changed

Lines changed: 25 additions & 9 deletions

File tree

src/dump.c

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2205,17 +2205,20 @@ void remove_code_instance_from_validation(jl_code_instance_t *codeinst)
22052205

22062206
static void jl_insert_method_instances(jl_array_t *list)
22072207
{
2208-
size_t i, l = jl_array_len(list), ll = l;
2208+
size_t i, l = jl_array_len(list);
22092209
// Validate the MethodInstances
2210+
jl_array_t *valids = jl_alloc_array_1d(jl_array_uint8_type, l);
2211+
memset(jl_array_data(valids), 1, l);
22102212
size_t world = jl_atomic_load_acquire(&jl_world_counter);
2211-
for (i = 0; i < ll; i++) {
2213+
for (i = 0; i < l; i++) {
22122214
jl_method_instance_t *mi = (jl_method_instance_t*)jl_array_ptr_ref(list, i);
22132215
assert(jl_is_method_instance(mi));
22142216
if (jl_is_method(mi->def.method)) {
22152217
// Is this still the method we'd be calling?
22162218
jl_methtable_t *mt = jl_method_table_for(mi->specTypes);
22172219
jl_value_t *mworld = jl_methtable_lookup(mt, mi->specTypes, world);
22182220
if (jl_is_method(mworld) && mi->def.method != (jl_method_t*)mworld) {
2221+
jl_array_uint8_set(valids, i, 0);
22192222
invalidate_backedges(&remove_code_instance_from_validation, mi, world, "jl_insert_method_instance");
22202223
// The codeinst of this mi haven't yet been removed
22212224
jl_code_instance_t *codeinst = mi->cache;
@@ -2227,13 +2230,10 @@ static void jl_insert_method_instances(jl_array_t *list)
22272230
jl_array_ptr_1d_push(_jl_debug_method_invalidation, mworld);
22282231
jl_array_ptr_1d_push(_jl_debug_method_invalidation, jl_cstr_to_string("jl_method_table_insert")); // GC disabled
22292232
}
2230-
jl_array_ptr_set(list, i, jl_array_ptr_ref(list, ll-1));
2231-
jl_array_ptr_set(list, ll-1, mi);
2232-
ll--;
22332233
}
22342234
}
22352235
}
2236-
// While it's tempting to just remove the invalidated MIs altogether (loop only up to `ll`),
2236+
// While it's tempting to just remove the invalidated MIs altogether,
22372237
// this hurts the ability of SnoopCompile to diagnose problems.
22382238
for (i = 0; i < l; i++) {
22392239
jl_method_instance_t *mi = (jl_method_instance_t*)jl_array_ptr_ref(list, i);
@@ -2280,6 +2280,22 @@ static void jl_insert_method_instances(jl_array_t *list)
22802280
}
22812281
}
22822282
}
2283+
// Additionally, if we have CodeInstance(s) and the running CodeInstance is world-limited, transfer it
2284+
if (mi->cache && jl_array_uint8_ref(valids, i)) {
2285+
if (!milive->cache || milive->cache->max_world < ~(size_t)0) {
2286+
jl_code_instance_t *cilive = milive->cache, *ci;
2287+
milive->cache = mi->cache;
2288+
jl_gc_wb(milive, milive->cache);
2289+
ci = mi->cache;
2290+
ci->def = milive;
2291+
while (ci->next) {
2292+
ci = ci->next;
2293+
ci->def = milive;
2294+
}
2295+
ci->next = cilive;
2296+
jl_gc_wb(ci, ci->next);
2297+
}
2298+
}
22832299
}
22842300
}
22852301
}

test/precompile.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,8 @@ precompile_test_harness("code caching") do dir
787787
end
788788

789789
StaleA = :StaleA_0xab07d60518763a7e
790+
StaleB = :StaleB_0xab07d60518763a7e
791+
StaleC = :StaleC_0xab07d60518763a7e
790792
write(joinpath(dir, "$StaleA.jl"),
791793
"""
792794
module $StaleA
@@ -806,7 +808,6 @@ precompile_test_harness("code caching") do dir
806808
end
807809
"""
808810
)
809-
StaleB = :StaleB_0xab07d60518763a7e
810811
write(joinpath(dir, "$StaleB.jl"),
811812
"""
812813
module $StaleB
@@ -825,7 +826,6 @@ precompile_test_harness("code caching") do dir
825826
end
826827
"""
827828
)
828-
StaleC = :StaleC_0xab07d60518763a7e
829829
write(joinpath(dir, "$StaleC.jl"),
830830
"""
831831
module $StaleC
@@ -852,7 +852,7 @@ precompile_test_harness("code caching") do dir
852852
world = Base.get_world_counter()
853853
m = only(methods(MA.use_stale))
854854
mi = m.specializations[1]
855-
@test_broken hasvalid(mi, world) # it should have been re-inferred by StaleC
855+
@test hasvalid(mi, world) # was re-inferred by StaleC
856856
m = only(methods(MA.build_stale))
857857
mis = filter(!isnothing, collect(m.specializations))
858858
@test length(mis) == 2

0 commit comments

Comments
 (0)