Avoid initialize LLVM repeatedly (#1671)

Currently we initialize and destroy LLVM environment in aot_create_comp_context
and aot_destroy_comp_context, which are called in wasm_module_load/unload,
and the latter may be invoked multiple times, which leads to duplicated LLVM
initialization/destroy and may result in unexpected behaviors.

Move the LLVM init/destroy into runtime init/destroy to resolve the issue.
This commit is contained in:
Wenyong Huang
2022-11-02 16:13:58 +08:00
committed by GitHub
parent f1f6f4a125
commit 5b144c491d
5 changed files with 68 additions and 11 deletions

View File

@ -1400,6 +1400,34 @@ fail:
return ret;
}
bool
aot_compiler_init(void)
{
/* Initialize LLVM environment */
LLVMInitializeCore(LLVMGetGlobalPassRegistry());
#if WASM_ENABLE_WAMR_COMPILER != 0
/* Init environment of all targets for AOT compiler */
LLVMInitializeAllTargetInfos();
LLVMInitializeAllTargets();
LLVMInitializeAllTargetMCs();
LLVMInitializeAllAsmPrinters();
#else
/* Init environment of native for JIT compiler */
LLVMInitializeNativeTarget();
LLVMInitializeNativeTarget();
LLVMInitializeNativeAsmPrinter();
#endif
return true;
}
void
aot_compiler_destroy(void)
{
LLVMShutdown();
}
AOTCompContext *
aot_create_comp_context(AOTCompData *comp_data, aot_comp_option_t option)
{
@ -1415,15 +1443,6 @@ aot_create_comp_context(AOTCompData *comp_data, aot_comp_option_t option)
LLVMCodeModel code_model;
LLVMTargetDataRef target_data_ref;
/* Initialize LLVM environment */
LLVMInitializeCore(LLVMGetGlobalPassRegistry());
/* To all available target */
LLVMInitializeAllTargetInfos();
LLVMInitializeAllTargets();
LLVMInitializeAllTargetMCs();
LLVMInitializeAllAsmPrinters();
LLVMInitializeAllAsmParsers();
/* Allocate memory */
if (!(comp_ctx = wasm_runtime_malloc(sizeof(AOTCompContext)))) {
aot_set_last_error("allocate memory failed.");
@ -2031,8 +2050,6 @@ aot_destroy_comp_context(AOTCompContext *comp_ctx)
if (comp_ctx->orc_jit)
LLVMOrcDisposeLLLazyJIT(comp_ctx->orc_jit);
LLVMShutdown();
if (comp_ctx->func_ctxes)
aot_destroy_func_contexts(comp_ctx->func_ctxes,
comp_ctx->func_ctx_count);

View File

@ -408,6 +408,12 @@ typedef struct AOTCompOption {
uint32 custom_sections_count;
} AOTCompOption, *aot_comp_option_t;
bool
aot_compiler_init(void);
void
aot_compiler_destroy(void);
AOTCompContext *
aot_create_comp_context(AOTCompData *comp_data, aot_comp_option_t option);