@@ -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