@@ -374,7 +374,9 @@ void jl_extern_c_impl(jl_value_t *declrt, jl_tupletype_t *sigt)
374
374
if (!jl_is_tuple_type (sigt))
375
375
jl_type_error (" @ccallable" , (jl_value_t *)jl_anytuple_type_type, (jl_value_t *)sigt);
376
376
// check that f is a guaranteed singleton type
377
+ PTR_PIN (((jl_datatype_t *)(sigt))->parameters );
377
378
jl_datatype_t *ft = (jl_datatype_t *)jl_tparam0 (sigt);
379
+ PTR_PIN (ft);
378
380
if (!jl_is_datatype (ft) || ft->instance == NULL )
379
381
jl_error (" @ccallable: function object must be a singleton" );
380
382
@@ -388,12 +390,18 @@ void jl_extern_c_impl(jl_value_t *declrt, jl_tupletype_t *sigt)
388
390
size_t i, nargs = jl_nparams (sigt);
389
391
for (i = 1 ; i < nargs; i++) {
390
392
jl_value_t *ati = jl_tparam (sigt, i);
393
+ PTR_PIN (ati);
391
394
if (!jl_is_concrete_type (ati) || jl_is_kind (ati) || !jl_type_mappable_to_c (ati))
392
395
jl_error (" @ccallable: argument types must be concrete" );
396
+ PTR_UNPIN (ati);
393
397
}
398
+ PTR_UNPIN (ft);
399
+ PTR_UNPIN (((jl_datatype_t *)(sigt))->parameters );
394
400
395
401
// save a record of this so that the alias is generated when we write an object file
402
+ PTR_PIN (ft->name ->mt );
396
403
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 );
397
405
if (!jl_is_method (meth))
398
406
jl_error (" @ccallable: could not find requested method" );
399
407
JL_GC_PUSH1 (&meth);
@@ -420,16 +428,20 @@ jl_code_instance_t *jl_generate_fptr_impl(jl_method_instance_t *mi JL_PROPAGATES
420
428
compiler_start_time = jl_hrtime ();
421
429
// if we don't have any decls already, try to generate it now
422
430
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.
424
433
JL_LOCK (&jl_codegen_lock); // also disables finalizers, to prevent any unexpected recursion
425
434
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);
427
436
if (codeinst) {
428
437
src = (jl_code_info_t *)jl_atomic_load_relaxed (&codeinst->inferred );
429
438
if ((jl_value_t *)src == jl_nothing)
430
439
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 );
432
442
src = jl_uncompress_ir (mi->def .method , codeinst, (jl_array_t *)src);
443
+ PTR_UNPIN (mi->def .method );
444
+ }
433
445
}
434
446
else {
435
447
// 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)
493
505
jl_code_info_t *src = NULL ;
494
506
JL_GC_PUSH1 (&src);
495
507
jl_method_t *def = unspec->def ->def .method ;
508
+ PTR_PIN (def);
496
509
if (jl_is_method (def)) {
497
510
src = (jl_code_info_t *)def->source ;
498
511
if (src == NULL ) {
499
512
// TODO: this is wrong
500
513
assert (def->generator );
501
514
// TODO: jl_code_for_staged can throw
515
+ PTR_PIN (unspec->def );
502
516
src = jl_code_for_staged (unspec->def );
517
+ PTR_UNPIN (unspec->def );
503
518
}
504
519
if (src && (jl_value_t *)src != jl_nothing)
505
520
src = jl_uncompress_ir (def, NULL , (jl_array_t *)src);
506
521
}
507
522
else {
508
523
src = (jl_code_info_t *)unspec->def ->uninferred ;
509
524
}
525
+ PTR_UNPIN (def);
510
526
assert (src && jl_is_code_info (src));
511
527
++UnspecFPtrCount;
512
528
_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,
531
547
// printing via disassembly
532
548
jl_code_instance_t *codeinst = jl_generate_fptr (mi, world);
533
549
if (codeinst) {
550
+ PTR_PIN (codeinst);
534
551
uintptr_t fptr = (uintptr_t )jl_atomic_load_acquire (&codeinst->invoke );
535
552
if (getwrapper)
536
553
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,
556
573
// TODO: jl_code_for_staged can throw
557
574
src = def->generator ? jl_code_for_staged (mi) : (jl_code_info_t *)def->source ;
558
575
}
559
- if (src && (jl_value_t *)src != jl_nothing)
576
+ if (src && (jl_value_t *)src != jl_nothing) {
577
+ PTR_PIN (mi->def .method );
560
578
src = jl_uncompress_ir (mi->def .method , codeinst, (jl_array_t *)src);
579
+ PTR_UNPIN (mi->def .method );
580
+ }
561
581
}
562
582
fptr = (uintptr_t )jl_atomic_load_acquire (&codeinst->invoke );
563
583
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,
575
595
jl_atomic_fetch_add_relaxed (&jl_cumulative_compile_time, end - compiler_start_time);
576
596
}
577
597
}
598
+ PTR_UNPIN (codeinst);
578
599
if (specfptr != 0 )
579
600
return jl_dump_fptr_asm (specfptr, raw_mc, asm_variant, debuginfo, binary);
580
601
}
0 commit comments