Просмотр исходного кода

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
Xenia Lu 1 год назад
Родитель
Сommit
54b87cb097

+ 14 - 0
core/iwasm/aot/aot_runtime.c

@@ -2883,10 +2883,24 @@ aot_invoke_native(WASMExecEnv *exec_env, uint32 func_idx, uint32 argc,
                                        "create singleton exec_env failed");
             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 /* WASM_ENABLE_MULTI_MODULE != 0 */
         ret =
             wasm_runtime_invoke_native(exec_env, func_ptr, func_type, signature,
                                        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 {
         signature = import_func->signature;

+ 17 - 3
samples/multi-module/CMakeLists.txt

@@ -49,6 +49,12 @@ endif ()
 if (NOT DEFINED WAMR_BUILD_JIT)
   set(WAMR_BUILD_JIT 0)
 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_REF_TYPES 1)
 set(WAMR_BUILD_LIBC_BUILTIN 1)
@@ -141,6 +147,7 @@ ExternalProject_Add(WASM_MODULE
                        -DWASI_SDK_PREFIX=${WASI_SDK_DIR}
                        -DCMAKE_TOOLCHAIN_FILE=${WASI_TOOLCHAIN_FILE}
                        -DCMAKE_SYSROOT=${WASI_SYS_ROOT}
+                       -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
                        -S ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps
   BUILD_COMMAND      ${CMAKE_COMMAND} --build .
   INSTALL_COMMAND    ${CMAKE_COMMAND} -E copy
@@ -172,17 +179,24 @@ if (WAMR_BUILD_AOT EQUAL 1)
     message(STATUS "WAMR_COMPILER is ${WAMR_COMPILER}")
   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(
     wasm_to_aot
     ALL
     DEPENDS
     WASM_MODULE ${WAMR_COMPILER}
     COMMAND
-    ${WAMR_COMPILER} -o mA.aot ./mA.wasm
+    ${WAMR_COMPILER} ${WAMR_AOT_COMPILE_OPTIONS} -o mA.aot ./mA.wasm
     COMMAND
-    ${WAMR_COMPILER} -o mB.aot ./mB.wasm
+    ${WAMR_COMPILER} ${WAMR_AOT_COMPILE_OPTIONS} -o mB.aot ./mB.wasm
     COMMAND
-    ${WAMR_COMPILER} -o mC.aot ./mC.wasm
+    ${WAMR_COMPILER} ${WAMR_AOT_COMPILE_OPTIONS} -o mC.aot ./mC.wasm
     WORKING_DIRECTORY
     ${CMAKE_BINARY_DIR}
   )

+ 1 - 0
samples/multi-module/wasm-apps/CMakeLists.txt

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