diff --git a/.pick_status.json b/.pick_status.json index c619288be2d6d..5e3b57bc29ba5 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -52314,7 +52314,7 @@ "description": "radeonsi: call ac_init_llvm_once before any util_queue initialization", "nominated": false, "nomination_type": 3, - "resolution": 4, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 0ad94dcfff08b..84775d444437d 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -148,8 +148,6 @@ bool si_init_compiler(struct si_screen *sscreen, struct ac_llvm_compiler *compil (sscreen->debug_flags & DBG(CHECK_IR) ? AC_TM_CHECK_IR : 0) | (create_low_opt_compiler ? AC_TM_CREATE_LOW_OPT : 0); - ac_init_llvm_once(); - if (!ac_init_llvm_compiler(compiler, sscreen->info.family, tm_options)) return false; @@ -1495,6 +1493,14 @@ struct pipe_screen *radeonsi_screen_create(int fd, const struct pipe_screen_conf if (!version) return NULL; + /* LLVM must be initialized before util_queue because both u_queue and LLVM call atexit, + * and LLVM must call it first because its atexit handler executes C++ destructors, + * which must be done after our compiler threads using LLVM in u_queue are finished + * by their atexit handler. Since atexit handlers are called in the reverse order, + * LLVM must be initialized first, followed by u_queue. + */ + ac_init_llvm_once(); + driParseConfigFiles(config->options, config->options_info, 0, "radeonsi", NULL, NULL, NULL, 0, NULL, 0);