From d853d3a59bd5f8720a5b021bcd64a193d370b623 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Tue, 3 Jul 2018 09:51:42 +1000 Subject: [PATCH] ac/radeonsi: port compiler init/destroy out of radeonsi. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit We want to share this code with radv in the future, so port it out of radeonsi. Add a return value as radv will want that to know if this succeeds Reviewed-by: Marek Olšák --- src/amd/common/ac_llvm_util.c | 43 ++++++++++++++++++++++++++ src/amd/common/ac_llvm_util.h | 6 ++++ src/gallium/drivers/radeonsi/si_pipe.c | 27 ++-------------- 3 files changed, 51 insertions(+), 25 deletions(-) diff --git a/src/amd/common/ac_llvm_util.c b/src/amd/common/ac_llvm_util.c index 01852dbff46..fa85c625b33 100644 --- a/src/amd/common/ac_llvm_util.c +++ b/src/amd/common/ac_llvm_util.c @@ -282,3 +282,46 @@ ac_count_scratch_private_memory(LLVMValueRef function) return private_mem_vgprs; } + +bool +ac_init_llvm_compiler(struct ac_llvm_compiler *compiler, + enum radeon_family family, + enum ac_target_machine_options tm_options) +{ + const char *triple; + memset(compiler, 0, sizeof(*compiler)); + + compiler->tm = ac_create_target_machine(family, + tm_options, &triple); + if (!compiler->tm) + return false; + + compiler->target_library_info = + ac_create_target_library_info(triple); + if (!compiler->target_library_info) + goto fail; + + compiler->passmgr = ac_create_passmgr(compiler->target_library_info, + tm_options & AC_TM_CHECK_IR); + if (!compiler->passmgr) + goto fail; + + return true; +fail: + ac_destroy_llvm_compiler(compiler); + return false; +} + +void +ac_destroy_llvm_compiler(struct ac_llvm_compiler *compiler) +{ + if (compiler->passmgr) + LLVMDisposePassManager(compiler->passmgr); +#if HAVE_LLVM >= 0x0700 + /* This crashes on LLVM 5.0 and 6.0 and Ubuntu 18.04, so leak it there. */ + if (compiler->target_library_info) + ac_dispose_target_library_info(compiler->target_library_info); +#endif + if (compiler->tm) + LLVMDisposeTargetMachine(compiler->tm); +} diff --git a/src/amd/common/ac_llvm_util.h b/src/amd/common/ac_llvm_util.h index 2a8f6911365..cd56ff5f41c 100644 --- a/src/amd/common/ac_llvm_util.h +++ b/src/amd/common/ac_llvm_util.h @@ -125,6 +125,12 @@ LLVMTargetLibraryInfoRef ac_create_target_library_info(const char *triple); void ac_dispose_target_library_info(LLVMTargetLibraryInfoRef library_info); void ac_init_llvm_once(void); + +bool ac_init_llvm_compiler(struct ac_llvm_compiler *compiler, + enum radeon_family family, + enum ac_target_machine_options tm_options); +void ac_destroy_llvm_compiler(struct ac_llvm_compiler *compiler); + #ifdef __cplusplus } #endif diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 5ac1a12a058..ad0ca7c6169 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -114,35 +114,12 @@ static void si_init_compiler(struct si_screen *sscreen, (!sscreen->llvm_has_working_vgpr_indexing ? AC_TM_PROMOTE_ALLOCA_TO_SCRATCH : 0) | (sscreen->debug_flags & DBG(CHECK_IR) ? AC_TM_CHECK_IR : 0); - const char *triple; - ac_init_llvm_once(); - compiler->tm = ac_create_target_machine(sscreen->info.family, - tm_options, &triple); - if (!compiler->tm) - return; - - compiler->target_library_info = - gallivm_create_target_library_info(triple); - if (!compiler->target_library_info) - return; - - compiler->passmgr = ac_create_passmgr(compiler->target_library_info, - tm_options & AC_TM_CHECK_IR); - if (!compiler->passmgr) - return; + ac_init_llvm_compiler(compiler, sscreen->info.family, tm_options); } static void si_destroy_compiler(struct ac_llvm_compiler *compiler) { - if (compiler->passmgr) - LLVMDisposePassManager(compiler->passmgr); -#if HAVE_LLVM >= 0x0700 - /* This crashes on LLVM 5.0 and 6.0 and Ubuntu 18.04, so leak it there. */ - if (compiler->target_library_info) - gallivm_dispose_target_library_info(compiler->target_library_info); -#endif - if (compiler->tm) - LLVMDisposeTargetMachine(compiler->tm); + ac_destroy_llvm_compiler(compiler); } /* -- 2.30.2