Skip to content

Commit 91a2524

Browse files
vtjnashKristofferC
authored andcommitted
init: avoid an undesirable compiler optimization (#42377)
jl_current_task is not constant after this point in the function, so we split the function so that the compiler won't try to optimize it incorrectly (hoisting the JL_GC_PUSH to the top of the function for example). Fixes #42346 (cherry picked from commit 4dea1c4)
1 parent 7660b4c commit 91a2524

File tree

4 files changed

+17
-7
lines changed

4 files changed

+17
-7
lines changed

src/init.c

+9-2
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,8 @@ static void restore_fp_env(void)
628628
}
629629
}
630630

631+
static NOINLINE void _finish_julia_init(JL_IMAGE_SEARCH rel, jl_ptls_t ptls, jl_task_t *ct);
632+
631633
JL_DLLEXPORT void julia_init(JL_IMAGE_SEARCH rel)
632634
{
633635
jl_init_timing();
@@ -722,9 +724,14 @@ JL_DLLEXPORT void julia_init(JL_IMAGE_SEARCH rel)
722724
jl_init_threading();
723725

724726
jl_ptls_t ptls = jl_init_threadtls(0);
725-
jl_init_root_task(ptls, stack_lo, stack_hi);
726-
jl_task_t *ct = jl_current_task;
727+
// warning: this changes `jl_current_task`, so be careful not to call that from this function
728+
jl_task_t *ct = jl_init_root_task(ptls, stack_lo, stack_hi);
729+
JL_GC_PROMISE_ROOTED(ct);
730+
_finish_julia_init(rel, ptls, ct);
731+
}
727732

733+
static NOINLINE void _finish_julia_init(JL_IMAGE_SEARCH rel, jl_ptls_t ptls, jl_task_t *ct)
734+
{
728735
jl_init_threadinginfra();
729736

730737
jl_resolve_sysimg_location(rel);

src/julia_internal.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,7 @@ void jl_init_intrinsic_functions(void);
695695
void jl_init_intrinsic_properties(void);
696696
void jl_init_tasks(void) JL_GC_DISABLED;
697697
void jl_init_stack_limits(int ismaster, void **stack_hi, void **stack_lo);
698-
void jl_init_root_task(jl_ptls_t ptls, void *stack_lo, void *stack_hi);
698+
jl_task_t *jl_init_root_task(jl_ptls_t ptls, void *stack_lo, void *stack_hi);
699699
void jl_init_serializer(void);
700700
void jl_gc_init(void);
701701
void jl_init_uv(void);

src/partr.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,9 @@ void jl_threadfun(void *arg)
247247
jl_ptls_t ptls = jl_init_threadtls(targ->tid);
248248
void *stack_lo, *stack_hi;
249249
jl_init_stack_limits(0, &stack_lo, &stack_hi);
250-
jl_init_root_task(ptls, stack_lo, stack_hi);
250+
// warning: this changes `jl_current_task`, so be careful not to call that from this function
251+
jl_task_t *ct = jl_init_root_task(ptls, stack_lo, stack_hi);
252+
JL_GC_PROMISE_ROOTED(ct);
251253
jl_install_thread_signal_handler(ptls);
252254

253255
// set up sleep mechanism for this thread
@@ -262,7 +264,7 @@ void jl_threadfun(void *arg)
262264
free(targ);
263265

264266
(void)jl_gc_unsafe_enter(ptls);
265-
jl_finish_task(jl_current_task); // noreturn
267+
jl_finish_task(ct); // noreturn
266268
}
267269

268270

src/task.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -1249,7 +1249,7 @@ static char *jl_alloc_fiber(jl_ucontext_t *t, size_t *ssize, jl_task_t *owner) J
12491249
#endif
12501250

12511251
// Initialize a root task using the given stack.
1252-
void jl_init_root_task(jl_ptls_t ptls, void *stack_lo, void *stack_hi)
1252+
jl_task_t *jl_init_root_task(jl_ptls_t ptls, void *stack_lo, void *stack_hi)
12531253
{
12541254
assert(ptls->root_task == NULL);
12551255
// We need `gcstack` in `Task` to allocate Julia objects; *including* the `Task` type.
@@ -1325,13 +1325,14 @@ void jl_init_root_task(jl_ptls_t ptls, void *stack_lo, void *stack_hi)
13251325
#endif
13261326
if (jl_setjmp(ptls->copy_stack_ctx.uc_mcontext, 0))
13271327
start_task(); // sanitizer_finish_switch_fiber is part of start_task
1328-
return;
1328+
return ct;
13291329
}
13301330
ssize = JL_STACK_SIZE;
13311331
char *stkbuf = jl_alloc_fiber(&ptls->base_ctx, &ssize, NULL);
13321332
ptls->stackbase = stkbuf + ssize;
13331333
ptls->stacksize = ssize;
13341334
#endif
1335+
return ct;
13351336
}
13361337

13371338
JL_DLLEXPORT int jl_is_task_started(jl_task_t *t) JL_NOTSAFEPOINT

0 commit comments

Comments
 (0)