Fix missing stack frame alloc/free in AOT multi-module invoke (#3562)

Fix #3545 and update the build configuration for multi-module sample:
- pass debug to AOT-compiled modules
- support optional DUMP_CALL_STACK 
- support optional GC
This commit is contained in:
Xenia Lu
2024-06-24 13:56:11 +08:00
committed by GitHub
parent d36160b294
commit 54b87cb097
3 changed files with 32 additions and 3 deletions

View File

@ -2883,10 +2883,24 @@ aot_invoke_native(WASMExecEnv *exec_env, uint32 func_idx, uint32 argc,
"create singleton exec_env failed"); "create singleton exec_env failed");
goto fail; goto fail;
} }
#if WASM_ENABLE_AOT_STACK_FRAME != 0
struct WASMInterpFrame *prev_frame = exec_env->cur_frame;
if (!aot_alloc_frame(exec_env, func_idx)) {
goto fail;
}
#endif #endif
#endif /* WASM_ENABLE_MULTI_MODULE != 0 */
ret = ret =
wasm_runtime_invoke_native(exec_env, func_ptr, func_type, signature, wasm_runtime_invoke_native(exec_env, func_ptr, func_type, signature,
attachment, argv, argc, argv); attachment, argv, argc, argv);
#if WASM_ENABLE_MULTI_MODULE != 0 && WASM_ENABLE_AOT_STACK_FRAME != 0
/* Free all frames allocated, note that some frames
may be allocated in AOT code and haven't been
freed if exception occurred */
while (exec_env->cur_frame != prev_frame)
aot_free_frame(exec_env);
#endif
} }
else { else {
signature = import_func->signature; signature = import_func->signature;

View File

@ -49,6 +49,12 @@ endif ()
if (NOT DEFINED WAMR_BUILD_JIT) if (NOT DEFINED WAMR_BUILD_JIT)
set(WAMR_BUILD_JIT 0) set(WAMR_BUILD_JIT 0)
endif () endif ()
if (NOT DEFINED WAMR_BUILD_DUMP_CALL_STACK)
set(WAMR_BUILD_DUMP_CALL_STACK 0)
endif ()
if (NOT DEFINED WAMR_BUILD_GC)
set(WAMR_BUILD_GC 0)
endif ()
set(WAMR_BUILD_SIMD 1) set(WAMR_BUILD_SIMD 1)
set(WAMR_BUILD_REF_TYPES 1) set(WAMR_BUILD_REF_TYPES 1)
set(WAMR_BUILD_LIBC_BUILTIN 1) set(WAMR_BUILD_LIBC_BUILTIN 1)
@ -141,6 +147,7 @@ ExternalProject_Add(WASM_MODULE
-DWASI_SDK_PREFIX=${WASI_SDK_DIR} -DWASI_SDK_PREFIX=${WASI_SDK_DIR}
-DCMAKE_TOOLCHAIN_FILE=${WASI_TOOLCHAIN_FILE} -DCMAKE_TOOLCHAIN_FILE=${WASI_TOOLCHAIN_FILE}
-DCMAKE_SYSROOT=${WASI_SYS_ROOT} -DCMAKE_SYSROOT=${WASI_SYS_ROOT}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-S ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps -S ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps
BUILD_COMMAND ${CMAKE_COMMAND} --build . BUILD_COMMAND ${CMAKE_COMMAND} --build .
INSTALL_COMMAND ${CMAKE_COMMAND} -E copy INSTALL_COMMAND ${CMAKE_COMMAND} -E copy
@ -172,17 +179,24 @@ if (WAMR_BUILD_AOT EQUAL 1)
message(STATUS "WAMR_COMPILER is ${WAMR_COMPILER}") message(STATUS "WAMR_COMPILER is ${WAMR_COMPILER}")
endif() endif()
if (WAMR_BUILD_DUMP_CALL_STACK EQUAL 1)
list(APPEND WAMR_AOT_COMPILE_OPTIONS "--enable-dump-call-stack")
endif ()
if (WAMR_BUILD_GC EQUAL 1)
list(APPEND WAMR_AOT_COMPILE_OPTIONS "--enable-gc")
endif ()
add_custom_target( add_custom_target(
wasm_to_aot wasm_to_aot
ALL ALL
DEPENDS DEPENDS
WASM_MODULE ${WAMR_COMPILER} WASM_MODULE ${WAMR_COMPILER}
COMMAND COMMAND
${WAMR_COMPILER} -o mA.aot ./mA.wasm ${WAMR_COMPILER} ${WAMR_AOT_COMPILE_OPTIONS} -o mA.aot ./mA.wasm
COMMAND COMMAND
${WAMR_COMPILER} -o mB.aot ./mB.wasm ${WAMR_COMPILER} ${WAMR_AOT_COMPILE_OPTIONS} -o mB.aot ./mB.wasm
COMMAND COMMAND
${WAMR_COMPILER} -o mC.aot ./mC.wasm ${WAMR_COMPILER} ${WAMR_AOT_COMPILE_OPTIONS} -o mC.aot ./mC.wasm
WORKING_DIRECTORY WORKING_DIRECTORY
${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}
) )

View File

@ -57,6 +57,7 @@ function(COMPILE_WITH_CLANG SOURCE_FILE COMMAND)
add_executable(${MAIN_TARGET_NAME} ${SOURCE_FILE}) add_executable(${MAIN_TARGET_NAME} ${SOURCE_FILE})
set_target_properties(${MAIN_TARGET_NAME} PROPERTIES OUTPUT_NAME ${WASM_MODULE}) set_target_properties(${MAIN_TARGET_NAME} PROPERTIES OUTPUT_NAME ${WASM_MODULE})
target_compile_options (${MAIN_TARGET_NAME} PRIVATE -fno-exceptions)
if(${COMMAND}) if(${COMMAND})
message(STATUS "Generating ${WASM_MODULE} as COMMAND...") message(STATUS "Generating ${WASM_MODULE} as COMMAND...")