From 04a27e4fca2e4be2e36a870cfbe58ea688687278 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Tue, 31 Jan 2023 07:30:51 -0500 Subject: [PATCH] radeonsi: call ac_init_llvm_once before any util_queue initialization The winsys uses util_queue, which calls atexit, so do it before the winsys is created. Cc: stable Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: (cherry picked from commit 60a3f0667f7bffcc1667396f3aa1fc891dcba3a0) --- .pick_status.json | 2 +- src/gallium/drivers/radeonsi/si_pipe.c | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) 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);