Skip to content

Commit 38d5d3a

Browse files
committed
Fix issues in jitlayers
1 parent 0609d98 commit 38d5d3a

File tree

1 file changed

+25
-4
lines changed

1 file changed

+25
-4
lines changed

src/jitlayers.cpp

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,9 @@ void jl_extern_c_impl(jl_value_t *declrt, jl_tupletype_t *sigt)
374374
if (!jl_is_tuple_type(sigt))
375375
jl_type_error("@ccallable", (jl_value_t*)jl_anytuple_type_type, (jl_value_t*)sigt);
376376
// check that f is a guaranteed singleton type
377+
PTR_PIN(((jl_datatype_t*)(sigt))->parameters);
377378
jl_datatype_t *ft = (jl_datatype_t*)jl_tparam0(sigt);
379+
PTR_PIN(ft);
378380
if (!jl_is_datatype(ft) || ft->instance == NULL)
379381
jl_error("@ccallable: function object must be a singleton");
380382

@@ -388,12 +390,18 @@ void jl_extern_c_impl(jl_value_t *declrt, jl_tupletype_t *sigt)
388390
size_t i, nargs = jl_nparams(sigt);
389391
for (i = 1; i < nargs; i++) {
390392
jl_value_t *ati = jl_tparam(sigt, i);
393+
PTR_PIN(ati);
391394
if (!jl_is_concrete_type(ati) || jl_is_kind(ati) || !jl_type_mappable_to_c(ati))
392395
jl_error("@ccallable: argument types must be concrete");
396+
PTR_UNPIN(ati);
393397
}
398+
PTR_UNPIN(ft);
399+
PTR_UNPIN(((jl_datatype_t*)(sigt))->parameters);
394400

395401
// save a record of this so that the alias is generated when we write an object file
402+
PTR_PIN(ft->name->mt);
396403
jl_method_t *meth = (jl_method_t*)jl_methtable_lookup(ft->name->mt, (jl_value_t*)sigt, jl_atomic_load_acquire(&jl_world_counter));
404+
PTR_UNPIN(ft->name->mt);
397405
if (!jl_is_method(meth))
398406
jl_error("@ccallable: could not find requested method");
399407
JL_GC_PUSH1(&meth);
@@ -420,16 +428,20 @@ jl_code_instance_t *jl_generate_fptr_impl(jl_method_instance_t *mi JL_PROPAGATES
420428
compiler_start_time = jl_hrtime();
421429
// if we don't have any decls already, try to generate it now
422430
jl_code_info_t *src = NULL;
423-
JL_GC_PUSH1(&src);
431+
jl_code_instance_t *codeinst = NULL;
432+
JL_GC_PUSH2(&src, &codeinst); // There are many places below where we need to pin codeinst, and codeinst is assigned many times. We just T pin &codeinst to make things easier.
424433
JL_LOCK(&jl_codegen_lock); // also disables finalizers, to prevent any unexpected recursion
425434
jl_value_t *ci = jl_rettype_inferred(mi, world, world);
426-
jl_code_instance_t *codeinst = (ci == jl_nothing ? NULL : (jl_code_instance_t*)ci);
435+
codeinst = (ci == jl_nothing ? NULL : (jl_code_instance_t*)ci);
427436
if (codeinst) {
428437
src = (jl_code_info_t*)jl_atomic_load_relaxed(&codeinst->inferred);
429438
if ((jl_value_t*)src == jl_nothing)
430439
src = NULL;
431-
else if (jl_is_method(mi->def.method))
440+
else if (jl_is_method(mi->def.method)) {
441+
PTR_PIN(mi->def.method);
432442
src = jl_uncompress_ir(mi->def.method, codeinst, (jl_array_t*)src);
443+
PTR_UNPIN(mi->def.method);
444+
}
433445
}
434446
else {
435447
// identify whether this is an invalidated method that is being recompiled
@@ -493,20 +505,24 @@ void jl_generate_fptr_for_unspecialized_impl(jl_code_instance_t *unspec)
493505
jl_code_info_t *src = NULL;
494506
JL_GC_PUSH1(&src);
495507
jl_method_t *def = unspec->def->def.method;
508+
PTR_PIN(def);
496509
if (jl_is_method(def)) {
497510
src = (jl_code_info_t*)def->source;
498511
if (src == NULL) {
499512
// TODO: this is wrong
500513
assert(def->generator);
501514
// TODO: jl_code_for_staged can throw
515+
PTR_PIN(unspec->def);
502516
src = jl_code_for_staged(unspec->def);
517+
PTR_UNPIN(unspec->def);
503518
}
504519
if (src && (jl_value_t*)src != jl_nothing)
505520
src = jl_uncompress_ir(def, NULL, (jl_array_t*)src);
506521
}
507522
else {
508523
src = (jl_code_info_t*)unspec->def->uninferred;
509524
}
525+
PTR_UNPIN(def);
510526
assert(src && jl_is_code_info(src));
511527
++UnspecFPtrCount;
512528
_jl_compile_codeinst(unspec, src, unspec->min_world, *jl_ExecutionEngine->getContext());
@@ -531,6 +547,7 @@ jl_value_t *jl_dump_method_asm_impl(jl_method_instance_t *mi, size_t world,
531547
// printing via disassembly
532548
jl_code_instance_t *codeinst = jl_generate_fptr(mi, world);
533549
if (codeinst) {
550+
PTR_PIN(codeinst);
534551
uintptr_t fptr = (uintptr_t)jl_atomic_load_acquire(&codeinst->invoke);
535552
if (getwrapper)
536553
return jl_dump_fptr_asm(fptr, raw_mc, asm_variant, debuginfo, binary);
@@ -556,8 +573,11 @@ jl_value_t *jl_dump_method_asm_impl(jl_method_instance_t *mi, size_t world,
556573
// TODO: jl_code_for_staged can throw
557574
src = def->generator ? jl_code_for_staged(mi) : (jl_code_info_t*)def->source;
558575
}
559-
if (src && (jl_value_t*)src != jl_nothing)
576+
if (src && (jl_value_t*)src != jl_nothing) {
577+
PTR_PIN(mi->def.method);
560578
src = jl_uncompress_ir(mi->def.method, codeinst, (jl_array_t*)src);
579+
PTR_UNPIN(mi->def.method);
580+
}
561581
}
562582
fptr = (uintptr_t)jl_atomic_load_acquire(&codeinst->invoke);
563583
specfptr = (uintptr_t)jl_atomic_load_relaxed(&codeinst->specptr.fptr);
@@ -575,6 +595,7 @@ jl_value_t *jl_dump_method_asm_impl(jl_method_instance_t *mi, size_t world,
575595
jl_atomic_fetch_add_relaxed(&jl_cumulative_compile_time, end - compiler_start_time);
576596
}
577597
}
598+
PTR_UNPIN(codeinst);
578599
if (specfptr != 0)
579600
return jl_dump_fptr_asm(specfptr, raw_mc, asm_variant, debuginfo, binary);
580601
}

0 commit comments

Comments
 (0)