mirror of
				https://github.com/bytecodealliance/wasm-micro-runtime.git
				synced 2025-10-30 21:02:27 +00:00 
			
		
		
		
	Merge branch main into dev/dynamic_linking
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				compilation on android, ubuntu-22.04 / build_llvm_libraries_on_ubuntu_2204 (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_llvm_libraries_on_intel_macos (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_llvm_libraries_on_arm_macos (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm/rp2040/raspberrypi-pico/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm/rp2040/raspberrypi-pico/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm/rp2040/raspberrypi-pico/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_BUILTIN) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm/rp2040/raspberrypi-pico/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm/rp2040/raspberrypi-pico/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm/rp2040/raspberrypi-pico/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm/rp2040/raspberrypi-pico/configs/nsh, CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm/rp2040/raspberrypi-pico/configs/nsh, CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm/stm32h7/nucleo-h743zi/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm/stm32h7/nucleo-h743zi/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm/stm32h7/nucleo-h743zi/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_BUILTIN) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm/stm32h7/nucleo-h743zi/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm/stm32h7/nucleo-h743zi/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm/stm32h7/nucleo-h743zi/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm/stm32h7/nucleo-h743zi/configs/nsh, CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm/stm32h7/nucleo-h743zi/configs/nsh, CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm64/qemu/qemu-armv8a/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm64/qemu/qemu-armv8a/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm64/qemu/qemu-armv8a/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_BUILTIN) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm64/qemu/qemu-armv8a/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm64/qemu/qemu-armv8a/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm64/qemu/qemu-armv8a/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm64/qemu/qemu-armv8a/configs/nsh, CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/arm64/qemu/qemu-armv8a/configs/nsh, CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_BUILTIN) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh, CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh, CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh64, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh64, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh64, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_BUILTIN) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh64, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh64, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh64, CONFIG_INTERPRETERS_WAMR_AOT) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh64, CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh64, CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/sim/sim/sim/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/sim/sim/sim/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/sim/sim/sim/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_BUILTIN) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/sim/sim/sim/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/sim/sim/sim/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/sim/sim/sim/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/sim/sim/sim/configs/nsh, CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			
		
			
				
	
				compilation on nuttx / build_iwasm_on_nuttx (boards/sim/sim/sim/configs/nsh, CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_llvm_libraries (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_DUMP_CALL_STACK=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_DUMP_CALL_STACK=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_DUMP_CALL_STACK=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_DUMP_CALL_STACK=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_LIB_PTHREAD=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_LIB_PTHREAD=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_LIB_PTHREAD=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_LIB_PTHREAD=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_LIB_WASI_THREADS=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_LIB_WASI_THREADS=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_LIB_WASI_THREADS=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_LIB_WASI_THREADS=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_MEMORY_PROFILING=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_MEMORY_PROFILING=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_MEMORY_PROFILING=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_MEMORY_PROFILING=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_MINI_LOADER=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_MINI_LOADER=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_MINI_LOADER=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_MULTI_MODULE=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_MULTI_MODULE=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_MULTI_MODULE=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_MULTI_MODULE=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_PERF_PROFILING=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_PERF_PROFILING=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_PERF_PROFILING=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_PERF_PROFILING=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_REF_TYPES=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_REF_TYPES=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_REF_TYPES=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_REF_TYPES=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_SGX_IPFS=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_SGX_IPFS=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_SGX_IPFS=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_SGX_IPFS=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_TAIL_CALL=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_TAIL_CALL=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_TAIL_CALL=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_BUILD_TAIL_CALL=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_DISABLE_HW_BOUND_CHECK=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_DISABLE_HW_BOUND_CHECK=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_DISABLE_HW_BOUND_CHECK=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / build_iwasm (-DWAMR_DISABLE_HW_BOUND_CHECK=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / build (-DWAMR_BUILD_AOT=0) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / build (-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_INTERP=0) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / build (-DWAMR_BUILD_CUSTOM_NAME_SECTION=1) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / build (-DWAMR_BUILD_DEBUG_INTERP=1) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / build (-DWAMR_BUILD_LIBC_UVWASI=0 -DWAMR_BUILD_LIBC_WASI=1) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / build (-DWAMR_BUILD_LIB_PTHREAD=1) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / build (-DWAMR_BUILD_LIB_WASI_THREADS=1) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / build (-DWAMR_BUILD_REF_TYPES=1) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / build (-DWAMR_BUILD_SIMD=1) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / build (-DWAMR_BUILD_TAIL_CALL=1) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / build (-DWAMR_DISABLE_HW_BOUND_CHECK=1) (push) Has been cancelled
				
			
		
			
				
	
				hadolint dockerfiles / run-hadolint-on-dockerfiles (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_wamrc (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DEBUG_AOT=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DEBUG_AOT=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DEBUG_INTERP=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DEBUG_INTERP=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY64=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY64=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MINI_LOADER=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MINI_LOADER=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MINI_LOADER=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MINI_LOADER=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MEMORY=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MEMORY=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_unit_tests (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-s… (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_samples_wasm_c_api (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, $AOT_BUILD_OPTIONS, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAssembly/wasi-… (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_samples_wasm_c_api (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAss… (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_samples_wasm_c_api (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAssemb… (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_samples_wasm_c_api (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAssembly/… (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_samples_wasm_c_api (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAss… (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_samples_wasm_c_api (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAsse… (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_samples_wasm_c_api (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAss… (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / build_samples_others (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAssembly/wasi-sdk/releases/download/wa… (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, aot, $DEFAULT_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, aot, $GC_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, aot, $MEMORY64_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, aot, $MULTI_MODULES_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, aot, $SIMD_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, aot, $THREADS_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, aot, $WAMR_COMPILER_TEST_OPTIONS) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, aot, $WASI_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, classic-interp, $DEFAULT_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, classic-interp, $GC_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, classic-interp, $MEMORY64_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, classic-interp, $MULTI_MEMORY_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, classic-interp, $MULTI_MODULES_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, classic-interp, $THREADS_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, classic-interp, $WASI_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, fast-interp, $DEFAULT_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, fast-interp, $GC_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, fast-interp, $MULTI_MODULES_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, fast-interp, $THREADS_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, fast-interp, $WASI_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, fast-jit, $DEFAULT_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, fast-jit, $THREADS_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, fast-jit, $WASI_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, jit, $DEFAULT_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, jit, $GC_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, jit, $SIMD_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, jit, $THREADS_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, jit, $WASI_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, multi-tier-jit, $DEFAULT_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, multi-tier-jit, $THREADS_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, multi-tier-jit, $WASI_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on android, ubuntu-22.04 / test-wamr-ide (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_wamrc (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, macos-13) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_DEBUG_INTERP=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MINI_LOADER=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MINI_LOADER=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_samples_wasm_c_api ($CLASSIC_INTERP_BUILD_OPTIONS, macos-13, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-macos-12.tar.gz, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-macos.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_samples_wasm_c_api ($FAST_INTERP_BUILD_OPTIONS, macos-13, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-macos-12.tar.gz, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-macos.tar.gz) (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_samples_others (${{ needs.build_llvm_libraries_on_arm_macos.outputs.cache_key }}, macos-14, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-macos-12.tar.gz, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-s… (push) Has been cancelled
				
			
		
			
				
	
				compilation on macos / build_samples_others (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, macos-13, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-macos-12.tar.gz, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi… (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / run_samples_file (-DWAMR_BUILD_SGX_IPFS=1, $AOT_BUILD_OPTIONS, ${{ needs.build_llvm_libraries.outputs.cache_key }}, ubuntu-20.04, linux-sgx, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebA… (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / run_samples_file (-DWAMR_BUILD_SGX_IPFS=1, $CLASSIC_INTERP_BUILD_OPTIONS, ${{ needs.build_llvm_libraries.outputs.cache_key }}, ubuntu-20.04, linux-sgx, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://gith… (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / run_samples_file (-DWAMR_BUILD_SGX_IPFS=1, $FAST_INTERP_BUILD_OPTIONS, ${{ needs.build_llvm_libraries.outputs.cache_key }}, ubuntu-20.04, linux-sgx, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.… (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / run_samples_file (-DWAMR_BUILD_SGX_IPFS=1, $FAST_JIT_BUILD_OPTIONS, ${{ needs.build_llvm_libraries.outputs.cache_key }}, ubuntu-20.04, linux-sgx, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com… (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / spec_test_default (${{ needs.build_llvm_libraries.outputs.cache_key }}, aot, -x -p -s spec -P) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / spec_test_default (${{ needs.build_llvm_libraries.outputs.cache_key }}, aot, -x -p -s spec -S -P) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / spec_test_default (${{ needs.build_llvm_libraries.outputs.cache_key }}, aot, -x -p -s spec -X -P) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / spec_test_default (${{ needs.build_llvm_libraries.outputs.cache_key }}, classic-interp, -x -p -s spec -P) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / spec_test_default (${{ needs.build_llvm_libraries.outputs.cache_key }}, fast-interp, -x -p -s spec -P) (push) Has been cancelled
				
			
		
			
				
	
				compilation on SGX / spec_test_default (${{ needs.build_llvm_libraries.outputs.cache_key }}, fast-jit, -x -p -s spec -P) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / test (classic-interp, $DEFAULT_TEST_OPTIONS) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / test (classic-interp, $MULTI_MODULES_TEST_OPTIONS) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / test (classic-interp, $THREADS_TEST_OPTIONS) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / test (classic-interp, $WASI_TEST_OPTIONS) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / test (fast-interp, $DEFAULT_TEST_OPTIONS) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / test (fast-interp, $MULTI_MODULES_TEST_OPTIONS) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / test (fast-interp, $THREADS_TEST_OPTIONS) (push) Has been cancelled
				
			
		
			
				
	
				compilation on windows-latest / test (fast-interp, $WASI_TEST_OPTIONS) (push) Has been cancelled
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	compilation on android, ubuntu-22.04 / build_llvm_libraries_on_ubuntu_2204 (push) Has been cancelled
				
			compilation on macos / build_llvm_libraries_on_intel_macos (push) Has been cancelled
				
			compilation on macos / build_llvm_libraries_on_arm_macos (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm/rp2040/raspberrypi-pico/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm/rp2040/raspberrypi-pico/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm/rp2040/raspberrypi-pico/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_BUILTIN) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm/rp2040/raspberrypi-pico/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm/rp2040/raspberrypi-pico/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm/rp2040/raspberrypi-pico/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm/rp2040/raspberrypi-pico/configs/nsh, CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm/rp2040/raspberrypi-pico/configs/nsh, CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm/stm32h7/nucleo-h743zi/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm/stm32h7/nucleo-h743zi/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm/stm32h7/nucleo-h743zi/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_BUILTIN) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm/stm32h7/nucleo-h743zi/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm/stm32h7/nucleo-h743zi/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm/stm32h7/nucleo-h743zi/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm/stm32h7/nucleo-h743zi/configs/nsh, CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm/stm32h7/nucleo-h743zi/configs/nsh, CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm64/qemu/qemu-armv8a/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm64/qemu/qemu-armv8a/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm64/qemu/qemu-armv8a/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_BUILTIN) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm64/qemu/qemu-armv8a/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm64/qemu/qemu-armv8a/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm64/qemu/qemu-armv8a/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm64/qemu/qemu-armv8a/configs/nsh, CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/arm64/qemu/qemu-armv8a/configs/nsh, CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_BUILTIN) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh, CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh, CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh64, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh64, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh64, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_BUILTIN) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh64, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh64, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh64, CONFIG_INTERPRETERS_WAMR_AOT) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh64, CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/risc-v/qemu-rv/rv-virt/configs/nsh64, CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/sim/sim/sim/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/sim/sim/sim/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/sim/sim/sim/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_BUILTIN) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/sim/sim/sim/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST CONFIG_INTERPRETERS_WAMR_LIBC_WASI) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/sim/sim/sim/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/sim/sim/sim/configs/nsh, CONFIG_INTERPRETERS_WAMR_AOT) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/sim/sim/sim/configs/nsh, CONFIG_INTERPRETERS_WAMR_CLASSIC) (push) Has been cancelled
				
			compilation on nuttx / build_iwasm_on_nuttx (boards/sim/sim/sim/configs/nsh, CONFIG_INTERPRETERS_WAMR_FAST) (push) Has been cancelled
				
			compilation on SGX / build_llvm_libraries (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_DUMP_CALL_STACK=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_DUMP_CALL_STACK=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_DUMP_CALL_STACK=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_DUMP_CALL_STACK=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_LIB_PTHREAD=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_LIB_PTHREAD=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_LIB_PTHREAD=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_LIB_PTHREAD=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_LIB_WASI_THREADS=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_LIB_WASI_THREADS=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_LIB_WASI_THREADS=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_LIB_WASI_THREADS=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_MEMORY_PROFILING=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_MEMORY_PROFILING=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_MEMORY_PROFILING=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_MEMORY_PROFILING=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_MINI_LOADER=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_MINI_LOADER=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_MINI_LOADER=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_MULTI_MODULE=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_MULTI_MODULE=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_MULTI_MODULE=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_MULTI_MODULE=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_PERF_PROFILING=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_PERF_PROFILING=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_PERF_PROFILING=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_PERF_PROFILING=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_REF_TYPES=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_REF_TYPES=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_REF_TYPES=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_REF_TYPES=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_SGX_IPFS=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_SGX_IPFS=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_SGX_IPFS=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_SGX_IPFS=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_TAIL_CALL=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_TAIL_CALL=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_TAIL_CALL=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_BUILD_TAIL_CALL=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_DISABLE_HW_BOUND_CHECK=1, $AOT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_DISABLE_HW_BOUND_CHECK=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_DISABLE_HW_BOUND_CHECK=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on SGX / build_iwasm (-DWAMR_DISABLE_HW_BOUND_CHECK=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-20.04, linux-sgx) (push) Has been cancelled
				
			compilation on windows-latest / build (-DWAMR_BUILD_AOT=0) (push) Has been cancelled
				
			compilation on windows-latest / build (-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_INTERP=0) (push) Has been cancelled
				
			compilation on windows-latest / build (-DWAMR_BUILD_CUSTOM_NAME_SECTION=1) (push) Has been cancelled
				
			compilation on windows-latest / build (-DWAMR_BUILD_DEBUG_INTERP=1) (push) Has been cancelled
				
			compilation on windows-latest / build (-DWAMR_BUILD_LIBC_UVWASI=0 -DWAMR_BUILD_LIBC_WASI=1) (push) Has been cancelled
				
			compilation on windows-latest / build (-DWAMR_BUILD_LIB_PTHREAD=1) (push) Has been cancelled
				
			compilation on windows-latest / build (-DWAMR_BUILD_LIB_WASI_THREADS=1) (push) Has been cancelled
				
			compilation on windows-latest / build (-DWAMR_BUILD_REF_TYPES=1) (push) Has been cancelled
				
			compilation on windows-latest / build (-DWAMR_BUILD_SIMD=1) (push) Has been cancelled
				
			compilation on windows-latest / build (-DWAMR_BUILD_TAIL_CALL=1) (push) Has been cancelled
				
			compilation on windows-latest / build (-DWAMR_DISABLE_HW_BOUND_CHECK=1) (push) Has been cancelled
				
			hadolint dockerfiles / run-hadolint-on-dockerfiles (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_wamrc (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DEBUG_AOT=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DEBUG_AOT=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DEBUG_INTERP=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DEBUG_INTERP=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY64=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY64=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MINI_LOADER=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MINI_LOADER=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MINI_LOADER=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MINI_LOADER=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MEMORY=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MEMORY=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $AOT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, android) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_iwasm (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, linux) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_unit_tests (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-s… (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_samples_wasm_c_api (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, $AOT_BUILD_OPTIONS, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAssembly/wasi-… (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_samples_wasm_c_api (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, $CLASSIC_INTERP_BUILD_OPTIONS, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAss… (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_samples_wasm_c_api (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, $FAST_INTERP_BUILD_OPTIONS, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAssemb… (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_samples_wasm_c_api (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, $FAST_JIT_BUILD_OPTIONS, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAssembly/… (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_samples_wasm_c_api (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, $LLVM_EAGER_JIT_BUILD_OPTIONS, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAss… (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_samples_wasm_c_api (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, $LLVM_LAZY_JIT_BUILD_OPTIONS, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAsse… (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_samples_wasm_c_api (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, $MULTI_TIER_JIT_BUILD_OPTIONS, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAss… (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / build_samples_others (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebAssembly/wasi-sdk/releases/download/wa… (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, aot, $DEFAULT_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, aot, $GC_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, aot, $MEMORY64_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, aot, $MULTI_MODULES_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, aot, $SIMD_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, aot, $THREADS_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, aot, $WAMR_COMPILER_TEST_OPTIONS) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, aot, $WASI_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, classic-interp, $DEFAULT_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, classic-interp, $GC_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, classic-interp, $MEMORY64_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, classic-interp, $MULTI_MEMORY_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, classic-interp, $MULTI_MODULES_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, classic-interp, $THREADS_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, classic-interp, $WASI_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, fast-interp, $DEFAULT_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, fast-interp, $GC_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, fast-interp, $MULTI_MODULES_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, fast-interp, $THREADS_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, fast-interp, $WASI_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, fast-jit, $DEFAULT_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, fast-jit, $THREADS_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, fast-jit, $WASI_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, jit, $DEFAULT_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, jit, $GC_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, jit, $SIMD_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, jit, $THREADS_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, jit, $WASI_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, multi-tier-jit, $DEFAULT_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, multi-tier-jit, $THREADS_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test (${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}, ubuntu-22.04, multi-tier-jit, $WASI_TEST_OPTIONS, 22.04, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz) (push) Has been cancelled
				
			compilation on android, ubuntu-22.04 / test-wamr-ide (push) Has been cancelled
				
			compilation on macos / build_wamrc (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, macos-13) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_CUSTOM_NAME_SECTION=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_DEBUG_INTERP=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_DUMP_CALL_STACK=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_PTHREAD=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LIB_WASI_THREADS=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_LOAD_CUSTOM_SECTION=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MEMORY_PROFILING=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MINI_LOADER=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MINI_LOADER=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_MULTI_MODULE=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_PERF_PROFILING=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_REF_TYPES=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_SIMD=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_BUILD_TAIL_CALL=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $AOT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $CLASSIC_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $FAST_INTERP_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $LLVM_EAGER_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_iwasm (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, -DWAMR_DISABLE_HW_BOUND_CHECK=1, $LLVM_LAZY_JIT_BUILD_OPTIONS, macos-13, darwin) (push) Has been cancelled
				
			compilation on macos / build_samples_wasm_c_api ($CLASSIC_INTERP_BUILD_OPTIONS, macos-13, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-macos-12.tar.gz, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-macos.tar.gz) (push) Has been cancelled
				
			compilation on macos / build_samples_wasm_c_api ($FAST_INTERP_BUILD_OPTIONS, macos-13, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-macos-12.tar.gz, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-macos.tar.gz) (push) Has been cancelled
				
			compilation on macos / build_samples_others (${{ needs.build_llvm_libraries_on_arm_macos.outputs.cache_key }}, macos-14, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-macos-12.tar.gz, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-s… (push) Has been cancelled
				
			compilation on macos / build_samples_others (${{ needs.build_llvm_libraries_on_intel_macos.outputs.cache_key }}, macos-13, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-macos-12.tar.gz, https://github.com/WebAssembly/wasi-sdk/releases/download/wasi… (push) Has been cancelled
				
			compilation on SGX / run_samples_file (-DWAMR_BUILD_SGX_IPFS=1, $AOT_BUILD_OPTIONS, ${{ needs.build_llvm_libraries.outputs.cache_key }}, ubuntu-20.04, linux-sgx, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com/WebA… (push) Has been cancelled
				
			compilation on SGX / run_samples_file (-DWAMR_BUILD_SGX_IPFS=1, $CLASSIC_INTERP_BUILD_OPTIONS, ${{ needs.build_llvm_libraries.outputs.cache_key }}, ubuntu-20.04, linux-sgx, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://gith… (push) Has been cancelled
				
			compilation on SGX / run_samples_file (-DWAMR_BUILD_SGX_IPFS=1, $FAST_INTERP_BUILD_OPTIONS, ${{ needs.build_llvm_libraries.outputs.cache_key }}, ubuntu-20.04, linux-sgx, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.… (push) Has been cancelled
				
			compilation on SGX / run_samples_file (-DWAMR_BUILD_SGX_IPFS=1, $FAST_JIT_BUILD_OPTIONS, ${{ needs.build_llvm_libraries.outputs.cache_key }}, ubuntu-20.04, linux-sgx, https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz, https://github.com… (push) Has been cancelled
				
			compilation on SGX / spec_test_default (${{ needs.build_llvm_libraries.outputs.cache_key }}, aot, -x -p -s spec -P) (push) Has been cancelled
				
			compilation on SGX / spec_test_default (${{ needs.build_llvm_libraries.outputs.cache_key }}, aot, -x -p -s spec -S -P) (push) Has been cancelled
				
			compilation on SGX / spec_test_default (${{ needs.build_llvm_libraries.outputs.cache_key }}, aot, -x -p -s spec -X -P) (push) Has been cancelled
				
			compilation on SGX / spec_test_default (${{ needs.build_llvm_libraries.outputs.cache_key }}, classic-interp, -x -p -s spec -P) (push) Has been cancelled
				
			compilation on SGX / spec_test_default (${{ needs.build_llvm_libraries.outputs.cache_key }}, fast-interp, -x -p -s spec -P) (push) Has been cancelled
				
			compilation on SGX / spec_test_default (${{ needs.build_llvm_libraries.outputs.cache_key }}, fast-jit, -x -p -s spec -P) (push) Has been cancelled
				
			compilation on windows-latest / test (classic-interp, $DEFAULT_TEST_OPTIONS) (push) Has been cancelled
				
			compilation on windows-latest / test (classic-interp, $MULTI_MODULES_TEST_OPTIONS) (push) Has been cancelled
				
			compilation on windows-latest / test (classic-interp, $THREADS_TEST_OPTIONS) (push) Has been cancelled
				
			compilation on windows-latest / test (classic-interp, $WASI_TEST_OPTIONS) (push) Has been cancelled
				
			compilation on windows-latest / test (fast-interp, $DEFAULT_TEST_OPTIONS) (push) Has been cancelled
				
			compilation on windows-latest / test (fast-interp, $MULTI_MODULES_TEST_OPTIONS) (push) Has been cancelled
				
			compilation on windows-latest / test (fast-interp, $THREADS_TEST_OPTIONS) (push) Has been cancelled
				
			compilation on windows-latest / test (fast-interp, $WASI_TEST_OPTIONS) (push) Has been cancelled
				
			This commit is contained in:
		
						commit
						ec7804cff1
					
				
							
								
								
									
										30
									
								
								.github/scripts/codeql_buildscript.sh
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								.github/scripts/codeql_buildscript.sh
									
									
									
									
										vendored
									
									
								
							|  | @ -126,6 +126,16 @@ if [[ $? != 0 ]]; then | ||||||
|     exit 1; |     exit 1; | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
|  | # build iwasm with multi-memory enabled | ||||||
|  | cd ${WAMR_DIR}/product-mini/platforms/linux | ||||||
|  | rm -rf build && mkdir build && cd build | ||||||
|  | cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_MULTI_MEMORY=1 | ||||||
|  | make -j | ||||||
|  | if [[ $? != 0 ]]; then | ||||||
|  |     echo "Failed to build iwasm with multi-memory enabled!" | ||||||
|  |     exit 1; | ||||||
|  | fi | ||||||
|  | 
 | ||||||
| # build iwasm with hardware boundary check disabled | # build iwasm with hardware boundary check disabled | ||||||
| cd ${WAMR_DIR}/product-mini/platforms/linux | cd ${WAMR_DIR}/product-mini/platforms/linux | ||||||
| rm -rf build && mkdir build && cd build | rm -rf build && mkdir build && cd build | ||||||
|  | @ -280,3 +290,23 @@ if [[ $? != 0 ]]; then | ||||||
|     echo "Failed to build iwasm with linux perf support enabled!" |     echo "Failed to build iwasm with linux perf support enabled!" | ||||||
|     exit 1; |     exit 1; | ||||||
| fi | fi | ||||||
|  | 
 | ||||||
|  | # build iwasm with shared heap enabled | ||||||
|  | cd ${WAMR_DIR}/product-mini/platforms/linux | ||||||
|  | rm -rf build && mkdir build && cd build | ||||||
|  | cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_SHARED_HEAP=1 | ||||||
|  | make -j | ||||||
|  | if [[ $? != 0 ]]; then | ||||||
|  |     echo "Failed to build iwasm with shared heap enabled!" | ||||||
|  |     exit 1; | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # build iwasm with dynamic aot debug enabled | ||||||
|  | cd ${WAMR_DIR}/product-mini/platforms/linux | ||||||
|  | rm -rf build && mkdir build && cd build | ||||||
|  | cmake .. -DCMAKE_BUILD_TYPE=Debug -DWAMR_BUILD_DYNAMIC_AOT_DEBUG=1 | ||||||
|  | make -j | ||||||
|  | if [[ $? != 0 ]]; then | ||||||
|  |     echo "Failed to build iwasm dynamic aot debug enabled!" | ||||||
|  |     exit 1; | ||||||
|  | fi | ||||||
|  |  | ||||||
							
								
								
									
										5
									
								
								.github/workflows/build_docker_images.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.github/workflows/build_docker_images.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -15,9 +15,14 @@ on: | ||||||
|         type: string |         type: string | ||||||
|         required: true |         required: true | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   build-and-push-images: |   build-and-push-images: | ||||||
|     runs-on: ubuntu-22.04 |     runs-on: ubuntu-22.04 | ||||||
|  |     permissions: | ||||||
|  |       contents: write # for uploading release artifacts | ||||||
| 
 | 
 | ||||||
|     steps: |     steps: | ||||||
|       - name: Checkout repository |       - name: Checkout repository | ||||||
|  |  | ||||||
							
								
								
									
										116
									
								
								.github/workflows/build_iwasm_release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										116
									
								
								.github/workflows/build_iwasm_release.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -31,29 +31,9 @@ on: | ||||||
|         type: string |         type: string | ||||||
|         required: false |         required: false | ||||||
| 
 | 
 | ||||||
| jobs: | env: | ||||||
|   build: |   DEFAULT_BUILD_OPTIONS:  | ||||||
|     runs-on: ${{ inputs.runner }} |     "-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_FAST_JIT=1 -DWAMR_BUILD_JIT=1 \ | ||||||
|     steps: |  | ||||||
|       - uses: actions/checkout@v4 |  | ||||||
| 
 |  | ||||||
|       - name: get cached LLVM libraries |  | ||||||
|         id: retrieve_llvm_libs |  | ||||||
|         uses: actions/cache@v4 |  | ||||||
|         with: |  | ||||||
|           path: | |  | ||||||
|             ./core/deps/llvm/build/bin |  | ||||||
|             ./core/deps/llvm/build/include |  | ||||||
|             ./core/deps/llvm/build/lib |  | ||||||
|             ./core/deps/llvm/build/libexec |  | ||||||
|             ./core/deps/llvm/build/share |  | ||||||
|           key: ${{ inputs.llvm_cache_key }} |  | ||||||
|           fail-on-cache-miss: true |  | ||||||
| 
 |  | ||||||
|       - name: generate iwasm binary release |  | ||||||
|         run: | |  | ||||||
|           cmake -S . -B build \ |  | ||||||
|             -DWAMR_BUILD_AOT=1 -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_FAST_JIT=1 -DWAMR_BUILD_JIT=1 \ |  | ||||||
|      -DWAMR_BUILD_CUSTOM_NAME_SECTION=0 \ |      -DWAMR_BUILD_CUSTOM_NAME_SECTION=0 \ | ||||||
|      -DWAMR_BUILD_DEBUG_INTERP=0 \ |      -DWAMR_BUILD_DEBUG_INTERP=0 \ | ||||||
|      -DWAMR_BUILD_DEBUG_AOT=0 \ |      -DWAMR_BUILD_DEBUG_AOT=0 \ | ||||||
|  | @ -77,14 +57,88 @@ jobs: | ||||||
|      -DWAMR_BUILD_SIMD=1 \ |      -DWAMR_BUILD_SIMD=1 \ | ||||||
|      -DWAMR_BUILD_SHARED_MEMORY=1 \ |      -DWAMR_BUILD_SHARED_MEMORY=1 \ | ||||||
|      -DWAMR_BUILD_TAIL_CALL=1 \ |      -DWAMR_BUILD_TAIL_CALL=1 \ | ||||||
|             -DWAMR_BUILD_THREAD_MGR=1 |      -DWAMR_BUILD_THREAD_MGR=1" | ||||||
|  |   GC_EH_BUILD_OPTIONS: | ||||||
|  |     "-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_FAST_INTERP=0 -DWAMR_BUILD_FAST_JIT=0 -DWAMR_BUILD_JIT=0 \ | ||||||
|  |      -DWAMR_BUILD_CUSTOM_NAME_SECTION=0 \ | ||||||
|  |      -DWAMR_BUILD_DEBUG_INTERP=0 \ | ||||||
|  |      -DWAMR_BUILD_DEBUG_AOT=0 \ | ||||||
|  |      -DWAMR_BUILD_DUMP_CALL_STACK=0 \ | ||||||
|  |      -DWAMR_BUILD_LIBC_UVWASI=0 \ | ||||||
|  |      -DWAMR_BUILD_LIBC_EMCC=0 \ | ||||||
|  |      -DWAMR_BUILD_LIB_RATS=0 \ | ||||||
|  |      -DWAMR_BUILD_LOAD_CUSTOM_SECTION=0 \ | ||||||
|  |      -DWAMR_BUILD_MEMORY_PROFILING=0 \ | ||||||
|  |      -DWAMR_BUILD_MINI_LOADER=0 \ | ||||||
|  |      -DWAMR_BUILD_MULTI_MODULE=0 \ | ||||||
|  |      -DWAMR_BUILD_PERF_PROFILING=0 \ | ||||||
|  |      -DWAMR_BUILD_SPEC_TEST=0 \ | ||||||
|  |      -DWAMR_BUILD_BULK_MEMORY=1 \ | ||||||
|  |      -DWAMR_BUILD_LIB_PTHREAD=1 \ | ||||||
|  |      -DWAMR_BUILD_LIB_PTHREAD_SEMAPHORE=1 \ | ||||||
|  |      -DWAMR_BUILD_LIB_WASI_THREADS=1 \ | ||||||
|  |      -DWAMR_BUILD_LIBC_BUILTIN=1 \ | ||||||
|  |      -DWAMR_BUILD_LIBC_WASI=1 \ | ||||||
|  |      -DWAMR_BUILD_REF_TYPES=1 \ | ||||||
|  |      -DWAMR_BUILD_SIMD=1 \ | ||||||
|  |      -DWAMR_BUILD_SHARED_MEMORY=1 \ | ||||||
|  |      -DWAMR_BUILD_TAIL_CALL=1 \ | ||||||
|  |      -DWAMR_BUILD_THREAD_MGR=1 \ | ||||||
|  |      -DWAMR_BUILD_EXCE_HANDLING=1 \ | ||||||
|  |      -DWAMR_BUILD_GC=1" | ||||||
|  | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
|  | jobs: | ||||||
|  |   build: | ||||||
|  |     runs-on: ${{ inputs.runner }} | ||||||
|  |     strategy: | ||||||
|  |       matrix: | ||||||
|  |         include: | ||||||
|  |           - build_options: $DEFAULT_BUILD_OPTIONS | ||||||
|  |             suffix: '' | ||||||
|  |           - build_options: $GC_EH_BUILD_OPTIONS | ||||||
|  |             suffix: '-gc-eh' | ||||||
|  |     permissions: | ||||||
|  |       contents: write # for uploading release artifacts | ||||||
|  | 
 | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/checkout@v4 | ||||||
|  | 
 | ||||||
|  |       - name: get cached LLVM libraries | ||||||
|  |         id: retrieve_llvm_libs | ||||||
|  |         uses: actions/cache@v4 | ||||||
|  |         with: | ||||||
|  |           path: | | ||||||
|  |             ./core/deps/llvm/build/bin | ||||||
|  |             ./core/deps/llvm/build/include | ||||||
|  |             ./core/deps/llvm/build/lib | ||||||
|  |             ./core/deps/llvm/build/libexec | ||||||
|  |             ./core/deps/llvm/build/share | ||||||
|  |           key: ${{ inputs.llvm_cache_key }} | ||||||
|  |           fail-on-cache-miss: true | ||||||
|  | 
 | ||||||
|  |       - name: generate iwasm binary release | ||||||
|  |         shell: bash | ||||||
|  |         run: | | ||||||
|  |           cmake -S . -B build ${{ matrix.build_options }} | ||||||
|           cmake --build build --config Release --parallel 4 |           cmake --build build --config Release --parallel 4 | ||||||
|         working-directory: ${{ inputs.cwd }} |         working-directory: ${{ inputs.cwd }} | ||||||
| 
 | 
 | ||||||
|       - name: compress the binary |       - name: Compress the binary on Windows | ||||||
|  |         if: inputs.runner == 'windows-latest' | ||||||
|         run: | |         run: | | ||||||
|           tar czf iwasm-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz iwasm |           tar -czf iwasm${{ matrix.suffix }}-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz iwasm.exe | ||||||
|           zip iwasm-${{ inputs.ver_num }}-${{ inputs.runner }}.zip iwasm |           Compress-Archive -Path iwasm.exe -DestinationPath iwasm${{ matrix.suffix }}-${{ inputs.ver_num }}-${{ inputs.runner }}.zip | ||||||
|  |           mv iwasm${{ matrix.suffix }}-${{ inputs.ver_num }}-${{ inputs.runner }}.* ../ | ||||||
|  |         working-directory: ${{ inputs.cwd }}/build/Release | ||||||
|  | 
 | ||||||
|  |       - name: compress the binary on non-Windows | ||||||
|  |         if: inputs.runner != 'windows-latest' | ||||||
|  |         run: | | ||||||
|  |           tar czf iwasm${{ matrix.suffix }}-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz iwasm | ||||||
|  |           zip iwasm${{ matrix.suffix }}-${{ inputs.ver_num }}-${{ inputs.runner }}.zip iwasm | ||||||
|         working-directory: ${{ inputs.cwd }}/build |         working-directory: ${{ inputs.cwd }}/build | ||||||
| 
 | 
 | ||||||
|       - name: upload release tar.gz |       - name: upload release tar.gz | ||||||
|  | @ -93,8 +147,8 @@ jobs: | ||||||
|           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||||
|         with: |         with: | ||||||
|           upload_url: ${{ inputs.upload_url }} |           upload_url: ${{ inputs.upload_url }} | ||||||
|           asset_path: ${{ inputs.cwd }}/build/iwasm-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz |           asset_path: ${{ inputs.cwd }}/build/iwasm${{ matrix.suffix }}-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz | ||||||
|           asset_name: iwasm-${{ inputs.ver_num }}-${{ inputs.arch }}-${{ inputs.runner }}.tar.gz |           asset_name: iwasm${{ matrix.suffix }}-${{ inputs.ver_num }}-${{ inputs.arch }}-${{ inputs.runner }}.tar.gz | ||||||
|           asset_content_type: application/x-gzip |           asset_content_type: application/x-gzip | ||||||
| 
 | 
 | ||||||
|       - name: upload release zip |       - name: upload release zip | ||||||
|  | @ -103,6 +157,6 @@ jobs: | ||||||
|           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||||
|         with: |         with: | ||||||
|           upload_url: ${{ inputs.upload_url }} |           upload_url: ${{ inputs.upload_url }} | ||||||
|           asset_path: ${{ inputs.cwd }}/build/iwasm-${{ inputs.ver_num }}-${{ inputs.runner }}.zip |           asset_path: ${{ inputs.cwd }}/build/iwasm${{ matrix.suffix }}-${{ inputs.ver_num }}-${{ inputs.runner }}.zip | ||||||
|           asset_name: iwasm-${{ inputs.ver_num }}-${{ inputs.arch }}-${{ inputs.runner }}.zip |           asset_name: iwasm${{ matrix.suffix }}-${{ inputs.ver_num }}-${{ inputs.arch }}-${{ inputs.runner }}.zip | ||||||
|           asset_content_type: application/zip |           asset_content_type: application/zip | ||||||
|  |  | ||||||
							
								
								
									
										33
									
								
								.github/workflows/build_llvm_libraries.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								.github/workflows/build_llvm_libraries.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -27,6 +27,9 @@ on: | ||||||
|         description: "A cached key of LLVM libraries" |         description: "A cached key of LLVM libraries" | ||||||
|         value: ${{ jobs.build_llvm_libraries.outputs.key}} |         value: ${{ jobs.build_llvm_libraries.outputs.key}} | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   build_llvm_libraries: |   build_llvm_libraries: | ||||||
|     runs-on: ${{ inputs.os }} |     runs-on: ${{ inputs.os }} | ||||||
|  | @ -36,6 +39,9 @@ jobs: | ||||||
|       image: ${{ inputs.container_image }} |       image: ${{ inputs.container_image }} | ||||||
|     outputs: |     outputs: | ||||||
|       key: ${{ steps.create_lib_cache_key.outputs.key}} |       key: ${{ steps.create_lib_cache_key.outputs.key}} | ||||||
|  |     permissions: | ||||||
|  |       contents: read | ||||||
|  |       actions: write # for uploading cached artifact | ||||||
| 
 | 
 | ||||||
|     steps: |     steps: | ||||||
|       - name: checkout |       - name: checkout | ||||||
|  | @ -43,6 +49,7 @@ jobs: | ||||||
| 
 | 
 | ||||||
|       - name: install dependencies for non macos-14 |       - name: install dependencies for non macos-14 | ||||||
|         if: inputs.os != 'macos-14' |         if: inputs.os != 'macos-14' | ||||||
|  |         shell: bash | ||||||
|         run: /usr/bin/env python3 -m pip install -r requirements.txt |         run: /usr/bin/env python3 -m pip install -r requirements.txt | ||||||
|         working-directory: build-scripts |         working-directory: build-scripts | ||||||
| 
 | 
 | ||||||
|  | @ -51,10 +58,13 @@ jobs: | ||||||
|         run: /usr/bin/env python3 -m pip install -r requirements.txt --break-system-packages |         run: /usr/bin/env python3 -m pip install -r requirements.txt --break-system-packages | ||||||
|         working-directory: build-scripts |         working-directory: build-scripts | ||||||
| 
 | 
 | ||||||
|       - name: retrieve the last commit ID |       - name: Retrieve the last commit ID | ||||||
|         id: get_last_commit |         id: get_last_commit | ||||||
|         run: echo "last_commit=$(GH_TOKEN=${{ secrets.GITHUB_TOKEN }} /usr/bin/env python3 ./build_llvm.py ${{ inputs.extra_build_llvm_options }} --llvm-ver)" >> $GITHUB_OUTPUT |         env: | ||||||
|         working-directory: build-scripts |           GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||||
|  |         shell: bash | ||||||
|  |         run: | | ||||||
|  |           echo "last_commit=$(GH_TOKEN=${{ secrets.GITHUB_TOKEN }} /usr/bin/env python3 ./build_llvm.py ${{ inputs.extra_build_llvm_options }} --llvm-ver)" >> $GITHUB_OUTPUT | ||||||
| 
 | 
 | ||||||
|       # Bump the prefix number to evict all previous caches and |       # Bump the prefix number to evict all previous caches and | ||||||
|       # enforce a clean build, in the unlikely case that some |       # enforce a clean build, in the unlikely case that some | ||||||
|  | @ -62,7 +72,9 @@ jobs: | ||||||
|       # suspect. |       # suspect. | ||||||
|       - name: form the cache key of libraries |       - name: form the cache key of libraries | ||||||
|         id: create_lib_cache_key |         id: create_lib_cache_key | ||||||
|         run: echo "key=0-llvm-libraries-${{ inputs.os }}-${{ inputs.arch }}-${{ steps.get_last_commit.outputs.last_commit }}${{ inputs.cache_key_suffix }}" >> $GITHUB_OUTPUT |         shell: bash | ||||||
|  |         run: | | ||||||
|  |           echo "key=0-llvm-libraries-${{ inputs.os }}-${{ inputs.arch }}-${{ steps.get_last_commit.outputs.last_commit }}${{ inputs.cache_key_suffix }}" >> $GITHUB_OUTPUT | ||||||
| 
 | 
 | ||||||
|       - name: Cache LLVM libraries |       - name: Cache LLVM libraries | ||||||
|         id: retrieve_llvm_libs |         id: retrieve_llvm_libs | ||||||
|  | @ -107,7 +119,20 @@ jobs: | ||||||
|       - run: brew install ccache ninja |       - run: brew install ccache ninja | ||||||
|         if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && startsWith(inputs.os, 'macos') |         if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && startsWith(inputs.os, 'macos') | ||||||
| 
 | 
 | ||||||
|  |       - uses: actions/cache@v4 | ||||||
|  |         with: | ||||||
|  |           path: ~/.cache/ccache | ||||||
|  |           key: 0-ccache-${{ inputs.os }}-${{ steps.get_last_commit.outputs.last_commit }} | ||||||
|  |           restore-keys: | | ||||||
|  |             0-ccache-${{ inputs.os }} | ||||||
|  |         if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && inputs.os == 'windows-latest' | ||||||
|  | 
 | ||||||
|  |       # Install tools on Windows | ||||||
|  |       - run: choco install -y ccache ninja | ||||||
|  |         if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && inputs.os == 'windows-latest' | ||||||
|  | 
 | ||||||
|       - name: Build LLVM libraries |       - name: Build LLVM libraries | ||||||
|         if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' |         if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' | ||||||
|  |         shell: bash | ||||||
|         run: /usr/bin/env python3 ./build_llvm.py ${{ inputs.extra_build_llvm_options }} --arch ${{ inputs.arch }} |         run: /usr/bin/env python3 ./build_llvm.py ${{ inputs.extra_build_llvm_options }} --arch ${{ inputs.arch }} | ||||||
|         working-directory: build-scripts |         working-directory: build-scripts | ||||||
|  |  | ||||||
							
								
								
									
										8
									
								
								.github/workflows/build_wamr_lldb.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/build_wamr_lldb.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -28,8 +28,13 @@ on: | ||||||
|         required: false |         required: false | ||||||
|         default: "https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz" |         default: "https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz" | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   try_reuse: |   try_reuse: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # for uploading release artifacts | ||||||
|     uses: ./.github/workflows/reuse_latest_release_binaries.yml |     uses: ./.github/workflows/reuse_latest_release_binaries.yml | ||||||
|     with: |     with: | ||||||
|       binary_name_stem: "wamr-lldb-${{ inputs.ver_num }}-${{ inputs.arch }}-${{ inputs.runner }}" |       binary_name_stem: "wamr-lldb-${{ inputs.ver_num }}-${{ inputs.arch }}-${{ inputs.runner }}" | ||||||
|  | @ -46,6 +51,9 @@ jobs: | ||||||
|       PYTHON_VERSION: '3.10' |       PYTHON_VERSION: '3.10' | ||||||
|       PYTHON_UBUNTU_STANDALONE_BUILD: https://github.com/indygreg/python-build-standalone/releases/download/20230507/cpython-3.10.11+20230507-x86_64-unknown-linux-gnu-install_only.tar.gz |       PYTHON_UBUNTU_STANDALONE_BUILD: https://github.com/indygreg/python-build-standalone/releases/download/20230507/cpython-3.10.11+20230507-x86_64-unknown-linux-gnu-install_only.tar.gz | ||||||
|       PYTHON_MACOS_STANDALONE_BUILD: https://github.com/indygreg/python-build-standalone/releases/download/20230507/cpython-3.10.11+20230507-x86_64-apple-darwin-install_only.tar.gz |       PYTHON_MACOS_STANDALONE_BUILD: https://github.com/indygreg/python-build-standalone/releases/download/20230507/cpython-3.10.11+20230507-x86_64-apple-darwin-install_only.tar.gz | ||||||
|  |     permissions: | ||||||
|  |       contents: write # for uploading release artifacts | ||||||
|  | 
 | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v4 |       - uses: actions/checkout@v4 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								.github/workflows/build_wamr_sdk.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/build_wamr_sdk.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -35,9 +35,15 @@ on: | ||||||
|         type: string |         type: string | ||||||
|         required: true |         required: true | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   build: |   build: | ||||||
|     runs-on: ${{ inputs.runner }} |     runs-on: ${{ inputs.runner }} | ||||||
|  |     permissions: | ||||||
|  |       contents: write # for uploading release artifacts | ||||||
|  | 
 | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v4 |       - uses: actions/checkout@v4 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								.github/workflows/build_wamr_vscode_ext.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/build_wamr_vscode_ext.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -14,9 +14,15 @@ on: | ||||||
|         type: string |         type: string | ||||||
|         required: true |         required: true | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   build: |   build: | ||||||
|     runs-on: ubuntu-22.04 |     runs-on: ubuntu-22.04 | ||||||
|  |     permissions: | ||||||
|  |       contents: write # for uploading release artifacts | ||||||
|  | 
 | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v4 |       - uses: actions/checkout@v4 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										18
									
								
								.github/workflows/build_wamrc.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								.github/workflows/build_wamrc.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -31,9 +31,15 @@ on: | ||||||
|         type: string |         type: string | ||||||
|         required: false |         required: false | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   build: |   build: | ||||||
|     runs-on: ${{ inputs.runner }} |     runs-on: ${{ inputs.runner }} | ||||||
|  |     permissions: | ||||||
|  |       contents: write # for uploading release artifacts | ||||||
|  | 
 | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v4 |       - uses: actions/checkout@v4 | ||||||
| 
 | 
 | ||||||
|  | @ -56,8 +62,16 @@ jobs: | ||||||
|           cmake --build build --config Release --parallel 4 |           cmake --build build --config Release --parallel 4 | ||||||
|         working-directory: wamr-compiler |         working-directory: wamr-compiler | ||||||
| 
 | 
 | ||||||
|       - name: compress the binary |       - name: Compress the binary on Windows | ||||||
|         if: inputs.release |         if: inputs.runner == 'windows-latest' && inputs.release | ||||||
|  |         run: | | ||||||
|  |           tar -czf wamrc-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz wamrc.exe | ||||||
|  |           Compress-Archive -Path wamrc.exe -DestinationPath wamrc-${{ inputs.ver_num }}-${{ inputs.runner }}.zip | ||||||
|  |           mv wamrc-${{ inputs.ver_num }}-${{ inputs.runner }}.* ../ | ||||||
|  |         working-directory: wamr-compiler/build/Release | ||||||
|  | 
 | ||||||
|  |       - name: compress the binary on non-Windows | ||||||
|  |         if: inputs.runner != 'windows-latest' && inputs.release | ||||||
|         run: | |         run: | | ||||||
|           tar czf wamrc-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz wamrc |           tar czf wamrc-${{ inputs.ver_num }}-${{ inputs.runner }}.tar.gz wamrc | ||||||
|           zip wamrc-${{ inputs.ver_num }}-${{ inputs.runner }}.zip wamrc |           zip wamrc-${{ inputs.ver_num }}-${{ inputs.runner }}.zip wamrc | ||||||
|  |  | ||||||
							
								
								
									
										20
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -19,6 +19,9 @@ on: | ||||||
|   # allow to be triggered manually |   # allow to be triggered manually | ||||||
|   workflow_dispatch: |   workflow_dispatch: | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   analyze: |   analyze: | ||||||
|     if: github.repository == 'bytecodealliance/wasm-micro-runtime' |     if: github.repository == 'bytecodealliance/wasm-micro-runtime' | ||||||
|  | @ -30,10 +33,6 @@ jobs: | ||||||
|     # Consider using larger runners for possible analysis time improvements. |     # Consider using larger runners for possible analysis time improvements. | ||||||
|     runs-on: ${{ (matrix.language == 'swift' && 'macos-13') || 'ubuntu-22.04' }} |     runs-on: ${{ (matrix.language == 'swift' && 'macos-13') || 'ubuntu-22.04' }} | ||||||
|     timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} |     timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} | ||||||
|     permissions: |  | ||||||
|       actions: read |  | ||||||
|       contents: read |  | ||||||
|       security-events: write |  | ||||||
| 
 | 
 | ||||||
|     strategy: |     strategy: | ||||||
|       fail-fast: false |       fail-fast: false | ||||||
|  | @ -41,6 +40,11 @@ jobs: | ||||||
|         language: [ 'cpp' ] |         language: [ 'cpp' ] | ||||||
|         # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby', 'swift' ] |         # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby', 'swift' ] | ||||||
| 
 | 
 | ||||||
|  |     permissions: | ||||||
|  |       contents: read | ||||||
|  |       actions: read | ||||||
|  |       security-events: write | ||||||
|  | 
 | ||||||
|     steps: |     steps: | ||||||
|     - name: Checkout repository |     - name: Checkout repository | ||||||
|       uses: actions/checkout@v3 |       uses: actions/checkout@v3 | ||||||
|  | @ -49,7 +53,7 @@ jobs: | ||||||
| 
 | 
 | ||||||
|     # Initializes the CodeQL tools for scanning. |     # Initializes the CodeQL tools for scanning. | ||||||
|     - name: Initialize CodeQL |     - name: Initialize CodeQL | ||||||
|       uses: github/codeql-action/init@v3 |       uses: github/codeql-action/init@v3.26.13 | ||||||
|       with: |       with: | ||||||
|         languages: ${{ matrix.language }} |         languages: ${{ matrix.language }} | ||||||
| 
 | 
 | ||||||
|  | @ -66,7 +70,7 @@ jobs: | ||||||
|     - run: | |     - run: | | ||||||
|         ./.github/scripts/codeql_buildscript.sh |         ./.github/scripts/codeql_buildscript.sh | ||||||
|     - name: Perform CodeQL Analysis |     - name: Perform CodeQL Analysis | ||||||
|       uses: github/codeql-action/analyze@v3 |       uses: github/codeql-action/analyze@v3.26.13 | ||||||
|       with: |       with: | ||||||
|         category: "/language:${{matrix.language}}" |         category: "/language:${{matrix.language}}" | ||||||
|         upload: false |         upload: false | ||||||
|  | @ -95,14 +99,14 @@ jobs: | ||||||
|         output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif |         output: ${{ steps.step1.outputs.sarif-output }}/cpp.sarif | ||||||
| 
 | 
 | ||||||
|     - name: Upload CodeQL results to code scanning |     - name: Upload CodeQL results to code scanning | ||||||
|       uses: github/codeql-action/upload-sarif@v3 |       uses: github/codeql-action/upload-sarif@v3.26.13 | ||||||
|       with: |       with: | ||||||
|         sarif_file: ${{ steps.step1.outputs.sarif-output }} |         sarif_file: ${{ steps.step1.outputs.sarif-output }} | ||||||
|         category: "/language:${{matrix.language}}" |         category: "/language:${{matrix.language}}" | ||||||
| 
 | 
 | ||||||
|     - name: Upload CodeQL results as an artifact |     - name: Upload CodeQL results as an artifact | ||||||
|       if: success() || failure() |       if: success() || failure() | ||||||
|       uses: actions/upload-artifact@v4 |       uses: actions/upload-artifact@v4.4.3 | ||||||
|       with: |       with: | ||||||
|         name: codeql-results |         name: codeql-results | ||||||
|         path: ${{ steps.step1.outputs.sarif-output }} |         path: ${{ steps.step1.outputs.sarif-output }} | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								.github/workflows/coding_guidelines.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/coding_guidelines.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -14,6 +14,9 @@ concurrency: | ||||||
|   group: ${{ github.workflow }}-${{ github.ref }} |   group: ${{ github.workflow }}-${{ github.ref }} | ||||||
|   cancel-in-progress: true |   cancel-in-progress: true | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   compliance_job: |   compliance_job: | ||||||
|     runs-on: ubuntu-20.04 |     runs-on: ubuntu-20.04 | ||||||
|  |  | ||||||
|  | @ -70,8 +70,14 @@ env: | ||||||
|   MEMORY64_TEST_OPTIONS: "-s spec -W -b -P" |   MEMORY64_TEST_OPTIONS: "-s spec -W -b -P" | ||||||
|   MULTI_MEMORY_TEST_OPTIONS: "-s spec -E -b -P" |   MULTI_MEMORY_TEST_OPTIONS: "-s spec -E -b -P" | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   build_llvm_libraries_on_ubuntu_2204: |   build_llvm_libraries_on_ubuntu_2204: | ||||||
|  |     permissions: | ||||||
|  |       contents: read | ||||||
|  |       actions: write | ||||||
|     uses: ./.github/workflows/build_llvm_libraries.yml |     uses: ./.github/workflows/build_llvm_libraries.yml | ||||||
|     with: |     with: | ||||||
|       os: "ubuntu-22.04" |       os: "ubuntu-22.04" | ||||||
|  | @ -578,6 +584,15 @@ jobs: | ||||||
|           ./run.sh test1 |           ./run.sh test1 | ||||||
|           ./run.sh test2 |           ./run.sh test2 | ||||||
| 
 | 
 | ||||||
|  |       - name: Build Sample [shared-heap] | ||||||
|  |         run: | | ||||||
|  |           cd samples/shared-heap | ||||||
|  |           mkdir build && cd build | ||||||
|  |           cmake .. | ||||||
|  |           cmake --build . --config Debug --parallel 4 | ||||||
|  |           ./shared_heap_test | ||||||
|  |           ./shared_heap_test --aot | ||||||
|  | 
 | ||||||
|   test: |   test: | ||||||
|     needs: |     needs: | ||||||
|       [ |       [ | ||||||
|  |  | ||||||
							
								
								
									
										18
									
								
								.github/workflows/compilation_on_macos.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								.github/workflows/compilation_on_macos.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -52,13 +52,22 @@ env: | ||||||
|   LLVM_LAZY_JIT_BUILD_OPTIONS: "-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_FAST_INTERP=0 -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_JIT=1 -DWAMR_BUILD_LAZY_JIT=1" |   LLVM_LAZY_JIT_BUILD_OPTIONS: "-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_FAST_INTERP=0 -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_JIT=1 -DWAMR_BUILD_LAZY_JIT=1" | ||||||
|   LLVM_EAGER_JIT_BUILD_OPTIONS: "-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_FAST_INTERP=0 -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_JIT=1 -DWAMR_BUILD_LAZY_JIT=0" |   LLVM_EAGER_JIT_BUILD_OPTIONS: "-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_FAST_INTERP=0 -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_JIT=1 -DWAMR_BUILD_LAZY_JIT=0" | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   build_llvm_libraries_on_intel_macos: |   build_llvm_libraries_on_intel_macos: | ||||||
|  |     permissions: | ||||||
|  |       contents: read | ||||||
|  |       actions: write | ||||||
|     uses: ./.github/workflows/build_llvm_libraries.yml |     uses: ./.github/workflows/build_llvm_libraries.yml | ||||||
|     with: |     with: | ||||||
|       os: "macos-13" |       os: "macos-13" | ||||||
|       arch: "X86" |       arch: "X86" | ||||||
|   build_llvm_libraries_on_arm_macos: |   build_llvm_libraries_on_arm_macos: | ||||||
|  |     permissions: | ||||||
|  |       contents: read | ||||||
|  |       actions: write | ||||||
|     uses: ./.github/workflows/build_llvm_libraries.yml |     uses: ./.github/workflows/build_llvm_libraries.yml | ||||||
|     with: |     with: | ||||||
|       os: "macos-14" |       os: "macos-14" | ||||||
|  | @ -386,3 +395,12 @@ jobs: | ||||||
|           ./build.sh |           ./build.sh | ||||||
|           ./run.sh test1 |           ./run.sh test1 | ||||||
|           ./run.sh test2 |           ./run.sh test2 | ||||||
|  | 
 | ||||||
|  |       - name: Build Sample [shared-heap] | ||||||
|  |         run: | | ||||||
|  |           cd samples/shared-heap | ||||||
|  |           mkdir build && cd build | ||||||
|  |           cmake .. | ||||||
|  |           cmake --build . --config Debug --parallel 4 | ||||||
|  |           ./shared_heap_test | ||||||
|  |           ./shared_heap_test --aot | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								.github/workflows/compilation_on_nuttx.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/compilation_on_nuttx.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -46,6 +46,9 @@ concurrency: | ||||||
| env: | env: | ||||||
|   WASI_SDK_PATH: "/opt/wasi-sdk" |   WASI_SDK_PATH: "/opt/wasi-sdk" | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   build_iwasm_on_nuttx: |   build_iwasm_on_nuttx: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								.github/workflows/compilation_on_sgx.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/compilation_on_sgx.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -54,8 +54,14 @@ env: | ||||||
|   LLVM_LAZY_JIT_BUILD_OPTIONS: "-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_FAST_INTERP=0 -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_JIT=1 -DWAMR_BUILD_LAZY_JIT=1" |   LLVM_LAZY_JIT_BUILD_OPTIONS: "-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_FAST_INTERP=0 -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_JIT=1 -DWAMR_BUILD_LAZY_JIT=1" | ||||||
|   LLVM_EAGER_JIT_BUILD_OPTIONS: "-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_FAST_INTERP=0 -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_JIT=1 -DWAMR_BUILD_LAZY_JIT=0" |   LLVM_EAGER_JIT_BUILD_OPTIONS: "-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_FAST_INTERP=0 -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_JIT=1 -DWAMR_BUILD_LAZY_JIT=0" | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   build_llvm_libraries: |   build_llvm_libraries: | ||||||
|  |     permissions: | ||||||
|  |       contents: read | ||||||
|  |       actions: write | ||||||
|     uses: ./.github/workflows/build_llvm_libraries.yml |     uses: ./.github/workflows/build_llvm_libraries.yml | ||||||
|     with: |     with: | ||||||
|       os: "ubuntu-20.04" |       os: "ubuntu-20.04" | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								.github/workflows/compilation_on_windows.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/compilation_on_windows.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -53,6 +53,9 @@ concurrency: | ||||||
|   group: ${{ github.workflow }}-${{ github.ref }} |   group: ${{ github.workflow }}-${{ github.ref }} | ||||||
|   cancel-in-progress: true |   cancel-in-progress: true | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   build: |   build: | ||||||
|     runs-on: windows-latest |     runs-on: windows-latest | ||||||
|  |  | ||||||
							
								
								
									
										5
									
								
								.github/workflows/create_tag.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.github/workflows/create_tag.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -15,6 +15,9 @@ on: | ||||||
|         description: "the new tag just created" |         description: "the new tag just created" | ||||||
|         value: ${{ jobs.create_tag.outputs.new_tag}} |         value: ${{ jobs.create_tag.outputs.new_tag}} | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   create_tag: |   create_tag: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|  | @ -22,6 +25,8 @@ jobs: | ||||||
|       minor_version: ${{ steps.preparation.outputs.minor_version }} |       minor_version: ${{ steps.preparation.outputs.minor_version }} | ||||||
|       new_ver: ${{ steps.preparation.outputs.new_ver }} |       new_ver: ${{ steps.preparation.outputs.new_ver }} | ||||||
|       new_tag: ${{ steps.preparation.outputs.new_tag }} |       new_tag: ${{ steps.preparation.outputs.new_tag }} | ||||||
|  |     permissions: | ||||||
|  |       contents: write # create and push tags | ||||||
| 
 | 
 | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v4 |       - uses: actions/checkout@v4 | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								.github/workflows/hadolint_dockerfiles.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/hadolint_dockerfiles.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -28,6 +28,9 @@ concurrency: | ||||||
|   group: ${{ github.workflow }}-${{ github.ref }} |   group: ${{ github.workflow }}-${{ github.ref }} | ||||||
|   cancel-in-progress: true |   cancel-in-progress: true | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   run-hadolint-on-dockerfiles: |   run-hadolint-on-dockerfiles: | ||||||
|     runs-on: ubuntu-22.04 |     runs-on: ubuntu-22.04 | ||||||
|  |  | ||||||
							
								
								
									
										18
									
								
								.github/workflows/nightly_run.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								.github/workflows/nightly_run.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -44,13 +44,22 @@ env: | ||||||
|   X86_32_TARGET_TEST_OPTIONS: "-m x86_32 -P" |   X86_32_TARGET_TEST_OPTIONS: "-m x86_32 -P" | ||||||
|   WASI_TEST_OPTIONS: "-s wasi_certification -w" |   WASI_TEST_OPTIONS: "-s wasi_certification -w" | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   build_llvm_libraries_on_ubuntu_2004: |   build_llvm_libraries_on_ubuntu_2004: | ||||||
|  |     permissions: | ||||||
|  |       contents: read | ||||||
|  |       actions: write | ||||||
|     uses: ./.github/workflows/build_llvm_libraries.yml |     uses: ./.github/workflows/build_llvm_libraries.yml | ||||||
|     with: |     with: | ||||||
|       os: "ubuntu-20.04" |       os: "ubuntu-20.04" | ||||||
|       arch: "X86" |       arch: "X86" | ||||||
|   build_llvm_libraries_on_ubuntu_2204: |   build_llvm_libraries_on_ubuntu_2204: | ||||||
|  |     permissions: | ||||||
|  |       contents: read | ||||||
|  |       actions: write | ||||||
|     uses: ./.github/workflows/build_llvm_libraries.yml |     uses: ./.github/workflows/build_llvm_libraries.yml | ||||||
|     with: |     with: | ||||||
|       os: "ubuntu-22.04" |       os: "ubuntu-22.04" | ||||||
|  | @ -593,6 +602,15 @@ jobs: | ||||||
|           exit $? |           exit $? | ||||||
|         working-directory: ./wamr-app-framework/samples/simple |         working-directory: ./wamr-app-framework/samples/simple | ||||||
| 
 | 
 | ||||||
|  |       - name: Build Sample [shared-heap] | ||||||
|  |         run: | | ||||||
|  |           cd samples/shared-heap | ||||||
|  |           mkdir build && cd build | ||||||
|  |           cmake .. | ||||||
|  |           cmake --build . --config Debug --parallel 4 | ||||||
|  |           ./shared_heap_test | ||||||
|  |           ./shared_heap_test --aot | ||||||
|  | 
 | ||||||
|   test: |   test: | ||||||
|     needs: |     needs: | ||||||
|       [ |       [ | ||||||
|  |  | ||||||
							
								
								
									
										78
									
								
								.github/workflows/release_process.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										78
									
								
								.github/workflows/release_process.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -18,11 +18,18 @@ concurrency: | ||||||
|   group: ${{ github.workflow }}-${{ github.ref }} |   group: ${{ github.workflow }}-${{ github.ref }} | ||||||
|   cancel-in-progress: true |   cancel-in-progress: true | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   create_tag: |   create_tag: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # create and push tags | ||||||
|     uses: ./.github/workflows/create_tag.yml |     uses: ./.github/workflows/create_tag.yml | ||||||
| 
 | 
 | ||||||
|   create_release: |   create_release: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # create release | ||||||
|     needs: [create_tag] |     needs: [create_tag] | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     outputs: |     outputs: | ||||||
|  | @ -52,6 +59,9 @@ jobs: | ||||||
|   # |   # | ||||||
|   # LLVM_LIBRARIES |   # LLVM_LIBRARIES | ||||||
|   build_llvm_libraries_on_ubuntu_2004: |   build_llvm_libraries_on_ubuntu_2004: | ||||||
|  |     permissions: | ||||||
|  |       contents: read | ||||||
|  |       actions: write | ||||||
|     needs: [create_tag, create_release] |     needs: [create_tag, create_release] | ||||||
|     uses: ./.github/workflows/build_llvm_libraries.yml |     uses: ./.github/workflows/build_llvm_libraries.yml | ||||||
|     with: |     with: | ||||||
|  | @ -59,6 +69,9 @@ jobs: | ||||||
|       arch: "AArch64 ARM Mips RISCV X86" |       arch: "AArch64 ARM Mips RISCV X86" | ||||||
| 
 | 
 | ||||||
|   build_llvm_libraries_on_ubuntu_2204: |   build_llvm_libraries_on_ubuntu_2204: | ||||||
|  |     permissions: | ||||||
|  |       contents: read | ||||||
|  |       actions: write | ||||||
|     needs: [create_tag, create_release] |     needs: [create_tag, create_release] | ||||||
|     uses: ./.github/workflows/build_llvm_libraries.yml |     uses: ./.github/workflows/build_llvm_libraries.yml | ||||||
|     with: |     with: | ||||||
|  | @ -66,15 +79,30 @@ jobs: | ||||||
|       arch: "AArch64 ARM Mips RISCV X86" |       arch: "AArch64 ARM Mips RISCV X86" | ||||||
| 
 | 
 | ||||||
|   build_llvm_libraries_on_macos: |   build_llvm_libraries_on_macos: | ||||||
|  |     permissions: | ||||||
|  |       contents: read | ||||||
|  |       actions: write | ||||||
|     needs: [create_tag, create_release] |     needs: [create_tag, create_release] | ||||||
|     uses: ./.github/workflows/build_llvm_libraries.yml |     uses: ./.github/workflows/build_llvm_libraries.yml | ||||||
|     with: |     with: | ||||||
|       os: "macos-13" |       os: "macos-13" | ||||||
|       arch: "AArch64 ARM Mips RISCV X86" |       arch: "AArch64 ARM Mips RISCV X86" | ||||||
| 
 | 
 | ||||||
|  |   build_llvm_libraries_on_windows: | ||||||
|  |     permissions: | ||||||
|  |       contents: read | ||||||
|  |       actions: write | ||||||
|  |     needs: [create_tag, create_release] | ||||||
|  |     uses: ./.github/workflows/build_llvm_libraries.yml | ||||||
|  |     with: | ||||||
|  |       os: "windows-latest" | ||||||
|  |       arch: "AArch64 ARM Mips RISCV X86" | ||||||
|  | 
 | ||||||
|   # |   # | ||||||
|   # WAMRC |   # WAMRC | ||||||
|   release_wamrc_on_ubuntu_2004: |   release_wamrc_on_ubuntu_2004: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # upload release artifact | ||||||
|     needs: [create_tag, create_release, build_llvm_libraries_on_ubuntu_2004] |     needs: [create_tag, create_release, build_llvm_libraries_on_ubuntu_2004] | ||||||
|     uses: ./.github/workflows/build_wamrc.yml |     uses: ./.github/workflows/build_wamrc.yml | ||||||
|     with: |     with: | ||||||
|  | @ -85,6 +113,8 @@ jobs: | ||||||
|       ver_num: ${{ needs.create_tag.outputs.new_ver}} |       ver_num: ${{ needs.create_tag.outputs.new_ver}} | ||||||
| 
 | 
 | ||||||
|   release_wamrc_on_ubuntu_2204: |   release_wamrc_on_ubuntu_2204: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # upload release artifact | ||||||
|     needs: [create_tag, create_release, build_llvm_libraries_on_ubuntu_2204 ] |     needs: [create_tag, create_release, build_llvm_libraries_on_ubuntu_2204 ] | ||||||
|     uses: ./.github/workflows/build_wamrc.yml |     uses: ./.github/workflows/build_wamrc.yml | ||||||
|     with: |     with: | ||||||
|  | @ -95,6 +125,8 @@ jobs: | ||||||
|       ver_num: ${{ needs.create_tag.outputs.new_ver }} |       ver_num: ${{ needs.create_tag.outputs.new_ver }} | ||||||
| 
 | 
 | ||||||
|   release_wamrc_on_ubuntu_macos: |   release_wamrc_on_ubuntu_macos: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # upload release artifact | ||||||
|     needs: [create_tag, create_release, build_llvm_libraries_on_macos] |     needs: [create_tag, create_release, build_llvm_libraries_on_macos] | ||||||
|     uses: ./.github/workflows/build_wamrc.yml |     uses: ./.github/workflows/build_wamrc.yml | ||||||
|     with: |     with: | ||||||
|  | @ -104,9 +136,23 @@ jobs: | ||||||
|       upload_url: ${{ needs.create_release.outputs.upload_url }} |       upload_url: ${{ needs.create_release.outputs.upload_url }} | ||||||
|       ver_num: ${{ needs.create_tag.outputs.new_ver }} |       ver_num: ${{ needs.create_tag.outputs.new_ver }} | ||||||
|    |    | ||||||
|  |   release_wamrc_on_windows: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # upload release artifact | ||||||
|  |     needs: [create_tag, create_release, build_llvm_libraries_on_windows] | ||||||
|  |     uses: ./.github/workflows/build_wamrc.yml | ||||||
|  |     with: | ||||||
|  |       llvm_cache_key: ${{ needs.build_llvm_libraries_on_windows.outputs.cache_key }} | ||||||
|  |       release: true | ||||||
|  |       runner: windows-latest | ||||||
|  |       upload_url: ${{ needs.create_release.outputs.upload_url }} | ||||||
|  |       ver_num: ${{ needs.create_tag.outputs.new_ver }} | ||||||
|  | 
 | ||||||
|   # |   # | ||||||
|   # IWASM |   # IWASM | ||||||
|   release_iwasm_on_ubuntu_2004: |   release_iwasm_on_ubuntu_2004: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # upload release artifact | ||||||
|     needs: [create_tag, create_release, build_llvm_libraries_on_ubuntu_2004] |     needs: [create_tag, create_release, build_llvm_libraries_on_ubuntu_2004] | ||||||
|     uses: ./.github/workflows/build_iwasm_release.yml |     uses: ./.github/workflows/build_iwasm_release.yml | ||||||
|     with: |     with: | ||||||
|  | @ -117,6 +163,8 @@ jobs: | ||||||
|       ver_num: ${{ needs.create_tag.outputs.new_ver}} |       ver_num: ${{ needs.create_tag.outputs.new_ver}} | ||||||
| 
 | 
 | ||||||
|   release_iwasm_on_ubuntu_2204: |   release_iwasm_on_ubuntu_2204: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # upload release artifact | ||||||
|     needs: [create_tag, create_release, build_llvm_libraries_on_ubuntu_2204] |     needs: [create_tag, create_release, build_llvm_libraries_on_ubuntu_2204] | ||||||
|     uses: ./.github/workflows/build_iwasm_release.yml |     uses: ./.github/workflows/build_iwasm_release.yml | ||||||
|     with: |     with: | ||||||
|  | @ -127,6 +175,8 @@ jobs: | ||||||
|       ver_num: ${{ needs.create_tag.outputs.new_ver}} |       ver_num: ${{ needs.create_tag.outputs.new_ver}} | ||||||
| 
 | 
 | ||||||
|   release_iwasm_on_macos: |   release_iwasm_on_macos: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # upload release artifact | ||||||
|     needs: [create_tag, create_release, build_llvm_libraries_on_macos] |     needs: [create_tag, create_release, build_llvm_libraries_on_macos] | ||||||
|     uses: ./.github/workflows/build_iwasm_release.yml |     uses: ./.github/workflows/build_iwasm_release.yml | ||||||
|     with: |     with: | ||||||
|  | @ -136,9 +186,23 @@ jobs: | ||||||
|       upload_url: ${{ needs.create_release.outputs.upload_url }} |       upload_url: ${{ needs.create_release.outputs.upload_url }} | ||||||
|       ver_num: ${{ needs.create_tag.outputs.new_ver}} |       ver_num: ${{ needs.create_tag.outputs.new_ver}} | ||||||
| 
 | 
 | ||||||
|  |   release_iwasm_on_windows: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # upload release artifact | ||||||
|  |     needs: [create_tag, create_release, build_llvm_libraries_on_windows] | ||||||
|  |     uses: ./.github/workflows/build_iwasm_release.yml | ||||||
|  |     with: | ||||||
|  |       cwd: product-mini/platforms/windows | ||||||
|  |       llvm_cache_key: ${{ needs.build_llvm_libraries_on_windows.outputs.cache_key }} | ||||||
|  |       runner: windows-latest | ||||||
|  |       upload_url: ${{ needs.create_release.outputs.upload_url }} | ||||||
|  |       ver_num: ${{ needs.create_tag.outputs.new_ver}} | ||||||
|  | 
 | ||||||
|   # |   # | ||||||
|   # WAMR_SDK |   # WAMR_SDK | ||||||
|   release_wamr_sdk_on_ubuntu_2004: |   release_wamr_sdk_on_ubuntu_2004: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # upload release artifact | ||||||
|     needs: [create_tag, create_release] |     needs: [create_tag, create_release] | ||||||
|     uses: ./.github/workflows/build_wamr_sdk.yml |     uses: ./.github/workflows/build_wamr_sdk.yml | ||||||
|     with: |     with: | ||||||
|  | @ -150,6 +214,8 @@ jobs: | ||||||
|       wamr_app_framework_url: https://github.com/bytecodealliance/wamr-app-framework.git |       wamr_app_framework_url: https://github.com/bytecodealliance/wamr-app-framework.git | ||||||
| 
 | 
 | ||||||
|   release_wamr_sdk_on_ubuntu_2204: |   release_wamr_sdk_on_ubuntu_2204: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # upload release artifact | ||||||
|     needs: [create_tag, create_release] |     needs: [create_tag, create_release] | ||||||
|     uses: ./.github/workflows/build_wamr_sdk.yml |     uses: ./.github/workflows/build_wamr_sdk.yml | ||||||
|     with: |     with: | ||||||
|  | @ -161,6 +227,8 @@ jobs: | ||||||
|       wamr_app_framework_url: https://github.com/bytecodealliance/wamr-app-framework.git |       wamr_app_framework_url: https://github.com/bytecodealliance/wamr-app-framework.git | ||||||
| 
 | 
 | ||||||
|   release_wamr_sdk_on_macos: |   release_wamr_sdk_on_macos: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # upload release artifact | ||||||
|     needs: [create_tag, create_release] |     needs: [create_tag, create_release] | ||||||
|     uses: ./.github/workflows/build_wamr_sdk.yml |     uses: ./.github/workflows/build_wamr_sdk.yml | ||||||
|     with: |     with: | ||||||
|  | @ -174,6 +242,8 @@ jobs: | ||||||
|   # |   # | ||||||
|   # vscode extension cross-platform |   # vscode extension cross-platform | ||||||
|   release_wamr_ide_vscode_ext: |   release_wamr_ide_vscode_ext: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # upload release artifact | ||||||
|     needs: [create_tag, create_release] |     needs: [create_tag, create_release] | ||||||
|     uses: ./.github/workflows/build_wamr_vscode_ext.yml |     uses: ./.github/workflows/build_wamr_vscode_ext.yml | ||||||
|     secrets: inherit |     secrets: inherit | ||||||
|  | @ -184,6 +254,8 @@ jobs: | ||||||
|   # |   # | ||||||
|   # vscode extension docker images package |   # vscode extension docker images package | ||||||
|   release_wamr_ide_docker_images_package: |   release_wamr_ide_docker_images_package: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # upload release artifact | ||||||
|     needs: [create_tag, create_release] |     needs: [create_tag, create_release] | ||||||
|     uses: ./.github/workflows/build_docker_images.yml |     uses: ./.github/workflows/build_docker_images.yml | ||||||
|     with: |     with: | ||||||
|  | @ -193,6 +265,8 @@ jobs: | ||||||
|   # |   # | ||||||
|   # WAMR_LLDB |   # WAMR_LLDB | ||||||
|   release_wamr_lldb_on_ubuntu_2004: |   release_wamr_lldb_on_ubuntu_2004: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # upload release artifact | ||||||
|     needs: [create_tag, create_release] |     needs: [create_tag, create_release] | ||||||
|     uses: ./.github/workflows/build_wamr_lldb.yml |     uses: ./.github/workflows/build_wamr_lldb.yml | ||||||
|     with: |     with: | ||||||
|  | @ -201,6 +275,8 @@ jobs: | ||||||
|       ver_num: ${{ needs.create_tag.outputs.new_ver}} |       ver_num: ${{ needs.create_tag.outputs.new_ver}} | ||||||
| 
 | 
 | ||||||
|   release_wamr_lldb_on_ubuntu_2204: |   release_wamr_lldb_on_ubuntu_2204: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # upload release artifact | ||||||
|     needs: [create_tag, create_release] |     needs: [create_tag, create_release] | ||||||
|     uses: ./.github/workflows/build_wamr_lldb.yml |     uses: ./.github/workflows/build_wamr_lldb.yml | ||||||
|     with: |     with: | ||||||
|  | @ -209,6 +285,8 @@ jobs: | ||||||
|       ver_num: ${{ needs.create_tag.outputs.new_ver}} |       ver_num: ${{ needs.create_tag.outputs.new_ver}} | ||||||
| 
 | 
 | ||||||
|   release_wamr_lldb_on_macos_universal: |   release_wamr_lldb_on_macos_universal: | ||||||
|  |     permissions: | ||||||
|  |       contents: write # upload release artifact | ||||||
|     needs: [create_tag, create_release] |     needs: [create_tag, create_release] | ||||||
|     uses: ./.github/workflows/build_wamr_lldb.yml |     uses: ./.github/workflows/build_wamr_lldb.yml | ||||||
|     with: |     with: | ||||||
|  |  | ||||||
|  | @ -22,11 +22,17 @@ on: | ||||||
|       result: |       result: | ||||||
|         value: ${{ jobs.build.outputs.result }} |         value: ${{ jobs.build.outputs.result }} | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   reuse: |   reuse: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     outputs: |     outputs: | ||||||
|       result: ${{ steps.try_reuse.outputs.result }} |       result: ${{ steps.try_reuse.outputs.result }} | ||||||
|  |     permissions: | ||||||
|  |       contents: write # for creating realease and uploading release artifacts | ||||||
|  | 
 | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v4 |       - uses: actions/checkout@v4 | ||||||
|         # Full git history is needed to get a proper list of commits and tags |         # Full git history is needed to get a proper list of commits and tags | ||||||
|  |  | ||||||
							
								
								
									
										11
									
								
								.github/workflows/spec_test_on_nuttx.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/workflows/spec_test_on_nuttx.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -29,8 +29,14 @@ env: | ||||||
|   LLVM_CACHE_SUFFIX: "build-llvm_libraries_ex" |   LLVM_CACHE_SUFFIX: "build-llvm_libraries_ex" | ||||||
|   WASI_SDK_PATH: "/opt/wasi-sdk" |   WASI_SDK_PATH: "/opt/wasi-sdk" | ||||||
| 
 | 
 | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
| jobs: | jobs: | ||||||
|   build_llvm_libraries: |   build_llvm_libraries: | ||||||
|  |     permissions: | ||||||
|  |       contents: read | ||||||
|  |       actions: write | ||||||
|     uses: ./.github/workflows/build_llvm_libraries.yml |     uses: ./.github/workflows/build_llvm_libraries.yml | ||||||
|     with: |     with: | ||||||
|       os: "ubuntu-22.04" |       os: "ubuntu-22.04" | ||||||
|  | @ -38,6 +44,9 @@ jobs: | ||||||
|       container_image: ghcr.io/no1wudi/nuttx/apache-nuttx-ci-linux@sha256:8c4e00b607d4d6d66ba8f51c4544819a616eac69d3a2ac669e2af2150e2eb0f9 |       container_image: ghcr.io/no1wudi/nuttx/apache-nuttx-ci-linux@sha256:8c4e00b607d4d6d66ba8f51c4544819a616eac69d3a2ac669e2af2150e2eb0f9 | ||||||
| 
 | 
 | ||||||
|   build_llvm_libraries_xtensa: |   build_llvm_libraries_xtensa: | ||||||
|  |     permissions: | ||||||
|  |       contents: read | ||||||
|  |       actions: write | ||||||
|     uses: ./.github/workflows/build_llvm_libraries.yml |     uses: ./.github/workflows/build_llvm_libraries.yml | ||||||
|     with: |     with: | ||||||
|       os: "ubuntu-22.04" |       os: "ubuntu-22.04" | ||||||
|  | @ -341,7 +350,7 @@ jobs: | ||||||
| 
 | 
 | ||||||
|       - name: upload the log |       - name: upload the log | ||||||
|         if: always() |         if: always() | ||||||
|         uses: actions/upload-artifact@v4 |         uses: actions/upload-artifact@v4.4.3 | ||||||
|         with: |         with: | ||||||
|           name: spec-test-log-${{ github.run_id }}-${{ strategy.job-index }}-${{ matrix.target_config.target }} |           name: spec-test-log-${{ github.run_id }}-${{ strategy.job-index }}-${{ matrix.target_config.target }} | ||||||
|           path: log |           path: log | ||||||
|  |  | ||||||
							
								
								
									
										65
									
								
								.github/workflows/supply_chain.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								.github/workflows/supply_chain.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,65 @@ | ||||||
|  | # This workflow uses actions that are not certified by GitHub. They are provided | ||||||
|  | # by a third-party and are governed by separate terms of service, privacy | ||||||
|  | # policy, and support documentation. | ||||||
|  | 
 | ||||||
|  | # Check current WASM Micro Runtime results here: https://securityscorecards.dev/viewer/?uri=github.com/bytecodealliance/wasm-micro-runtime | ||||||
|  | 
 | ||||||
|  | name: Scorecard supply-chain security | ||||||
|  | on: | ||||||
|  |   # For Branch-Protection check. Only the default branch is supported. See | ||||||
|  |   # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection | ||||||
|  |   branch_protection_rule: | ||||||
|  |   # To guarantee Maintained check is occasionally updated. See | ||||||
|  |   # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained | ||||||
|  |   # midnight UTC | ||||||
|  |   schedule: | ||||||
|  |     - cron: "0 0 * * *" | ||||||
|  |   # allow to be triggered manually | ||||||
|  |   workflow_dispatch: | ||||||
|  | 
 | ||||||
|  | # Declare default permissions as read only. | ||||||
|  | permissions: | ||||||
|  |   contents: read | ||||||
|  | 
 | ||||||
|  | jobs: | ||||||
|  |   analysis: | ||||||
|  |     name: Scorecard analysis | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     if: github.repository == 'bytecodealliance/wasm-micro-runtime' | ||||||
|  |     permissions: | ||||||
|  |       # Needed to upload the results to code-scanning dashboard. | ||||||
|  |       security-events: write | ||||||
|  |       # Needed to publish results and get a badge (see publish_results below). | ||||||
|  |       id-token: write       | ||||||
|  | 
 | ||||||
|  |     steps: | ||||||
|  |       - name: "Checkout code" | ||||||
|  |         uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 | ||||||
|  |         with: | ||||||
|  |           persist-credentials: false | ||||||
|  | 
 | ||||||
|  |       - name: "Run analysis" | ||||||
|  |         uses: ossf/scorecard-action@62b2cac7ed8198b15735ed49ab1e5cf35480ba46 # v2.4.0 | ||||||
|  |         with: | ||||||
|  |           results_file: results.sarif | ||||||
|  |           results_format: sarif | ||||||
|  | 
 | ||||||
|  |           #   - Publish results to OpenSSF REST API for easy access by consumers | ||||||
|  |           #   - Allows the repository to include the Scorecard badge. | ||||||
|  |           #   - See https://github.com/ossf/scorecard-action#publishing-results.       | ||||||
|  |           publish_results: true | ||||||
|  | 
 | ||||||
|  |       # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF | ||||||
|  |       # format to the repository Actions tab. | ||||||
|  |       - name: "Upload artifact" | ||||||
|  |         uses: actions/upload-artifact@184d73b71b93c222403b2e7f1ffebe4508014249 # v3.1.0 | ||||||
|  |         with: | ||||||
|  |           name: SARIF file | ||||||
|  |           path: results.sarif | ||||||
|  |           retention-days: 5 | ||||||
|  | 
 | ||||||
|  |       # Upload the results to GitHub's code scanning dashboard. | ||||||
|  |       - name: "Upload to code-scanning" | ||||||
|  |         uses: github/codeql-action/upload-sarif@af56b044b5d41c317aef5d19920b3183cb4fbbec # v2.2.4 | ||||||
|  |         with: | ||||||
|  |           sarif_file: results.sarif | ||||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							|  | @ -13,6 +13,7 @@ | ||||||
| .clangd | .clangd | ||||||
| .DS_Store | .DS_Store | ||||||
| *.o | *.o | ||||||
|  | .aider* | ||||||
| 
 | 
 | ||||||
| core/deps/** | core/deps/** | ||||||
| core/shared/mem-alloc/tlsf | core/shared/mem-alloc/tlsf | ||||||
|  |  | ||||||
|  | @ -60,7 +60,7 @@ The WAMR fast interpreter is a clean room development. We would acknowledge the | ||||||
| 
 | 
 | ||||||
| ### llvm | ### llvm | ||||||
| 
 | 
 | ||||||
| [LICENSE](./LICENCE.txt) | [LICENSE](./LICENSE) | ||||||
| 
 | 
 | ||||||
| ### wasm-c-api | ### wasm-c-api | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -124,7 +124,8 @@ include (${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake) | ||||||
| if (NOT WIN32) | if (NOT WIN32) | ||||||
|   set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security \ |   set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wformat -Wformat-security \ | ||||||
|                                        -ffunction-sections -fdata-sections \ |                                        -ffunction-sections -fdata-sections \ | ||||||
|                                        -Wno-unused-parameter -Wno-pedantic") |                                        -Wno-unused-parameter -Wno-pedantic \ | ||||||
|  |                                        -fvisibility=hidden") | ||||||
|   # Remove the extra spaces for better make log |   # Remove the extra spaces for better make log | ||||||
|   string (REGEX REPLACE "  *" " " CMAKE_C_FLAGS ${CMAKE_C_FLAGS}) |   string (REGEX REPLACE "  *" " " CMAKE_C_FLAGS ${CMAKE_C_FLAGS}) | ||||||
|   set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wno-unused") |   set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wformat -Wformat-security -Wno-unused") | ||||||
|  |  | ||||||
							
								
								
									
										29
									
								
								CODEOWNERS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								CODEOWNERS
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | ||||||
|  | # In this project, we use CODEOWNERS to identify people who are likely to know | ||||||
|  | # who should review a pull request. | ||||||
|  | # | ||||||
|  | # People listed in this file are committing to respond in a timely fashion to | ||||||
|  | # PRs in the selected areas. However, that response doesn't have to be a full | ||||||
|  | # code review; it could also take any of these forms: | ||||||
|  | # | ||||||
|  | # - "I intend to review this but I can't yet. Please leave me a message if I | ||||||
|  | #   haven't responded by (a specific date in the near future)." | ||||||
|  | # | ||||||
|  | # - "I think (a specific other contributor) should review this." (Note that the | ||||||
|  | #   best reviewer for a PR may not necessarily be listed in this file.) | ||||||
|  | # | ||||||
|  | # People must only be added to this file if they've agreed to provide one of | ||||||
|  | # the above responses in a reasonable amount of time for every PR to which | ||||||
|  | # they're assigned. | ||||||
|  | # | ||||||
|  | # We only ask for this commitment from people who are employed full-time to | ||||||
|  | # work on this project. We gratefully welcome reviews from other contributors, | ||||||
|  | # but we don't believe it's fair to ask volunteers to respond quickly. | ||||||
|  | 
 | ||||||
|  | # If none of the later patterns match, assign to anyone. This team is the | ||||||
|  | # parent of all the other teams and automatically includes everyone on those | ||||||
|  | # teams. | ||||||
|  | * @loganek @lum1n0us @no1wudi @wenyongh @xujuntwt95329 @yamt | ||||||
|  | 
 | ||||||
|  | # Some parts of the project require more specialized knowledge. In those areas | ||||||
|  | # we designate smaller groups who are more likely to be aware of who's working | ||||||
|  | # in specific areas. | ||||||
|  | @ -1,3 +1,85 @@ | ||||||
|  | ## WAMR-2.2.0 | ||||||
|  | 
 | ||||||
|  | ### Breaking changes  | ||||||
|  | 
 | ||||||
|  | ### New features  | ||||||
|  | - Add support for multi-memory proposal in classic interpreter (#3742)  | ||||||
|  | - wasi-nn: Add a new target for llama.cpp as a wasi-nn backend (#3709) | ||||||
|  | - Add memory instance support apis (#3786)  | ||||||
|  | - Implement a first version of shared heap feature (#3789)  | ||||||
|  | - Support dynamic aot debug (#3788)  | ||||||
|  | - Implement shared heap for AOT (#3815) | ||||||
|  | - Support table64 extension in classic-interp and AOT running modes (#3811) | ||||||
|  |    | ||||||
|  | 
 | ||||||
|  | ### Bug fixes | ||||||
|  | - Enable merged os_mmap for aot data sections (#3681)  | ||||||
|  | - Fix arm64 issues on mac (#3688)  | ||||||
|  | - aot loader: Call os_mmap with MMAP_MAP_32BIT only when target is x86-64 or riscv64 (#3755) | ||||||
|  | - Fix building iwasm_shared and iwasm_static libs on win32 (#3762)  | ||||||
|  | - Fix compile error when multi-module and tags are enabled (#3781) | ||||||
|  | - Fix aot multi export memory support (#3791) | ||||||
|  | - Fix Windows compile error when uvwasi is enabled (#3810) | ||||||
|  | - Fix missing symbols when using aot mode on riscv platforms (#3812) | ||||||
|  | - Fix mac build of libc_emcc_wrapper.c (#3836) | ||||||
|  | - aot_comp_option.h: Add missing stdint.h header (#3834) | ||||||
|  | - Fix compilation error found in tflite test (#3820)  | ||||||
|  | - Fix exec_env_tls assertion in module instantiation (#3844)  | ||||||
|  | - Fix issues of destroy_shared_heaps (#3847) | ||||||
|  | 
 | ||||||
|  | ### Enhancements | ||||||
|  | - aot loader: Refine os_mmap related code (#3711) | ||||||
|  | - Enable merged os_mmap for aot data sections and aot text (#3743) | ||||||
|  | - Improve posix mmap retry logic (#3714) | ||||||
|  | - Remove unnecessary code duplication in aot runtime (#3767) | ||||||
|  | - Add wamrc parameter to configure stack frame features (#3763)  | ||||||
|  | - refactoring: Re-use commit IP functionality between exception handling and other cases (#3768) | ||||||
|  | - AOT call stack optimizations (#3773)  | ||||||
|  | - Appease GCC strict prototypes warning (#3775) | ||||||
|  | - Appease GCC -Wformat (#3783) | ||||||
|  | - Fix compiler warnings (#3784) | ||||||
|  | - Implement option for skipping function index in the callstack (#3785) | ||||||
|  | - Fix a compile warning in aot_emit_function.c (#3793)  | ||||||
|  | - Restore cmake hidden compile symbol visibility (#3796) | ||||||
|  | - Refactor shared heap feature for interpreter mode (#3794) | ||||||
|  | - Add no_resolve to LoadArgs and wasm_runtime_resolve_symbols (#3790) | ||||||
|  | - shared heap: Fix some issues and add basic unit test case (#3801) | ||||||
|  | - Add shared heap sample (#3806) | ||||||
|  | - Fix unused param warning when GC is enabled (#3814) | ||||||
|  | - Add scoreboard CI for supply-chain security (#3819) | ||||||
|  | - Emit load_addr and load_size if WAMR_ENABLE_COMPILER is set (#3835) | ||||||
|  | - libc-emcc: Use alternate method to check getrandom support (#3848) | ||||||
|  | - Enable libc-wasi for windows msvc build (#3852)  | ||||||
|  | - Remove unused folder samples/gui and samples/littlevgl (#3853)  | ||||||
|  | - Fix some compile warnings and typos (#3854) | ||||||
|  | - Allow to set native stack boundary to exec_env (#3862) | ||||||
|  | - Refine wasm/aot function instance lookup (#3865) | ||||||
|  | - Fix quadratic runtime for duplicate export name detection (#3861) | ||||||
|  | 
 | ||||||
|  |    | ||||||
|  | ### Others | ||||||
|  | - Add a comment on AOT_SECTION_TYPE_SIGNATURE (#3746)  | ||||||
|  | - CI: Freeze version of bloaty for NuttX compilation (#3756) | ||||||
|  | - aot compiler: Allow to control stack boundary check when boundary check is enabled (#3754) | ||||||
|  | - Update ref to the multi-memory tests (#3764) | ||||||
|  | - compilation_on_nuttx.yml: Update checkout action to suppress warnings (#3765) | ||||||
|  | - CI: Disable parallel test in spectest for NuttX (#3780) | ||||||
|  | - spec_test_on_nuttx.yml: Disable riscv32_ilp32f for now (#3777)  | ||||||
|  | - Ignore temporary file from aider (#3787) | ||||||
|  | - Add CODEOWNERS (#3822) | ||||||
|  | - build(deps): bump github/codeql-action from 2.2.4 to 3.26.9 (#3826) | ||||||
|  | - build(deps): bump actions/upload-artifact from 3.1.0 to 4.4.0 (#3827) | ||||||
|  | - build(deps): bump ossf/scorecard-action from 2.3.1 to 2.4.0 (#3828) | ||||||
|  | - build(deps): bump github/codeql-action from 3.26.9 to 3.26.11 (#3843)  | ||||||
|  | - build(deps): bump actions/upload-artifact from 4.4.0 to 4.4.3 (#3855) | ||||||
|  | - build(deps): bump github/codeql-action from 3.26.11 to 3.26.12 (#3856) | ||||||
|  | - Add Windows wamrc and iwasm build in release CI (#3857) | ||||||
|  | - Fix syntax error in codeql_buildscript.sh (#3864) | ||||||
|  | - release CI: Add another iwasm binary that supports Garbage Collection and Exception Handling (#3866) | ||||||
|  | - Fix lookup function issue reported in nightly run (#3868) | ||||||
|  |   | ||||||
|  | --- | ||||||
|  | 
 | ||||||
| ## WAMR-2.1.2 | ## WAMR-2.1.2 | ||||||
| 
 | 
 | ||||||
| ### Breaking Changes | ### Breaking Changes | ||||||
|  |  | ||||||
|  | @ -125,9 +125,7 @@ def build_llvm(llvm_dir, platform, backends, projects, use_clang=False, extra_fl | ||||||
|     if not llvm_dir.exists(): |     if not llvm_dir.exists(): | ||||||
|         raise Exception(f"{llvm_dir} doesn't exist") |         raise Exception(f"{llvm_dir} doesn't exist") | ||||||
| 
 | 
 | ||||||
|     build_dir = llvm_dir.joinpath( |     build_dir = llvm_dir.joinpath("build").resolve() | ||||||
|         "win32build" if "windows" == platform else "build" |  | ||||||
|     ).resolve() |  | ||||||
|     build_dir.mkdir(exist_ok=True) |     build_dir.mkdir(exist_ok=True) | ||||||
| 
 | 
 | ||||||
|     lib_llvm_core_library = build_dir.joinpath("lib/libLLVMCore.a").resolve() |     lib_llvm_core_library = build_dir.joinpath("lib/libLLVMCore.a").resolve() | ||||||
|  | @ -178,6 +176,7 @@ def repackage_llvm(llvm_dir): | ||||||
|         raise Exception("Find more than one LLVM-*.tar.gz") |         raise Exception("Find more than one LLVM-*.tar.gz") | ||||||
| 
 | 
 | ||||||
|     if not packs: |     if not packs: | ||||||
|  |         raise Exception("Didn't find any LLVM-* package") | ||||||
|         return |         return | ||||||
| 
 | 
 | ||||||
|     llvm_package = packs[0].name |     llvm_package = packs[0].name | ||||||
|  | @ -193,6 +192,31 @@ def repackage_llvm(llvm_dir): | ||||||
|     # rm ./LLVM-1*.gz |     # rm ./LLVM-1*.gz | ||||||
|     os.remove(llvm_dir.joinpath(llvm_package).resolve()) |     os.remove(llvm_dir.joinpath(llvm_package).resolve()) | ||||||
| 
 | 
 | ||||||
|  | def repackage_llvm_windows(llvm_dir): | ||||||
|  |     build_dir = llvm_dir.joinpath("./build").resolve() | ||||||
|  | 
 | ||||||
|  |     packs_path = [f for f in build_dir.glob("./_CPack_Packages/win64/NSIS/LLVM-*-win64")] | ||||||
|  |     if len(packs_path) > 1: | ||||||
|  |         raise Exception("Find more than one LLVM-* package") | ||||||
|  | 
 | ||||||
|  |     if not packs_path: | ||||||
|  |         raise Exception("Didn't find any LLVM-* package") | ||||||
|  |         return | ||||||
|  |      | ||||||
|  |     llvm_package_path = f"_CPack_Packages/win64/NSIS/{packs_path[0].name}" | ||||||
|  |     windows_package_dir = build_dir.joinpath(llvm_package_path).resolve() | ||||||
|  | 
 | ||||||
|  |     # mv package dir outside of build  | ||||||
|  |     shutil.move(str(windows_package_dir), str(llvm_dir)) | ||||||
|  |     # rm -r build | ||||||
|  |     shutil.rmtree(str(build_dir)) | ||||||
|  |     # mkdir build | ||||||
|  |     build_dir.mkdir() | ||||||
|  |     # move back all the subdiretories under cpack directory(bin/include/lib) to build dir | ||||||
|  |     moved_package_dir = llvm_dir.joinpath(packs_path[0].name) | ||||||
|  |     for sub_dir in moved_package_dir.iterdir(): | ||||||
|  |         shutil.move(str(sub_dir), str(build_dir)) | ||||||
|  |     moved_package_dir.rmdir()   | ||||||
| 
 | 
 | ||||||
| def main(): | def main(): | ||||||
|     parser = argparse.ArgumentParser(description="build necessary LLVM libraries") |     parser = argparse.ArgumentParser(description="build necessary LLVM libraries") | ||||||
|  | @ -304,6 +328,10 @@ def main(): | ||||||
|             ) |             ) | ||||||
|             is not None |             is not None | ||||||
|         ): |         ): | ||||||
|  |             # TODO: repackage process may change in the future, this work for LLVM 15.x | ||||||
|  |             if "windows" == platform: | ||||||
|  |                 repackage_llvm_windows(llvm_dir) | ||||||
|  |             else: | ||||||
|                 repackage_llvm(llvm_dir) |                 repackage_llvm(llvm_dir) | ||||||
| 
 | 
 | ||||||
|         return True |         return True | ||||||
|  |  | ||||||
|  | @ -102,9 +102,6 @@ if (WAMR_BUILD_JIT EQUAL 1) | ||||||
|   if (NOT DEFINED LLVM_DIR) |   if (NOT DEFINED LLVM_DIR) | ||||||
|     set (LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") |     set (LLVM_SRC_ROOT "${WAMR_ROOT_DIR}/core/deps/llvm") | ||||||
|     set (LLVM_BUILD_ROOT "${LLVM_SRC_ROOT}/build") |     set (LLVM_BUILD_ROOT "${LLVM_SRC_ROOT}/build") | ||||||
|     if (WAMR_BUILD_PLATFORM STREQUAL "windows") |  | ||||||
|       set (LLVM_BUILD_ROOT "${LLVM_SRC_ROOT}/win32build") |  | ||||||
|     endif () |  | ||||||
|     if (NOT EXISTS "${LLVM_BUILD_ROOT}") |     if (NOT EXISTS "${LLVM_BUILD_ROOT}") | ||||||
|         message (FATAL_ERROR "Cannot find LLVM dir: ${LLVM_BUILD_ROOT}") |         message (FATAL_ERROR "Cannot find LLVM dir: ${LLVM_BUILD_ROOT}") | ||||||
|     endif () |     endif () | ||||||
|  | @ -256,6 +253,11 @@ if (WAMR_BUILD_SHARED_MEMORY EQUAL 1) | ||||||
| else () | else () | ||||||
|   add_definitions (-DWASM_ENABLE_SHARED_MEMORY=0) |   add_definitions (-DWASM_ENABLE_SHARED_MEMORY=0) | ||||||
| endif () | endif () | ||||||
|  | if (WAMR_BUILD_SHARED_HEAP EQUAL 1) | ||||||
|  |   add_definitions (-DWASM_ENABLE_SHARED_HEAP=1) | ||||||
|  |   message ("     Shared heap enabled") | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
| if (WAMR_BUILD_MEMORY64 EQUAL 1) | if (WAMR_BUILD_MEMORY64 EQUAL 1) | ||||||
|   # if native is 32-bit or cross-compiled to 32-bit |   # if native is 32-bit or cross-compiled to 32-bit | ||||||
|   if (NOT WAMR_BUILD_TARGET MATCHES ".*64.*") |   if (NOT WAMR_BUILD_TARGET MATCHES ".*64.*") | ||||||
|  | @ -407,6 +409,10 @@ endif () | ||||||
| if (WAMR_BUILD_DEBUG_AOT EQUAL 1) | if (WAMR_BUILD_DEBUG_AOT EQUAL 1) | ||||||
|     message ("     Debug AOT enabled") |     message ("     Debug AOT enabled") | ||||||
| endif () | endif () | ||||||
|  | if (WAMR_BUILD_DYNAMIC_AOT_DEBUG EQUAL 1) | ||||||
|  |     add_definitions (-DWASM_ENABLE_DYNAMIC_AOT_DEBUG=1) | ||||||
|  |     message ("     Dynamic AOT debug enabled") | ||||||
|  | endif () | ||||||
| if (WAMR_BUILD_LOAD_CUSTOM_SECTION EQUAL 1) | if (WAMR_BUILD_LOAD_CUSTOM_SECTION EQUAL 1) | ||||||
|     add_definitions (-DWASM_ENABLE_LOAD_CUSTOM_SECTION=1) |     add_definitions (-DWASM_ENABLE_LOAD_CUSTOM_SECTION=1) | ||||||
|     message ("     Load custom section enabled") |     message ("     Load custom section enabled") | ||||||
|  | @ -492,7 +498,7 @@ if (WAMR_BUILD_MODULE_INST_CONTEXT EQUAL 1) | ||||||
|   message ("     Module instance context enabled") |   message ("     Module instance context enabled") | ||||||
| endif () | endif () | ||||||
| if (WAMR_BUILD_GC_HEAP_VERIFY EQUAL 1) | if (WAMR_BUILD_GC_HEAP_VERIFY EQUAL 1) | ||||||
|   add_definitions (-DWASM_ENABLE_GC_VERIFY=1) |   add_definitions (-DBH_ENABLE_GC_VERIFY=1) | ||||||
|   message ("     GC heap verification enabled") |   message ("     GC heap verification enabled") | ||||||
| endif () | endif () | ||||||
| if ("$ENV{COLLECT_CODE_COVERAGE}" STREQUAL "1" OR COLLECT_CODE_COVERAGE EQUAL 1) | if ("$ENV{COLLECT_CODE_COVERAGE}" STREQUAL "1" OR COLLECT_CODE_COVERAGE EQUAL 1) | ||||||
|  |  | ||||||
|  | @ -59,7 +59,12 @@ if (WAMR_BUILD_INTERP EQUAL 1) | ||||||
| endif () | endif () | ||||||
| 
 | 
 | ||||||
| if (WAMR_BUILD_FAST_JIT EQUAL 1) | if (WAMR_BUILD_FAST_JIT EQUAL 1) | ||||||
|  |     if (WAMR_BUILD_PLATFORM STREQUAL "windows") | ||||||
|  |         message ("Fast JIT currently not supported on Windows") | ||||||
|  |         set (WAMR_BUILD_FAST_JIT 0) | ||||||
|  |     else () | ||||||
|         include (${IWASM_DIR}/fast-jit/iwasm_fast_jit.cmake) |         include (${IWASM_DIR}/fast-jit/iwasm_fast_jit.cmake) | ||||||
|  |     endif () | ||||||
| endif () | endif () | ||||||
| 
 | 
 | ||||||
| if (WAMR_BUILD_JIT EQUAL 1) | if (WAMR_BUILD_JIT EQUAL 1) | ||||||
|  | @ -104,6 +109,10 @@ if (WAMR_BUILD_WASI_NN EQUAL 1) | ||||||
| endif () | endif () | ||||||
| 
 | 
 | ||||||
| if (WAMR_BUILD_LIB_PTHREAD EQUAL 1) | if (WAMR_BUILD_LIB_PTHREAD EQUAL 1) | ||||||
|  |     if (WAMR_BUILD_PLATFORM STREQUAL "windows") | ||||||
|  |         set (WAMR_BUILD_LIB_PTHREAD_SEMAPHORE 0) | ||||||
|  |         message ("Lib pthread semaphore currently not supported on Windows") | ||||||
|  |     endif () | ||||||
|     include (${IWASM_DIR}/libraries/lib-pthread/lib_pthread.cmake) |     include (${IWASM_DIR}/libraries/lib-pthread/lib_pthread.cmake) | ||||||
|     # Enable the dependent feature if lib pthread is enabled |     # Enable the dependent feature if lib pthread is enabled | ||||||
|     set (WAMR_BUILD_THREAD_MGR 1) |     set (WAMR_BUILD_THREAD_MGR 1) | ||||||
|  | @ -123,6 +132,10 @@ if (WAMR_BUILD_DYNAMIC_LINKING EQUAL 1) | ||||||
|     include (${IWASM_DIR}/libraries/lib-dynlink/lib_dynlink.cmake) |     include (${IWASM_DIR}/libraries/lib-dynlink/lib_dynlink.cmake) | ||||||
| endif () | endif () | ||||||
| 
 | 
 | ||||||
|  | if (WAMR_BUILD_SHARED_HEAP EQUAL 1) | ||||||
|  |     include (${IWASM_DIR}/libraries/shared-heap/shared_heap.cmake) | ||||||
|  | endif () | ||||||
|  | 
 | ||||||
| if (WAMR_BUILD_DEBUG_INTERP EQUAL 1) | if (WAMR_BUILD_DEBUG_INTERP EQUAL 1) | ||||||
|     set (WAMR_BUILD_THREAD_MGR 1) |     set (WAMR_BUILD_THREAD_MGR 1) | ||||||
|     include (${IWASM_DIR}/libraries/debug-engine/debug_engine.cmake) |     include (${IWASM_DIR}/libraries/debug-engine/debug_engine.cmake) | ||||||
|  | @ -198,6 +211,7 @@ set (source_all | ||||||
|     ${LIBC_EMCC_SOURCE} |     ${LIBC_EMCC_SOURCE} | ||||||
|     ${LIB_RATS_SOURCE} |     ${LIB_RATS_SOURCE} | ||||||
|     ${DEBUG_ENGINE_SOURCE} |     ${DEBUG_ENGINE_SOURCE} | ||||||
|  |     ${LIB_SHARED_HEAP_SOURCE} | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| set (WAMR_RUNTIME_LIB_SOURCE ${source_all}) | set (WAMR_RUNTIME_LIB_SOURCE ${source_all}) | ||||||
|  |  | ||||||
|  | @ -180,6 +180,7 @@ def check_file_name(path: Path) -> bool: | ||||||
|         "docker-compose", |         "docker-compose", | ||||||
|         "package-lock", |         "package-lock", | ||||||
|         "vite-env.d", |         "vite-env.d", | ||||||
|  |         "osv-scanner", | ||||||
|     ]: |     ]: | ||||||
|         return True |         return True | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -75,6 +75,10 @@ | ||||||
| #define WASM_ENABLE_AOT 0 | #define WASM_ENABLE_AOT 0 | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifndef WASM_ENABLE_DYNAMIC_AOT_DEBUG | ||||||
|  | #define WASM_ENABLE_DYNAMIC_AOT_DEBUG 0 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #ifndef WASM_ENABLE_WORD_ALIGN_READ | #ifndef WASM_ENABLE_WORD_ALIGN_READ | ||||||
| #define WASM_ENABLE_WORD_ALIGN_READ 0 | #define WASM_ENABLE_WORD_ALIGN_READ 0 | ||||||
| #endif | #endif | ||||||
|  | @ -397,7 +401,9 @@ | ||||||
| #define APP_HEAP_SIZE_DEFAULT (8 * 1024) | #define APP_HEAP_SIZE_DEFAULT (8 * 1024) | ||||||
| #endif | #endif | ||||||
| #define APP_HEAP_SIZE_MIN (256) | #define APP_HEAP_SIZE_MIN (256) | ||||||
| #define APP_HEAP_SIZE_MAX (512 * 1024 * 1024) | /* The ems memory allocator supports maximal heap size 1GB,
 | ||||||
|  |    see ems_gc_internal.h */ | ||||||
|  | #define APP_HEAP_SIZE_MAX (1024 * 1024 * 1024) | ||||||
| 
 | 
 | ||||||
| /* Default min/max gc heap size of each app */ | /* Default min/max gc heap size of each app */ | ||||||
| #ifndef GC_HEAP_SIZE_DEFAULT | #ifndef GC_HEAP_SIZE_DEFAULT | ||||||
|  | @ -693,4 +699,8 @@ | ||||||
| #endif | #endif | ||||||
| #endif /* WASM_ENABLE_FUZZ_TEST != 0 */ | #endif /* WASM_ENABLE_FUZZ_TEST != 0 */ | ||||||
| 
 | 
 | ||||||
|  | #ifndef WASM_ENABLE_SHARED_HEAP | ||||||
|  | #define WASM_ENABLE_SHARED_HEAP 0 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #endif /* end of _CONFIG_H_ */ | #endif /* end of _CONFIG_H_ */ | ||||||
|  |  | ||||||
|  | @ -4,9 +4,8 @@ | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include "aot_runtime.h" | #include "aot_runtime.h" | ||||||
| #include "bh_common.h" |  | ||||||
| #include "bh_log.h" |  | ||||||
| #include "aot_reloc.h" | #include "aot_reloc.h" | ||||||
|  | #include "bh_platform.h" | ||||||
| #include "../common/wasm_runtime_common.h" | #include "../common/wasm_runtime_common.h" | ||||||
| #include "../common/wasm_native.h" | #include "../common/wasm_native.h" | ||||||
| #include "../common/wasm_loader_common.h" | #include "../common/wasm_loader_common.h" | ||||||
|  | @ -634,73 +633,6 @@ str2uint32(const char *buf, uint32 *p_res); | ||||||
| static bool | static bool | ||||||
| str2uint64(const char *buf, uint64 *p_res); | str2uint64(const char *buf, uint64 *p_res); | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_MULTI_MODULE != 0 |  | ||||||
| static void * |  | ||||||
| aot_loader_resolve_function(const AOTModule *module, const char *function_name, |  | ||||||
|                             const AOTFuncType *expected_function_type, |  | ||||||
|                             char *error_buf, uint32 error_buf_size); |  | ||||||
| 
 |  | ||||||
| static void * |  | ||||||
| aot_loader_resolve_function_ex(const char *module_name, |  | ||||||
|                                const char *function_name, |  | ||||||
|                                const AOTFuncType *expected_function_type, |  | ||||||
|                                char *error_buf, uint32 error_buf_size) |  | ||||||
| { |  | ||||||
|     WASMModuleCommon *module_reg; |  | ||||||
| 
 |  | ||||||
|     module_reg = wasm_runtime_find_module_registered(module_name); |  | ||||||
|     if (!module_reg || module_reg->module_type != Wasm_Module_AoT) { |  | ||||||
|         LOG_DEBUG("can not find a module named %s for function %s", module_name, |  | ||||||
|                   function_name); |  | ||||||
|         set_error_buf(error_buf, error_buf_size, "unknown import"); |  | ||||||
|         return NULL; |  | ||||||
|     } |  | ||||||
|     return aot_loader_resolve_function((AOTModule *)module_reg, function_name, |  | ||||||
|                                        expected_function_type, error_buf, |  | ||||||
|                                        error_buf_size); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void * |  | ||||||
| aot_loader_resolve_function(const AOTModule *module, const char *function_name, |  | ||||||
|                             const AOTFuncType *expected_function_type, |  | ||||||
|                             char *error_buf, uint32 error_buf_size) |  | ||||||
| { |  | ||||||
|     void *function = NULL; |  | ||||||
|     AOTExport *export = NULL; |  | ||||||
|     AOTFuncType *target_function_type = NULL; |  | ||||||
| 
 |  | ||||||
|     export = loader_find_export((WASMModuleCommon *)module, module->name, |  | ||||||
|                                 function_name, EXPORT_KIND_FUNC, error_buf, |  | ||||||
|                                 error_buf_size); |  | ||||||
|     if (!export) { |  | ||||||
|         return NULL; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /* resolve function type and function */ |  | ||||||
|     if (export->index < module->import_func_count) { |  | ||||||
|         target_function_type = module->import_funcs[export->index].func_type; |  | ||||||
|         function = module->import_funcs[export->index].func_ptr_linked; |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         target_function_type = |  | ||||||
|             (AOTFuncType *)module |  | ||||||
|                 ->types[module->func_type_indexes[export->index |  | ||||||
|                                                   - module->import_func_count]]; |  | ||||||
|         function = |  | ||||||
|             (module->func_ptrs[export->index - module->import_func_count]); |  | ||||||
|     } |  | ||||||
|     /* check function type */ |  | ||||||
|     if (!wasm_type_equal((WASMType *)expected_function_type, |  | ||||||
|                          (WASMType *)target_function_type, module->types, |  | ||||||
|                          module->type_count)) { |  | ||||||
|         LOG_DEBUG("%s.%s failed the type check", module->name, function_name); |  | ||||||
|         set_error_buf(error_buf, error_buf_size, "incompatible import type"); |  | ||||||
|         return NULL; |  | ||||||
|     } |  | ||||||
|     return function; |  | ||||||
| } |  | ||||||
| #endif /* end of WASM_ENABLE_MULTI_MODULE */ |  | ||||||
| 
 |  | ||||||
| static bool | static bool | ||||||
| load_native_symbol_section(const uint8 *buf, const uint8 *buf_end, | load_native_symbol_section(const uint8 *buf, const uint8 *buf_end, | ||||||
|                            AOTModule *module, bool is_load_from_file_buf, |                            AOTModule *module, bool is_load_from_file_buf, | ||||||
|  | @ -1449,6 +1381,12 @@ load_table_list(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, | ||||||
|     for (i = 0; i < module->table_count; i++, table++) { |     for (i = 0; i < module->table_count; i++, table++) { | ||||||
|         read_uint8(buf, buf_end, table->table_type.elem_type); |         read_uint8(buf, buf_end, table->table_type.elem_type); | ||||||
|         read_uint8(buf, buf_end, table->table_type.flags); |         read_uint8(buf, buf_end, table->table_type.flags); | ||||||
|  | 
 | ||||||
|  |         if (!wasm_table_check_flags(table->table_type.flags, error_buf, | ||||||
|  |                                     error_buf_size, true)) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         read_uint8(buf, buf_end, table->table_type.possible_grow); |         read_uint8(buf, buf_end, table->table_type.possible_grow); | ||||||
| #if WASM_ENABLE_GC != 0 | #if WASM_ENABLE_GC != 0 | ||||||
|         if (wasm_is_type_multi_byte_type(table->table_type.elem_type)) { |         if (wasm_is_type_multi_byte_type(table->table_type.elem_type)) { | ||||||
|  | @ -2285,19 +2223,13 @@ destroy_import_funcs(AOTImportFunc *import_funcs) | ||||||
| 
 | 
 | ||||||
| static bool | static bool | ||||||
| load_import_funcs(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, | load_import_funcs(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, | ||||||
|                   bool is_load_from_file_buf, char *error_buf, |                   bool is_load_from_file_buf, bool no_resolve, char *error_buf, | ||||||
|                   uint32 error_buf_size) |                   uint32 error_buf_size) | ||||||
| { | { | ||||||
|     char *module_name, *field_name; |  | ||||||
|     const uint8 *buf = *p_buf; |     const uint8 *buf = *p_buf; | ||||||
|     AOTImportFunc *import_funcs; |     AOTImportFunc *import_funcs; | ||||||
|     uint64 size; |     uint64 size; | ||||||
|     uint32 i; |     uint32 i; | ||||||
| #if WASM_ENABLE_MULTI_MODULE != 0 |  | ||||||
|     AOTModule *sub_module = NULL; |  | ||||||
|     AOTFunc *linked_func = NULL; |  | ||||||
|     AOTFuncType *declare_func_type = NULL; |  | ||||||
| #endif |  | ||||||
| 
 | 
 | ||||||
|     /* Allocate memory */ |     /* Allocate memory */ | ||||||
|     size = sizeof(AOTImportFunc) * (uint64)module->import_func_count; |     size = sizeof(AOTImportFunc) * (uint64)module->import_func_count; | ||||||
|  | @ -2314,53 +2246,17 @@ load_import_funcs(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_MULTI_MODULE != 0 |  | ||||||
|         declare_func_type = |  | ||||||
|             (AOTFuncType *)module->types[import_funcs[i].func_type_index]; |  | ||||||
|         read_string(buf, buf_end, module_name); |  | ||||||
|         read_string(buf, buf_end, field_name); |  | ||||||
| 
 |  | ||||||
|         import_funcs[i].module_name = module_name; |  | ||||||
|         import_funcs[i].func_name = field_name; |  | ||||||
|         linked_func = wasm_native_resolve_symbol( |  | ||||||
|             module_name, field_name, declare_func_type, |  | ||||||
|             &import_funcs[i].signature, &import_funcs[i].attachment, |  | ||||||
|             &import_funcs[i].call_conv_raw); |  | ||||||
|         if (!linked_func) { |  | ||||||
|             sub_module = NULL; |  | ||||||
|             if (!wasm_runtime_is_built_in_module(module_name)) { |  | ||||||
|                 sub_module = (AOTModule *)wasm_runtime_load_depended_module( |  | ||||||
|                     (WASMModuleCommon *)module, module_name, error_buf, |  | ||||||
|                     error_buf_size); |  | ||||||
|                 if (!sub_module) { |  | ||||||
|                     LOG_ERROR("failed to load sub module: %s", error_buf); |  | ||||||
|                     return false; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             if (!sub_module) |  | ||||||
|                 linked_func = aot_loader_resolve_function_ex( |  | ||||||
|                     module_name, field_name, declare_func_type, error_buf, |  | ||||||
|                     error_buf_size); |  | ||||||
|             else |  | ||||||
|                 linked_func = aot_loader_resolve_function( |  | ||||||
|                     sub_module, field_name, declare_func_type, error_buf, |  | ||||||
|                     error_buf_size); |  | ||||||
|         } |  | ||||||
|         import_funcs[i].func_ptr_linked = linked_func; |  | ||||||
|         import_funcs[i].func_type = declare_func_type; |  | ||||||
| 
 |  | ||||||
| #else |  | ||||||
|         import_funcs[i].func_type = |         import_funcs[i].func_type = | ||||||
|             (AOTFuncType *)module->types[import_funcs[i].func_type_index]; |             (AOTFuncType *)module->types[import_funcs[i].func_type_index]; | ||||||
|         read_string(buf, buf_end, import_funcs[i].module_name); |         read_string(buf, buf_end, import_funcs[i].module_name); | ||||||
|         read_string(buf, buf_end, import_funcs[i].func_name); |         read_string(buf, buf_end, import_funcs[i].func_name); | ||||||
|         module_name = import_funcs[i].module_name; |         import_funcs[i].attachment = NULL; | ||||||
|         field_name = import_funcs[i].func_name; |         import_funcs[i].signature = NULL; | ||||||
|         import_funcs[i].func_ptr_linked = wasm_native_resolve_symbol( |         import_funcs[i].call_conv_raw = false; | ||||||
|             module_name, field_name, import_funcs[i].func_type, | 
 | ||||||
|             &import_funcs[i].signature, &import_funcs[i].attachment, |         if (!no_resolve) { | ||||||
|             &import_funcs[i].call_conv_raw); |             aot_resolve_import_func(module, &import_funcs[i]); | ||||||
| #endif |         } | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_LIBC_WASI != 0 | #if WASM_ENABLE_LIBC_WASI != 0 | ||||||
|         if (!strcmp(import_funcs[i].module_name, "wasi_unstable") |         if (!strcmp(import_funcs[i].module_name, "wasi_unstable") | ||||||
|  | @ -2378,7 +2274,7 @@ fail: | ||||||
| static bool | static bool | ||||||
| load_import_func_info(const uint8 **p_buf, const uint8 *buf_end, | load_import_func_info(const uint8 **p_buf, const uint8 *buf_end, | ||||||
|                       AOTModule *module, bool is_load_from_file_buf, |                       AOTModule *module, bool is_load_from_file_buf, | ||||||
|                       char *error_buf, uint32 error_buf_size) |                       bool no_resolve, char *error_buf, uint32 error_buf_size) | ||||||
| { | { | ||||||
|     const uint8 *buf = *p_buf; |     const uint8 *buf = *p_buf; | ||||||
| 
 | 
 | ||||||
|  | @ -2387,7 +2283,7 @@ load_import_func_info(const uint8 **p_buf, const uint8 *buf_end, | ||||||
|     /* load import funcs */ |     /* load import funcs */ | ||||||
|     if (module->import_func_count > 0 |     if (module->import_func_count > 0 | ||||||
|         && !load_import_funcs(&buf, buf_end, module, is_load_from_file_buf, |         && !load_import_funcs(&buf, buf_end, module, is_load_from_file_buf, | ||||||
|                               error_buf, error_buf_size)) |                               no_resolve, error_buf, error_buf_size)) | ||||||
|         return false; |         return false; | ||||||
| 
 | 
 | ||||||
|     *p_buf = buf; |     *p_buf = buf; | ||||||
|  | @ -2514,7 +2410,7 @@ fail: | ||||||
| static bool | static bool | ||||||
| load_init_data_section(const uint8 *buf, const uint8 *buf_end, | load_init_data_section(const uint8 *buf, const uint8 *buf_end, | ||||||
|                        AOTModule *module, bool is_load_from_file_buf, |                        AOTModule *module, bool is_load_from_file_buf, | ||||||
|                        char *error_buf, uint32 error_buf_size) |                        bool no_resolve, char *error_buf, uint32 error_buf_size) | ||||||
| { | { | ||||||
|     const uint8 *p = buf, *p_end = buf_end; |     const uint8 *p = buf, *p_end = buf_end; | ||||||
| 
 | 
 | ||||||
|  | @ -2525,7 +2421,7 @@ load_init_data_section(const uint8 *buf, const uint8 *buf_end, | ||||||
|                                     error_buf, error_buf_size) |                                     error_buf, error_buf_size) | ||||||
|         || !load_global_info(&p, p_end, module, error_buf, error_buf_size) |         || !load_global_info(&p, p_end, module, error_buf, error_buf_size) | ||||||
|         || !load_import_func_info(&p, p_end, module, is_load_from_file_buf, |         || !load_import_func_info(&p, p_end, module, is_load_from_file_buf, | ||||||
|                                   error_buf, error_buf_size)) |                                   no_resolve, error_buf, error_buf_size)) | ||||||
|         return false; |         return false; | ||||||
| 
 | 
 | ||||||
|     /* load function count and start function index */ |     /* load function count and start function index */ | ||||||
|  | @ -2615,6 +2511,15 @@ try_merge_data_and_text(const uint8 **buf, const uint8 **buf_end, | ||||||
|         /* merge failed but may be not critical for some targets */ |         /* merge failed but may be not critical for some targets */ | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  | #ifdef BH_PLATFORM_WINDOWS | ||||||
|  |     if (!os_mem_commit(sections, code_size, | ||||||
|  |                        MMAP_PROT_READ | MMAP_PROT_WRITE | MMAP_PROT_EXEC)) { | ||||||
|  |         os_munmap(sections, (uint32)total_size); | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     /* change the code part to be executable */ |     /* change the code part to be executable */ | ||||||
|     if (os_mprotect(sections, code_size, |     if (os_mprotect(sections, code_size, | ||||||
|                     MMAP_PROT_READ | MMAP_PROT_WRITE | MMAP_PROT_EXEC) |                     MMAP_PROT_READ | MMAP_PROT_WRITE | MMAP_PROT_EXEC) | ||||||
|  | @ -2629,7 +2534,7 @@ try_merge_data_and_text(const uint8 **buf, const uint8 **buf_end, | ||||||
|     /* order not essential just as compiler does: .text section first */ |     /* order not essential just as compiler does: .text section first */ | ||||||
|     *buf = sections; |     *buf = sections; | ||||||
|     *buf_end = sections + code_size; |     *buf_end = sections + code_size; | ||||||
|     bh_memcpy_s(sections, code_size, old_buf, code_size); |     bh_memcpy_s(sections, (uint32)code_size, old_buf, (uint32)code_size); | ||||||
|     os_munmap(old_buf, code_size); |     os_munmap(old_buf, code_size); | ||||||
|     sections += align_uint((uint32)code_size, page_size); |     sections += align_uint((uint32)code_size, page_size); | ||||||
| 
 | 
 | ||||||
|  | @ -2847,6 +2752,48 @@ destroy_exports(AOTExport *exports) | ||||||
|     wasm_runtime_free(exports); |     wasm_runtime_free(exports); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int | ||||||
|  | cmp_export_name(const void *a, const void *b) | ||||||
|  | { | ||||||
|  |     return strcmp(*(char **)a, *(char **)b); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static bool | ||||||
|  | check_duplicate_exports(AOTModule *module, char *error_buf, | ||||||
|  |                         uint32 error_buf_size) | ||||||
|  | { | ||||||
|  |     uint32 i; | ||||||
|  |     bool result = false; | ||||||
|  |     char *names_buf[32], **names = names_buf; | ||||||
|  |     if (module->export_count > 32) { | ||||||
|  |         names = loader_malloc(module->export_count * sizeof(char *), error_buf, | ||||||
|  |                               error_buf_size); | ||||||
|  |         if (!names) { | ||||||
|  |             return result; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     for (i = 0; i < module->export_count; i++) { | ||||||
|  |         names[i] = module->exports[i].name; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     qsort(names, module->export_count, sizeof(char *), cmp_export_name); | ||||||
|  | 
 | ||||||
|  |     for (i = 1; i < module->export_count; i++) { | ||||||
|  |         if (!strcmp(names[i], names[i - 1])) { | ||||||
|  |             set_error_buf(error_buf, error_buf_size, "duplicate export name"); | ||||||
|  |             goto cleanup; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     result = true; | ||||||
|  | cleanup: | ||||||
|  |     if (module->export_count > 32) { | ||||||
|  |         wasm_runtime_free(names); | ||||||
|  |     } | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static bool | static bool | ||||||
| load_exports(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, | load_exports(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, | ||||||
|              bool is_load_from_file_buf, char *error_buf, uint32 error_buf_size) |              bool is_load_from_file_buf, char *error_buf, uint32 error_buf_size) | ||||||
|  | @ -2868,14 +2815,58 @@ load_exports(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module, | ||||||
|         read_uint32(buf, buf_end, exports[i].index); |         read_uint32(buf, buf_end, exports[i].index); | ||||||
|         read_uint8(buf, buf_end, exports[i].kind); |         read_uint8(buf, buf_end, exports[i].kind); | ||||||
|         read_string(buf, buf_end, exports[i].name); |         read_string(buf, buf_end, exports[i].name); | ||||||
| #if 0 /* TODO: check kind and index */
 | 
 | ||||||
|         if (export_funcs[i].index >= |         /* Check export kind and index */ | ||||||
|               module->func_count + module->import_func_count) { |         switch (exports[i].kind) { | ||||||
|  |             case EXPORT_KIND_FUNC: | ||||||
|  |                 if (exports[i].index | ||||||
|  |                     >= module->import_func_count + module->func_count) { | ||||||
|                     set_error_buf(error_buf, error_buf_size, |                     set_error_buf(error_buf, error_buf_size, | ||||||
|                           "function index is out of range"); |                                   "unknown function"); | ||||||
|                     return false; |                     return false; | ||||||
|                 } |                 } | ||||||
|  |                 break; | ||||||
|  |             case EXPORT_KIND_TABLE: | ||||||
|  |                 if (exports[i].index | ||||||
|  |                     >= module->import_table_count + module->table_count) { | ||||||
|  |                     set_error_buf(error_buf, error_buf_size, "unknown table"); | ||||||
|  |                     return false; | ||||||
|  |                 } | ||||||
|  |                 break; | ||||||
|  |             case EXPORT_KIND_MEMORY: | ||||||
|  |                 if (exports[i].index | ||||||
|  |                     >= module->import_memory_count + module->memory_count) { | ||||||
|  |                     set_error_buf(error_buf, error_buf_size, "unknown memory"); | ||||||
|  |                     return false; | ||||||
|  |                 } | ||||||
|  |                 break; | ||||||
|  |             case EXPORT_KIND_GLOBAL: | ||||||
|  |                 if (exports[i].index | ||||||
|  |                     >= module->import_global_count + module->global_count) { | ||||||
|  |                     set_error_buf(error_buf, error_buf_size, "unknown global"); | ||||||
|  |                     return false; | ||||||
|  |                 } | ||||||
|  |                 break; | ||||||
|  | #if WASM_ENABLE_TAGS != 0 | ||||||
|  |                 /* TODO
 | ||||||
|  |                 case EXPORT_KIND_TAG: | ||||||
|  |                     if (index >= module->import_tag_count + module->tag_count) { | ||||||
|  |                         set_error_buf(error_buf, error_buf_size, "unknown tag"); | ||||||
|  |                         return false; | ||||||
|  |                     } | ||||||
|  |                     break; | ||||||
|  |                 */ | ||||||
| #endif | #endif | ||||||
|  |             default: | ||||||
|  |                 set_error_buf(error_buf, error_buf_size, "invalid export kind"); | ||||||
|  |                 return false; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (module->export_count > 0) { | ||||||
|  |         if (!check_duplicate_exports(module, error_buf, error_buf_size)) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     *p_buf = buf; |     *p_buf = buf; | ||||||
|  | @ -3819,7 +3810,7 @@ has_module_memory64(AOTModule *module) | ||||||
| 
 | 
 | ||||||
| static bool | static bool | ||||||
| load_from_sections(AOTModule *module, AOTSection *sections, | load_from_sections(AOTModule *module, AOTSection *sections, | ||||||
|                    bool is_load_from_file_buf, char *error_buf, |                    bool is_load_from_file_buf, bool no_resolve, char *error_buf, | ||||||
|                    uint32 error_buf_size) |                    uint32 error_buf_size) | ||||||
| { | { | ||||||
|     AOTSection *section = sections; |     AOTSection *section = sections; | ||||||
|  | @ -3852,8 +3843,8 @@ load_from_sections(AOTModule *module, AOTSection *sections, | ||||||
|                 break; |                 break; | ||||||
|             case AOT_SECTION_TYPE_INIT_DATA: |             case AOT_SECTION_TYPE_INIT_DATA: | ||||||
|                 if (!load_init_data_section(buf, buf_end, module, |                 if (!load_init_data_section(buf, buf_end, module, | ||||||
|                                             is_load_from_file_buf, error_buf, |                                             is_load_from_file_buf, no_resolve, | ||||||
|                                             error_buf_size)) |                                             error_buf, error_buf_size)) | ||||||
|                     return false; |                     return false; | ||||||
|                 break; |                 break; | ||||||
|             case AOT_SECTION_TYPE_TEXT: |             case AOT_SECTION_TYPE_TEXT: | ||||||
|  | @ -4076,7 +4067,7 @@ aot_load_from_sections(AOTSection *section_list, char *error_buf, | ||||||
|     if (!module) |     if (!module) | ||||||
|         return NULL; |         return NULL; | ||||||
| 
 | 
 | ||||||
|     if (!load_from_sections(module, section_list, false, error_buf, |     if (!load_from_sections(module, section_list, false, false, error_buf, | ||||||
|                             error_buf_size)) { |                             error_buf_size)) { | ||||||
|         aot_unload(module); |         aot_unload(module); | ||||||
|         return NULL; |         return NULL; | ||||||
|  | @ -4246,7 +4237,8 @@ fail: | ||||||
| 
 | 
 | ||||||
| static bool | static bool | ||||||
| load(const uint8 *buf, uint32 size, AOTModule *module, | load(const uint8 *buf, uint32 size, AOTModule *module, | ||||||
|      bool wasm_binary_freeable, char *error_buf, uint32 error_buf_size) |      bool wasm_binary_freeable, bool no_resolve, char *error_buf, | ||||||
|  |      uint32 error_buf_size) | ||||||
| { | { | ||||||
|     const uint8 *buf_end = buf + size; |     const uint8 *buf_end = buf + size; | ||||||
|     const uint8 *p = buf, *p_end = buf_end; |     const uint8 *p = buf, *p_end = buf_end; | ||||||
|  | @ -4273,7 +4265,7 @@ load(const uint8 *buf, uint32 size, AOTModule *module, | ||||||
|         return false; |         return false; | ||||||
| 
 | 
 | ||||||
|     ret = load_from_sections(module, section_list, !wasm_binary_freeable, |     ret = load_from_sections(module, section_list, !wasm_binary_freeable, | ||||||
|                              error_buf, error_buf_size); |                              no_resolve, error_buf, error_buf_size); | ||||||
|     if (!ret) { |     if (!ret) { | ||||||
|         /* If load_from_sections() fails, then aot text is destroyed
 |         /* If load_from_sections() fails, then aot text is destroyed
 | ||||||
|            in destroy_sections() */ |            in destroy_sections() */ | ||||||
|  | @ -4321,8 +4313,8 @@ aot_load_from_aot_file(const uint8 *buf, uint32 size, const LoadArgs *args, | ||||||
|         return NULL; |         return NULL; | ||||||
| 
 | 
 | ||||||
|     os_thread_jit_write_protect_np(false); /* Make memory writable */ |     os_thread_jit_write_protect_np(false); /* Make memory writable */ | ||||||
|     if (!load(buf, size, module, args->wasm_binary_freeable, error_buf, |     if (!load(buf, size, module, args->wasm_binary_freeable, args->no_resolve, | ||||||
|               error_buf_size)) { |               error_buf, error_buf_size)) { | ||||||
|         aot_unload(module); |         aot_unload(module); | ||||||
|         return NULL; |         return NULL; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -57,6 +57,9 @@ bh_static_assert(sizeof(AOTMemoryInstance) == 120); | ||||||
| bh_static_assert(offsetof(AOTTableInstance, elems) == 24); | bh_static_assert(offsetof(AOTTableInstance, elems) == 24); | ||||||
| 
 | 
 | ||||||
| bh_static_assert(offsetof(AOTModuleInstanceExtra, stack_sizes) == 0); | bh_static_assert(offsetof(AOTModuleInstanceExtra, stack_sizes) == 0); | ||||||
|  | bh_static_assert(offsetof(AOTModuleInstanceExtra, shared_heap_base_addr_adj) | ||||||
|  |                  == 8); | ||||||
|  | bh_static_assert(offsetof(AOTModuleInstanceExtra, shared_heap_start_off) == 16); | ||||||
| 
 | 
 | ||||||
| bh_static_assert(sizeof(CApiFuncImport) == sizeof(uintptr_t) * 3); | bh_static_assert(sizeof(CApiFuncImport) == sizeof(uintptr_t) * 3); | ||||||
| 
 | 
 | ||||||
|  | @ -134,6 +137,17 @@ is_frame_per_function(WASMExecEnv *exec_env) | ||||||
|     return module->feature_flags & WASM_FEATURE_FRAME_PER_FUNCTION; |     return module->feature_flags & WASM_FEATURE_FRAME_PER_FUNCTION; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_DUMP_CALL_STACK != 0 | ||||||
|  | static bool | ||||||
|  | is_frame_func_idx_disabled(WASMExecEnv *exec_env) | ||||||
|  | { | ||||||
|  |     AOTModule *module = | ||||||
|  |         (AOTModule *)((AOTModuleInstance *)exec_env->module_inst)->module; | ||||||
|  | 
 | ||||||
|  |     return module->feature_flags & WASM_FEATURE_FRAME_NO_FUNC_IDX; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| static void * | static void * | ||||||
| get_top_frame(WASMExecEnv *exec_env) | get_top_frame(WASMExecEnv *exec_env) | ||||||
| { | { | ||||||
|  | @ -728,18 +742,24 @@ tables_instantiate(AOTModuleInstance *module_inst, AOTModule *module, | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_REF_TYPES != 0 | #if WASM_ENABLE_REF_TYPES != 0 | ||||||
|         bh_assert( |         bh_assert( | ||||||
|             table_seg->offset.init_expr_type == INIT_EXPR_TYPE_I32_CONST |             table_seg->offset.init_expr_type | ||||||
|  |                 == (tbl_inst->is_table64 ? INIT_EXPR_TYPE_I64_CONST | ||||||
|  |                                          : INIT_EXPR_TYPE_I32_CONST) | ||||||
|             || table_seg->offset.init_expr_type == INIT_EXPR_TYPE_GET_GLOBAL |             || table_seg->offset.init_expr_type == INIT_EXPR_TYPE_GET_GLOBAL | ||||||
|             || table_seg->offset.init_expr_type == INIT_EXPR_TYPE_FUNCREF_CONST |             || table_seg->offset.init_expr_type == INIT_EXPR_TYPE_FUNCREF_CONST | ||||||
|             || table_seg->offset.init_expr_type |             || table_seg->offset.init_expr_type | ||||||
|                    == INIT_EXPR_TYPE_REFNULL_CONST); |                    == INIT_EXPR_TYPE_REFNULL_CONST); | ||||||
| #else | #else | ||||||
|         bh_assert(table_seg->offset.init_expr_type == INIT_EXPR_TYPE_I32_CONST |         bh_assert(table_seg->offset.init_expr_type | ||||||
|  |                       == (tbl_inst->is_table64 ? INIT_EXPR_TYPE_I64_CONST | ||||||
|  |                                                : INIT_EXPR_TYPE_I32_CONST) | ||||||
|                   || table_seg->offset.init_expr_type |                   || table_seg->offset.init_expr_type | ||||||
|                          == INIT_EXPR_TYPE_GET_GLOBAL); |                          == INIT_EXPR_TYPE_GET_GLOBAL); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|         /* Resolve table data base offset */ |         /* Resolve table data base offset */ | ||||||
|  |         /* TODO: The table64 current implementation assumes table max size
 | ||||||
|  |          * UINT32_MAX, so the offset conversion here is safe */ | ||||||
|         if (table_seg->offset.init_expr_type == INIT_EXPR_TYPE_GET_GLOBAL) { |         if (table_seg->offset.init_expr_type == INIT_EXPR_TYPE_GET_GLOBAL) { | ||||||
|             global_index = table_seg->offset.u.global_index; |             global_index = table_seg->offset.u.global_index; | ||||||
| 
 | 
 | ||||||
|  | @ -1049,7 +1069,24 @@ fail1: | ||||||
|     return NULL; |     return NULL; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static AOTMemoryInstance * | AOTMemoryInstance * | ||||||
|  | aot_lookup_memory(AOTModuleInstance *module_inst, char const *name) | ||||||
|  | { | ||||||
|  | #if WASM_ENABLE_MULTI_MEMORY != 0 | ||||||
|  |     uint32 i; | ||||||
|  |     for (i = 0; i < module_inst->export_memory_count; i++) | ||||||
|  |         if (!strcmp(module_inst->export_memories[i].name, name)) | ||||||
|  |             return module_inst->export_memories[i].memory; | ||||||
|  |     return NULL; | ||||||
|  | #else | ||||||
|  |     (void)module_inst->export_memories; | ||||||
|  |     if (!module_inst->memories) | ||||||
|  |         return NULL; | ||||||
|  |     return module_inst->memories[0]; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | AOTMemoryInstance * | ||||||
| aot_get_default_memory(AOTModuleInstance *module_inst) | aot_get_default_memory(AOTModuleInstance *module_inst) | ||||||
| { | { | ||||||
|     if (module_inst->memories) |     if (module_inst->memories) | ||||||
|  | @ -1058,6 +1095,14 @@ aot_get_default_memory(AOTModuleInstance *module_inst) | ||||||
|         return NULL; |         return NULL; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | AOTMemoryInstance * | ||||||
|  | aot_get_memory_with_index(AOTModuleInstance *module_inst, uint32 index) | ||||||
|  | { | ||||||
|  |     if ((index >= module_inst->memory_count) || !module_inst->memories) | ||||||
|  |         return NULL; | ||||||
|  |     return module_inst->memories[index]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static bool | static bool | ||||||
| memories_instantiate(AOTModuleInstance *module_inst, AOTModuleInstance *parent, | memories_instantiate(AOTModuleInstance *module_inst, AOTModuleInstance *parent, | ||||||
|                      AOTModule *module, uint32 heap_size, |                      AOTModule *module, uint32 heap_size, | ||||||
|  | @ -1334,6 +1379,15 @@ init_func_type_indexes(AOTModuleInstance *module_inst, AOTModule *module, | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int | ||||||
|  | cmp_func_inst(const void *a, const void *b) | ||||||
|  | { | ||||||
|  |     const AOTFunctionInstance *func_inst1 = (const AOTFunctionInstance *)a; | ||||||
|  |     const AOTFunctionInstance *func_inst2 = (const AOTFunctionInstance *)b; | ||||||
|  | 
 | ||||||
|  |     return strcmp(func_inst1->func_name, func_inst2->func_name); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static bool | static bool | ||||||
| create_export_funcs(AOTModuleInstance *module_inst, AOTModule *module, | create_export_funcs(AOTModuleInstance *module_inst, AOTModule *module, | ||||||
|                     char *error_buf, uint32 error_buf_size) |                     char *error_buf, uint32 error_buf_size) | ||||||
|  | @ -1374,11 +1428,44 @@ create_export_funcs(AOTModuleInstance *module_inst, AOTModule *module, | ||||||
|                 export_func++; |                 export_func++; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         qsort(module_inst->export_functions, module_inst->export_func_count, | ||||||
|  |               sizeof(AOTFunctionInstance), cmp_func_inst); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_MULTI_MEMORY != 0 | ||||||
|  | static WASMExportMemInstance * | ||||||
|  | export_memories_instantiate(const AOTModule *module, | ||||||
|  |                             AOTModuleInstance *module_inst, | ||||||
|  |                             uint32 export_mem_count, char *error_buf, | ||||||
|  |                             uint32 error_buf_size) | ||||||
|  | { | ||||||
|  |     WASMExportMemInstance *export_memories, *export_memory; | ||||||
|  |     AOTExport *export = module->exports; | ||||||
|  |     uint32 i; | ||||||
|  |     uint64 total_size = | ||||||
|  |         sizeof(WASMExportMemInstance) * (uint64)export_mem_count; | ||||||
|  | 
 | ||||||
|  |     if (!(export_memory = export_memories = | ||||||
|  |               runtime_malloc(total_size, error_buf, error_buf_size))) { | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     for (i = 0; i < module->export_count; i++, export ++) | ||||||
|  |         if (export->kind == EXPORT_KIND_MEMORY) { | ||||||
|  |             export_memory->name = export->name; | ||||||
|  |             export_memory->memory = module_inst->memories[export->index]; | ||||||
|  |             export_memory++; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     bh_assert((uint32)(export_memory - export_memories) == export_mem_count); | ||||||
|  |     return export_memories; | ||||||
|  | } | ||||||
|  | #endif /* end of if WASM_ENABLE_MULTI_MEMORY != 0 */ | ||||||
|  | 
 | ||||||
| static bool | static bool | ||||||
| create_exports(AOTModuleInstance *module_inst, AOTModule *module, | create_exports(AOTModuleInstance *module_inst, AOTModule *module, | ||||||
|                char *error_buf, uint32 error_buf_size) |                char *error_buf, uint32 error_buf_size) | ||||||
|  | @ -1405,6 +1492,17 @@ create_exports(AOTModuleInstance *module_inst, AOTModule *module, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_MULTI_MEMORY != 0 | ||||||
|  |     if (module_inst->export_memory_count) { | ||||||
|  |         module_inst->export_memories = export_memories_instantiate( | ||||||
|  |             module, module_inst, module_inst->export_memory_count, error_buf, | ||||||
|  |             error_buf_size); | ||||||
|  |         if (!module_inst->export_memories) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     return create_export_funcs(module_inst, module, error_buf, error_buf_size); |     return create_export_funcs(module_inst, module, error_buf, error_buf_size); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1483,8 +1581,12 @@ execute_post_instantiate_functions(AOTModuleInstance *module_inst, | ||||||
|     if (is_sub_inst) { |     if (is_sub_inst) { | ||||||
|         bh_assert(exec_env_main); |         bh_assert(exec_env_main); | ||||||
| #ifdef OS_ENABLE_HW_BOUND_CHECK | #ifdef OS_ENABLE_HW_BOUND_CHECK | ||||||
|  |         /* May come from pthread_create_wrapper, thread_spawn_wrapper and
 | ||||||
|  |            wasm_cluster_spawn_exec_env. If it comes from the former two, | ||||||
|  |            the exec_env_tls must be not NULL and equal to exec_env_main, | ||||||
|  |            else if it comes from the last one, it may be NULL. */ | ||||||
|  |         if (exec_env_tls) | ||||||
|             bh_assert(exec_env_tls == exec_env_main); |             bh_assert(exec_env_tls == exec_env_main); | ||||||
|         (void)exec_env_tls; |  | ||||||
| #endif | #endif | ||||||
|         exec_env = exec_env_main; |         exec_env = exec_env_main; | ||||||
| 
 | 
 | ||||||
|  | @ -1808,6 +1910,24 @@ aot_instantiate(AOTModule *module, AOTModuleInstance *parent, | ||||||
|     extra->stack_sizes = |     extra->stack_sizes = | ||||||
|         aot_get_data_section_addr(module, AOT_STACK_SIZES_SECTION_NAME, NULL); |         aot_get_data_section_addr(module, AOT_STACK_SIZES_SECTION_NAME, NULL); | ||||||
| 
 | 
 | ||||||
|  |     /*
 | ||||||
|  |      * The AOT code checks whether the n bytes to access are in shared heap | ||||||
|  |      * by checking whether the beginning address meets: | ||||||
|  |      *   addr >= start_off && addr <= end_off - n-bytes + 1 | ||||||
|  |      * where n is 1/2/4/8/16 and `end_off - n-bytes + 1` is constant, e.g., | ||||||
|  |      *   UINT32_MAX, UINT32_MAX-1, UINT32_MAX-3 for n = 1, 2 or 4 in 32-bit | ||||||
|  |      * target. To simplify the check, when shared heap is disabled, we set | ||||||
|  |      * the start off to UINT64_MAX in 64-bit target and UINT32_MAX in 32-bit | ||||||
|  |      * target, so in the checking, the above formula will be false, we don't | ||||||
|  |      * need to check whether the shared heap is enabled or not in the AOT | ||||||
|  |      * code. | ||||||
|  |      */ | ||||||
|  | #if UINTPTR_MAX == UINT64_MAX | ||||||
|  |     extra->shared_heap_start_off.u64 = UINT64_MAX; | ||||||
|  | #else | ||||||
|  |     extra->shared_heap_start_off.u32[0] = UINT32_MAX; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #if WASM_ENABLE_PERF_PROFILING != 0 | #if WASM_ENABLE_PERF_PROFILING != 0 | ||||||
|     total_size = sizeof(AOTFuncPerfProfInfo) |     total_size = sizeof(AOTFuncPerfProfInfo) | ||||||
|                  * ((uint64)module->import_func_count + module->func_count); |                  * ((uint64)module->import_func_count + module->func_count); | ||||||
|  | @ -2048,6 +2168,11 @@ aot_deinstantiate(AOTModuleInstance *module_inst, bool is_sub_inst) | ||||||
|     if (module_inst->export_functions) |     if (module_inst->export_functions) | ||||||
|         wasm_runtime_free(module_inst->export_functions); |         wasm_runtime_free(module_inst->export_functions); | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_MULTI_MEMORY != 0 | ||||||
|  |     if (module_inst->export_memories) | ||||||
|  |         wasm_runtime_free(module_inst->export_memories); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     if (extra->functions) { |     if (extra->functions) { | ||||||
|         uint32 func_idx; |         uint32 func_idx; | ||||||
|         for (func_idx = 0; func_idx < extra->function_count; ++func_idx) { |         for (func_idx = 0; func_idx < extra->function_count; ++func_idx) { | ||||||
|  | @ -2093,14 +2218,15 @@ aot_deinstantiate(AOTModuleInstance *module_inst, bool is_sub_inst) | ||||||
| AOTFunctionInstance * | AOTFunctionInstance * | ||||||
| aot_lookup_function(const AOTModuleInstance *module_inst, const char *name) | aot_lookup_function(const AOTModuleInstance *module_inst, const char *name) | ||||||
| { | { | ||||||
|     uint32 i; |  | ||||||
|     AOTFunctionInstance *export_funcs = |     AOTFunctionInstance *export_funcs = | ||||||
|         (AOTFunctionInstance *)module_inst->export_functions; |         (AOTFunctionInstance *)module_inst->export_functions; | ||||||
|  |     AOTFunctionInstance key = { .func_name = (char *)name }; | ||||||
| 
 | 
 | ||||||
|     for (i = 0; i < module_inst->export_func_count; i++) |     if (!export_funcs) | ||||||
|         if (!strcmp(export_funcs[i].func_name, name)) |  | ||||||
|             return &export_funcs[i]; |  | ||||||
|         return NULL; |         return NULL; | ||||||
|  | 
 | ||||||
|  |     return bsearch(&key, export_funcs, module_inst->export_func_count, | ||||||
|  |                    sizeof(AOTFunctionInstance), cmp_func_inst); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #ifdef OS_ENABLE_HW_BOUND_CHECK | #ifdef OS_ENABLE_HW_BOUND_CHECK | ||||||
|  | @ -3952,7 +4078,7 @@ aot_create_call_stack(struct WASMExecEnv *exec_env) | ||||||
| #endif | #endif | ||||||
|         } |         } | ||||||
|         WASMCApiFrame frame = { 0 }; |         WASMCApiFrame frame = { 0 }; | ||||||
|         uint32 max_local_cell_num, max_stack_cell_num; |         uint32 max_local_cell_num = 0, max_stack_cell_num = 0; | ||||||
|         uint32 all_cell_num, lp_size; |         uint32 all_cell_num, lp_size; | ||||||
| 
 | 
 | ||||||
|         frame.instance = module_inst; |         frame.instance = module_inst; | ||||||
|  | @ -3961,17 +4087,21 @@ aot_create_call_stack(struct WASMExecEnv *exec_env) | ||||||
|         frame.func_offset = ip_offset; |         frame.func_offset = ip_offset; | ||||||
|         frame.func_name_wp = get_func_name_from_index(module_inst, func_index); |         frame.func_name_wp = get_func_name_from_index(module_inst, func_index); | ||||||
| 
 | 
 | ||||||
|  |         if (!is_frame_func_idx_disabled(exec_env)) { | ||||||
|             if (func_index >= module->import_func_count) { |             if (func_index >= module->import_func_count) { | ||||||
|                 uint32 aot_func_idx = func_index - module->import_func_count; |                 uint32 aot_func_idx = func_index - module->import_func_count; | ||||||
|                 max_local_cell_num = module->max_local_cell_nums[aot_func_idx]; |                 max_local_cell_num = module->max_local_cell_nums[aot_func_idx]; | ||||||
|                 max_stack_cell_num = module->max_stack_cell_nums[aot_func_idx]; |                 max_stack_cell_num = module->max_stack_cell_nums[aot_func_idx]; | ||||||
|             } |             } | ||||||
|             else { |             else { | ||||||
|             AOTFuncType *func_type = module->import_funcs[func_index].func_type; |                 AOTFuncType *func_type = | ||||||
|             max_local_cell_num = |                     module->import_funcs[func_index].func_type; | ||||||
|                 func_type->param_cell_num > 2 ? func_type->param_cell_num : 2; |                 max_local_cell_num = func_type->param_cell_num > 2 | ||||||
|  |                                          ? func_type->param_cell_num | ||||||
|  |                                          : 2; | ||||||
|                 max_stack_cell_num = 0; |                 max_stack_cell_num = 0; | ||||||
|             } |             } | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         all_cell_num = max_local_cell_num + max_stack_cell_num; |         all_cell_num = max_local_cell_num + max_stack_cell_num; | ||||||
| #if WASM_ENABLE_GC == 0 | #if WASM_ENABLE_GC == 0 | ||||||
|  | @ -4986,6 +5116,18 @@ aot_const_str_set_insert(const uint8 *str, int32 len, AOTModule *module, | ||||||
|     return c_str; |     return c_str; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_DYNAMIC_AOT_DEBUG != 0 | ||||||
|  | AOTModule *g_dynamic_aot_module = NULL; | ||||||
|  | 
 | ||||||
|  | void __attribute__((noinline)) __enable_dynamic_aot_debug(void) | ||||||
|  | { | ||||||
|  |     /* empty implementation. */ | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void (*__enable_dynamic_aot_debug_ptr)(void) | ||||||
|  |     __attribute__((visibility("default"))) = __enable_dynamic_aot_debug; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| bool | bool | ||||||
| aot_set_module_name(AOTModule *module, const char *name, char *error_buf, | aot_set_module_name(AOTModule *module, const char *name, char *error_buf, | ||||||
|                     uint32_t error_buf_size) |                     uint32_t error_buf_size) | ||||||
|  | @ -4999,6 +5141,12 @@ aot_set_module_name(AOTModule *module, const char *name, char *error_buf, | ||||||
|                                             false, |                                             false, | ||||||
| #endif | #endif | ||||||
|                                             error_buf, error_buf_size); |                                             error_buf, error_buf_size); | ||||||
|  | #if WASM_ENABLE_DYNAMIC_AOT_DEBUG != 0 | ||||||
|  |     /* export g_dynamic_aot_module for dynamic aot debug */ | ||||||
|  |     g_dynamic_aot_module = module; | ||||||
|  |     /* trigger breakpoint __enable_dynamic_aot_debug */ | ||||||
|  |     (*__enable_dynamic_aot_debug_ptr)(); | ||||||
|  | #endif | ||||||
|     return module->name != NULL; |     return module->name != NULL; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -5007,3 +5155,125 @@ aot_get_module_name(AOTModule *module) | ||||||
| { | { | ||||||
|     return module->name; |     return module->name; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | bool | ||||||
|  | aot_resolve_symbols(AOTModule *module) | ||||||
|  | { | ||||||
|  |     bool ret = true; | ||||||
|  |     uint32 idx; | ||||||
|  |     for (idx = 0; idx < module->import_func_count; ++idx) { | ||||||
|  |         AOTImportFunc *aot_import_func = &module->import_funcs[idx]; | ||||||
|  |         if (!aot_import_func->func_ptr_linked) { | ||||||
|  |             if (!aot_resolve_import_func(module, aot_import_func)) { | ||||||
|  |                 LOG_WARNING("Failed to link function (%s, %s)", | ||||||
|  |                             aot_import_func->module_name, | ||||||
|  |                             aot_import_func->func_name); | ||||||
|  |                 ret = false; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #if WASM_ENABLE_MULTI_MODULE != 0 | ||||||
|  | static void * | ||||||
|  | aot_resolve_function(const AOTModule *module, const char *function_name, | ||||||
|  |                      const AOTFuncType *expected_function_type, char *error_buf, | ||||||
|  |                      uint32 error_buf_size); | ||||||
|  | 
 | ||||||
|  | static void * | ||||||
|  | aot_resolve_function_ex(const char *module_name, const char *function_name, | ||||||
|  |                         const AOTFuncType *expected_function_type, | ||||||
|  |                         char *error_buf, uint32 error_buf_size) | ||||||
|  | { | ||||||
|  |     WASMModuleCommon *module_reg; | ||||||
|  | 
 | ||||||
|  |     module_reg = wasm_runtime_find_module_registered(module_name); | ||||||
|  |     if (!module_reg || module_reg->module_type != Wasm_Module_AoT) { | ||||||
|  |         LOG_DEBUG("can not find a module named %s for function %s", module_name, | ||||||
|  |                   function_name); | ||||||
|  |         set_error_buf(error_buf, error_buf_size, "unknown import"); | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
|  |     return aot_resolve_function((AOTModule *)module_reg, function_name, | ||||||
|  |                                 expected_function_type, error_buf, | ||||||
|  |                                 error_buf_size); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void * | ||||||
|  | aot_resolve_function(const AOTModule *module, const char *function_name, | ||||||
|  |                      const AOTFuncType *expected_function_type, char *error_buf, | ||||||
|  |                      uint32 error_buf_size) | ||||||
|  | { | ||||||
|  |     void *function = NULL; | ||||||
|  |     AOTExport *export = NULL; | ||||||
|  |     AOTFuncType *target_function_type = NULL; | ||||||
|  | 
 | ||||||
|  |     export = loader_find_export((WASMModuleCommon *)module, module->name, | ||||||
|  |                                 function_name, EXPORT_KIND_FUNC, error_buf, | ||||||
|  |                                 error_buf_size); | ||||||
|  |     if (!export) { | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* resolve function type and function */ | ||||||
|  |     if (export->index < module->import_func_count) { | ||||||
|  |         target_function_type = module->import_funcs[export->index].func_type; | ||||||
|  |         function = module->import_funcs[export->index].func_ptr_linked; | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         target_function_type = | ||||||
|  |             (AOTFuncType *)module | ||||||
|  |                 ->types[module->func_type_indexes[export->index | ||||||
|  |                                                   - module->import_func_count]]; | ||||||
|  |         function = | ||||||
|  |             (module->func_ptrs[export->index - module->import_func_count]); | ||||||
|  |     } | ||||||
|  |     /* check function type */ | ||||||
|  |     if (!wasm_type_equal((WASMType *)expected_function_type, | ||||||
|  |                          (WASMType *)target_function_type, module->types, | ||||||
|  |                          module->type_count)) { | ||||||
|  |         LOG_DEBUG("%s.%s failed the type check", module->name, function_name); | ||||||
|  |         set_error_buf(error_buf, error_buf_size, "incompatible import type"); | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
|  |     return function; | ||||||
|  | } | ||||||
|  | #endif /* end of WASM_ENABLE_MULTI_MODULE */ | ||||||
|  | 
 | ||||||
|  | bool | ||||||
|  | aot_resolve_import_func(AOTModule *module, AOTImportFunc *import_func) | ||||||
|  | { | ||||||
|  | #if WASM_ENABLE_MULTI_MODULE != 0 | ||||||
|  |     char error_buf[128]; | ||||||
|  |     AOTModule *sub_module = NULL; | ||||||
|  | #endif | ||||||
|  |     import_func->func_ptr_linked = wasm_native_resolve_symbol( | ||||||
|  |         import_func->module_name, import_func->func_name, | ||||||
|  |         import_func->func_type, &import_func->signature, | ||||||
|  |         &import_func->attachment, &import_func->call_conv_raw); | ||||||
|  | #if WASM_ENABLE_MULTI_MODULE != 0 | ||||||
|  |     if (!import_func->func_ptr_linked) { | ||||||
|  |         if (!wasm_runtime_is_built_in_module(import_func->module_name)) { | ||||||
|  |             sub_module = (AOTModule *)wasm_runtime_load_depended_module( | ||||||
|  |                 (WASMModuleCommon *)module, import_func->module_name, error_buf, | ||||||
|  |                 sizeof(error_buf)); | ||||||
|  |             if (!sub_module) { | ||||||
|  |                 LOG_WARNING("Failed to load sub module: %s", error_buf); | ||||||
|  |             } | ||||||
|  |             if (!sub_module) | ||||||
|  |                 import_func->func_ptr_linked = aot_resolve_function_ex( | ||||||
|  |                     import_func->module_name, import_func->func_name, | ||||||
|  |                     import_func->func_type, error_buf, sizeof(error_buf)); | ||||||
|  |             else | ||||||
|  |                 import_func->func_ptr_linked = aot_resolve_function( | ||||||
|  |                     sub_module, import_func->func_name, import_func->func_type, | ||||||
|  |                     error_buf, sizeof(error_buf)); | ||||||
|  |             if (!import_func->func_ptr_linked) { | ||||||
|  |                 LOG_WARNING("Failed to link function: %s", error_buf); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  |     return import_func->func_ptr_linked != NULL; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -34,6 +34,7 @@ extern "C" { | ||||||
| /* Stack frame is created at the beginning of the function,
 | /* Stack frame is created at the beginning of the function,
 | ||||||
|  * and not at the beginning of each function call */ |  * and not at the beginning of each function call */ | ||||||
| #define WASM_FEATURE_FRAME_PER_FUNCTION (1 << 12) | #define WASM_FEATURE_FRAME_PER_FUNCTION (1 << 12) | ||||||
|  | #define WASM_FEATURE_FRAME_NO_FUNC_IDX (1 << 13) | ||||||
| 
 | 
 | ||||||
| typedef enum AOTSectionType { | typedef enum AOTSectionType { | ||||||
|     AOT_SECTION_TYPE_TARGET_INFO = 0, |     AOT_SECTION_TYPE_TARGET_INFO = 0, | ||||||
|  | @ -110,6 +111,14 @@ typedef struct AOTFunctionInstance { | ||||||
| 
 | 
 | ||||||
| typedef struct AOTModuleInstanceExtra { | typedef struct AOTModuleInstanceExtra { | ||||||
|     DefPointer(const uint32 *, stack_sizes); |     DefPointer(const uint32 *, stack_sizes); | ||||||
|  |     /*
 | ||||||
|  |      * Adjusted shared heap based addr to simple the calculation | ||||||
|  |      * in the aot code. The value is: | ||||||
|  |      *   shared_heap->base_addr - shared_heap->start_off | ||||||
|  |      */ | ||||||
|  |     DefPointer(uint8 *, shared_heap_base_addr_adj); | ||||||
|  |     MemBound shared_heap_start_off; | ||||||
|  | 
 | ||||||
|     WASMModuleInstanceExtraCommon common; |     WASMModuleInstanceExtraCommon common; | ||||||
|     AOTFunctionInstance **functions; |     AOTFunctionInstance **functions; | ||||||
|     uint32 function_count; |     uint32 function_count; | ||||||
|  | @ -118,6 +127,10 @@ typedef struct AOTModuleInstanceExtra { | ||||||
|     bh_list *sub_module_inst_list; |     bh_list *sub_module_inst_list; | ||||||
|     WASMModuleInstanceCommon **import_func_module_insts; |     WASMModuleInstanceCommon **import_func_module_insts; | ||||||
| #endif | #endif | ||||||
|  | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     WASMSharedHeap *shared_heap; | ||||||
|  | #endif | ||||||
| } AOTModuleInstanceExtra; | } AOTModuleInstanceExtra; | ||||||
| 
 | 
 | ||||||
| #if defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64) | #if defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64) | ||||||
|  | @ -491,6 +504,18 @@ aot_load_from_sections(AOTSection *section_list, char *error_buf, | ||||||
| void | void | ||||||
| aot_unload(AOTModule *module); | aot_unload(AOTModule *module); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * Resolve symbols for an AOT module | ||||||
|  |  */ | ||||||
|  | bool | ||||||
|  | aot_resolve_symbols(AOTModule *module); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Helper function to resolve a single function | ||||||
|  |  */ | ||||||
|  | bool | ||||||
|  | aot_resolve_import_func(AOTModule *module, AOTImportFunc *import_func); | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Instantiate a AOT module. |  * Instantiate a AOT module. | ||||||
|  * |  * | ||||||
|  | @ -531,6 +556,15 @@ aot_deinstantiate(AOTModuleInstance *module_inst, bool is_sub_inst); | ||||||
| AOTFunctionInstance * | AOTFunctionInstance * | ||||||
| aot_lookup_function(const AOTModuleInstance *module_inst, const char *name); | aot_lookup_function(const AOTModuleInstance *module_inst, const char *name); | ||||||
| 
 | 
 | ||||||
|  | AOTMemoryInstance * | ||||||
|  | aot_lookup_memory(AOTModuleInstance *module_inst, char const *name); | ||||||
|  | 
 | ||||||
|  | AOTMemoryInstance * | ||||||
|  | aot_get_default_memory(AOTModuleInstance *module_inst); | ||||||
|  | 
 | ||||||
|  | AOTMemoryInstance * | ||||||
|  | aot_get_memory_with_index(AOTModuleInstance *module_inst, uint32 index); | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Get a function in the AOT module instance. |  * Get a function in the AOT module instance. | ||||||
|  * |  * | ||||||
|  |  | ||||||
|  | @ -24,6 +24,7 @@ | ||||||
| #undef NEED_SOFT_I32_DIV | #undef NEED_SOFT_I32_DIV | ||||||
| #undef NEED_SOFT_I64_MUL | #undef NEED_SOFT_I64_MUL | ||||||
| #undef NEED_SOFT_I64_DIV | #undef NEED_SOFT_I64_DIV | ||||||
|  | #undef NEED_SOFT_ATOMIC | ||||||
| 
 | 
 | ||||||
| #ifdef __riscv_flen | #ifdef __riscv_flen | ||||||
| #if __riscv_flen == 32 | #if __riscv_flen == 32 | ||||||
|  | @ -48,6 +49,10 @@ | ||||||
| #define NEED_SOFT_I64_DIV | #define NEED_SOFT_I64_DIV | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifndef __riscv_atomic | ||||||
|  | #define NEED_SOFT_ATOMIC | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| /* clang-format off */ | /* clang-format off */ | ||||||
| void __adddf3(void); | void __adddf3(void); | ||||||
| void __addsf3(void); | void __addsf3(void); | ||||||
|  | @ -101,6 +106,9 @@ void __umoddi3(void); | ||||||
| void __umodsi3(void); | void __umodsi3(void); | ||||||
| void __unorddf2(void); | void __unorddf2(void); | ||||||
| void __unordsf2(void); | void __unordsf2(void); | ||||||
|  | bool __atomic_compare_exchange_4(volatile void *, void *, unsigned int, | ||||||
|  |                                  bool, int, int); | ||||||
|  | void __atomic_store_4(volatile void *, unsigned int, int); | ||||||
| /* clang-format on */ | /* clang-format on */ | ||||||
| 
 | 
 | ||||||
| static SymbolMap target_sym_map[] = { | static SymbolMap target_sym_map[] = { | ||||||
|  | @ -127,6 +135,7 @@ static SymbolMap target_sym_map[] = { | ||||||
|      * to convert float and long long |      * to convert float and long long | ||||||
|      */ |      */ | ||||||
|     REG_SYM(__floatundisf), |     REG_SYM(__floatundisf), | ||||||
|  |     REG_SYM(__floatdisf), | ||||||
| #endif | #endif | ||||||
| #ifdef NEED_SOFT_DP | #ifdef NEED_SOFT_DP | ||||||
|     REG_SYM(__adddf3), |     REG_SYM(__adddf3), | ||||||
|  | @ -175,6 +184,10 @@ static SymbolMap target_sym_map[] = { | ||||||
|     REG_SYM(__moddi3), |     REG_SYM(__moddi3), | ||||||
|     REG_SYM(__udivdi3), |     REG_SYM(__udivdi3), | ||||||
|     REG_SYM(__umoddi3), |     REG_SYM(__umoddi3), | ||||||
|  | #endif | ||||||
|  | #ifdef NEED_SOFT_ATOMIC | ||||||
|  |     REG_SYM(__atomic_compare_exchange_4), | ||||||
|  |     REG_SYM(__atomic_store_4), | ||||||
| #endif | #endif | ||||||
|     /* clang-format on */ |     /* clang-format on */ | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -3391,8 +3391,7 @@ wasm_func_call(const wasm_func_t *func, const wasm_val_vec_t *params, | ||||||
|                 if (export->kind == EXPORT_KIND_FUNC) { |                 if (export->kind == EXPORT_KIND_FUNC) { | ||||||
|                     if (export->index == func->func_idx_rt) { |                     if (export->index == func->func_idx_rt) { | ||||||
|                         func_comm_rt = |                         func_comm_rt = | ||||||
|                             (AOTFunctionInstance *)inst_aot->export_functions |                             aot_lookup_function(inst_aot, export->name); | ||||||
|                             + export_func_j; |  | ||||||
|                         ((wasm_func_t *)func)->func_comm_rt = func_comm_rt; |                         ((wasm_func_t *)func)->func_comm_rt = func_comm_rt; | ||||||
|                         break; |                         break; | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|  | @ -282,6 +282,11 @@ wasm_exec_env_set_thread_info(WASMExecEnv *exec_env) | ||||||
|     os_mutex_lock(&exec_env->wait_lock); |     os_mutex_lock(&exec_env->wait_lock); | ||||||
| #endif | #endif | ||||||
|     exec_env->handle = os_self_thread(); |     exec_env->handle = os_self_thread(); | ||||||
|  |     if (exec_env->user_native_stack_boundary) | ||||||
|  |         /* WASM_STACK_GUARD_SIZE isn't added for flexibility to developer,
 | ||||||
|  |            he must ensure that enough guard bytes are kept. */ | ||||||
|  |         exec_env->native_stack_boundary = exec_env->user_native_stack_boundary; | ||||||
|  |     else | ||||||
|         exec_env->native_stack_boundary = |         exec_env->native_stack_boundary = | ||||||
|             stack_boundary ? stack_boundary + WASM_STACK_GUARD_SIZE : NULL; |             stack_boundary ? stack_boundary + WASM_STACK_GUARD_SIZE : NULL; | ||||||
|     exec_env->native_stack_top_min = (void *)UINTPTR_MAX; |     exec_env->native_stack_top_min = (void *)UINTPTR_MAX; | ||||||
|  |  | ||||||
|  | @ -136,6 +136,10 @@ typedef struct WASMExecEnv { | ||||||
| 
 | 
 | ||||||
|     void *user_data; |     void *user_data; | ||||||
| 
 | 
 | ||||||
|  |     /* The boundary of native stack set by host embedder. It is used
 | ||||||
|  |        if it is not NULL when calling wasm functions. */ | ||||||
|  |     uint8 *user_native_stack_boundary; | ||||||
|  | 
 | ||||||
|     /* The native thread handle of current thread */ |     /* The native thread handle of current thread */ | ||||||
|     korp_tid handle; |     korp_tid handle; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -19,6 +19,37 @@ wasm_loader_set_error_buf(char *error_buf, uint32 error_buf_size, | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  | bool | ||||||
|  | check_memory64_flags_consistency(WASMModule *module, char *error_buf, | ||||||
|  |                                  uint32 error_buf_size, bool is_aot) | ||||||
|  | { | ||||||
|  |     uint32 i; | ||||||
|  |     bool wasm64_flag, all_wasm64 = true, none_wasm64 = true; | ||||||
|  | 
 | ||||||
|  |     for (i = 0; i < module->import_memory_count; ++i) { | ||||||
|  |         wasm64_flag = | ||||||
|  |             module->import_memories[i].u.memory.mem_type.flags & MEMORY64_FLAG; | ||||||
|  |         all_wasm64 &= wasm64_flag; | ||||||
|  |         none_wasm64 &= !wasm64_flag; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     for (i = 0; i < module->memory_count; ++i) { | ||||||
|  |         wasm64_flag = module->memories[i].flags & MEMORY64_FLAG; | ||||||
|  |         all_wasm64 &= wasm64_flag; | ||||||
|  |         none_wasm64 &= !wasm64_flag; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (!(all_wasm64 || none_wasm64)) { | ||||||
|  |         wasm_loader_set_error_buf( | ||||||
|  |             error_buf, error_buf_size, | ||||||
|  |             "inconsistent limits wasm64 flags for memory sections", is_aot); | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |     return true; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| bool | bool | ||||||
| wasm_memory_check_flags(const uint8 mem_flag, char *error_buf, | wasm_memory_check_flags(const uint8 mem_flag, char *error_buf, | ||||||
|                         uint32 error_buf_size, bool is_aot) |                         uint32 error_buf_size, bool is_aot) | ||||||
|  | @ -60,6 +91,37 @@ wasm_memory_check_flags(const uint8 mem_flag, char *error_buf, | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | bool | ||||||
|  | wasm_table_check_flags(const uint8 table_flag, char *error_buf, | ||||||
|  |                        uint32 error_buf_size, bool is_aot) | ||||||
|  | { | ||||||
|  |     /* Check whether certain features indicated by mem_flag are enabled in
 | ||||||
|  |      * runtime */ | ||||||
|  |     if (table_flag > MAX_TABLE_SIZE_FLAG) { | ||||||
|  |         if (table_flag & SHARED_TABLE_FLAG) { | ||||||
|  |             wasm_loader_set_error_buf(error_buf, error_buf_size, | ||||||
|  |                                       "tables cannot be shared", is_aot); | ||||||
|  |         } | ||||||
|  | #if WASM_ENABLE_MEMORY64 == 0 | ||||||
|  |         if (table_flag & TABLE64_FLAG) { | ||||||
|  |             wasm_loader_set_error_buf(error_buf, error_buf_size, | ||||||
|  |                                       "invalid limits flags(table64 flag was " | ||||||
|  |                                       "found, please enable memory64)", | ||||||
|  |                                       is_aot); | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | #endif | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (table_flag > MAX_TABLE_SIZE_FLAG + TABLE64_FLAG) { | ||||||
|  |         wasm_loader_set_error_buf(error_buf, error_buf_size, | ||||||
|  |                                   "invalid limits flags", is_aot); | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * compare with a bigger type set in `wasm_value_type_size_internal()`, |  * compare with a bigger type set in `wasm_value_type_size_internal()`, | ||||||
|  * this function will only cover global value type, function's param |  * this function will only cover global value type, function's param | ||||||
|  |  | ||||||
|  | @ -13,10 +13,22 @@ | ||||||
| extern "C" { | extern "C" { | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  | /* check consistency of memory64 flags across all memories,
 | ||||||
|  |  * they must be either all wasm64 or all wasm32 */ | ||||||
|  | bool | ||||||
|  | check_memory64_flags_consistency(WASMModule *module, char *error_buf, | ||||||
|  |                                  uint32 error_buf_size, bool is_aot); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| bool | bool | ||||||
| wasm_memory_check_flags(const uint8 mem_flag, char *error_buf, | wasm_memory_check_flags(const uint8 mem_flag, char *error_buf, | ||||||
|                         uint32 error_buf_size, bool is_aot); |                         uint32 error_buf_size, bool is_aot); | ||||||
| 
 | 
 | ||||||
|  | bool | ||||||
|  | wasm_table_check_flags(const uint8 table_flag, char *error_buf, | ||||||
|  |                        uint32 error_buf_size, bool is_aot); | ||||||
|  | 
 | ||||||
| bool | bool | ||||||
| is_valid_value_type(uint8 value_tpye); | is_valid_value_type(uint8 value_tpye); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -13,6 +13,10 @@ | ||||||
| #include "../common/wasm_shared_memory.h" | #include "../common/wasm_shared_memory.h" | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_THREAD_MGR != 0 | ||||||
|  | #include "../libraries/thread-mgr/thread_manager.h" | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| typedef enum Memory_Mode { | typedef enum Memory_Mode { | ||||||
|     MEMORY_MODE_UNKNOWN = 0, |     MEMORY_MODE_UNKNOWN = 0, | ||||||
|     MEMORY_MODE_POOL, |     MEMORY_MODE_POOL, | ||||||
|  | @ -24,6 +28,11 @@ static Memory_Mode memory_mode = MEMORY_MODE_UNKNOWN; | ||||||
| 
 | 
 | ||||||
| static mem_allocator_t pool_allocator = NULL; | static mem_allocator_t pool_allocator = NULL; | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  | static WASMSharedHeap *shared_heap_list = NULL; | ||||||
|  | static korp_mutex shared_heap_list_lock; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| static enlarge_memory_error_callback_t enlarge_memory_error_cb; | static enlarge_memory_error_callback_t enlarge_memory_error_cb; | ||||||
| static void *enlarge_memory_error_user_data; | static void *enlarge_memory_error_user_data; | ||||||
| 
 | 
 | ||||||
|  | @ -132,16 +141,371 @@ is_bounds_checks_enabled(WASMModuleInstanceCommon *module_inst) | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  | static void * | ||||||
|  | wasm_mmap_linear_memory(uint64_t map_size, uint64 commit_size); | ||||||
|  | static void | ||||||
|  | wasm_munmap_linear_memory(void *mapped_mem, uint64 commit_size, | ||||||
|  |                           uint64 map_size); | ||||||
|  | 
 | ||||||
|  | static void * | ||||||
|  | runtime_malloc(uint64 size) | ||||||
|  | { | ||||||
|  |     void *mem; | ||||||
|  | 
 | ||||||
|  |     if (size >= UINT32_MAX || !(mem = wasm_runtime_malloc((uint32)size))) { | ||||||
|  |         LOG_WARNING("Allocate memory failed"); | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     memset(mem, 0, (uint32)size); | ||||||
|  |     return mem; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | WASMSharedHeap * | ||||||
|  | wasm_runtime_create_shared_heap(SharedHeapInitArgs *init_args) | ||||||
|  | { | ||||||
|  |     uint64 heap_struct_size = sizeof(WASMSharedHeap), map_size; | ||||||
|  |     uint32 size = init_args->size; | ||||||
|  |     WASMSharedHeap *heap; | ||||||
|  | 
 | ||||||
|  |     if (size == 0) { | ||||||
|  |         goto fail1; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (!(heap = runtime_malloc(heap_struct_size))) { | ||||||
|  |         goto fail1; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (!(heap->heap_handle = | ||||||
|  |               runtime_malloc(mem_allocator_get_heap_struct_size()))) { | ||||||
|  |         goto fail2; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     size = align_uint(size, os_getpagesize()); | ||||||
|  |     heap->size = size; | ||||||
|  |     heap->start_off_mem64 = UINT64_MAX - heap->size + 1; | ||||||
|  |     heap->start_off_mem32 = UINT32_MAX - heap->size + 1; | ||||||
|  | 
 | ||||||
|  |     if (size > APP_HEAP_SIZE_MAX || size < APP_HEAP_SIZE_MIN) { | ||||||
|  |         LOG_WARNING("Invalid size of shared heap"); | ||||||
|  |         goto fail3; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | #ifndef OS_ENABLE_HW_BOUND_CHECK | ||||||
|  |     map_size = size; | ||||||
|  | #else | ||||||
|  |     /* Totally 8G is mapped, the opcode load/store address range is 0 to 8G:
 | ||||||
|  |      *   ea = i + memarg.offset | ||||||
|  |      * both i and memarg.offset are u32 in range 0 to 4G | ||||||
|  |      * so the range of ea is 0 to 8G | ||||||
|  |      */ | ||||||
|  |     map_size = 8 * (uint64)BH_GB; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     if (!(heap->base_addr = wasm_mmap_linear_memory(map_size, size))) { | ||||||
|  |         goto fail3; | ||||||
|  |     } | ||||||
|  |     if (!mem_allocator_create_with_struct_and_pool( | ||||||
|  |             heap->heap_handle, heap_struct_size, heap->base_addr, size)) { | ||||||
|  |         LOG_WARNING("init share heap failed"); | ||||||
|  |         goto fail4; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     os_mutex_lock(&shared_heap_list_lock); | ||||||
|  |     if (shared_heap_list == NULL) { | ||||||
|  |         shared_heap_list = heap; | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         heap->next = shared_heap_list; | ||||||
|  |         shared_heap_list = heap; | ||||||
|  |     } | ||||||
|  |     os_mutex_unlock(&shared_heap_list_lock); | ||||||
|  |     return heap; | ||||||
|  | 
 | ||||||
|  | fail4: | ||||||
|  |     wasm_munmap_linear_memory(heap->base_addr, size, map_size); | ||||||
|  | fail3: | ||||||
|  |     wasm_runtime_free(heap->heap_handle); | ||||||
|  | fail2: | ||||||
|  |     wasm_runtime_free(heap); | ||||||
|  | fail1: | ||||||
|  |     return NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool | ||||||
|  | wasm_runtime_attach_shared_heap_internal(WASMModuleInstanceCommon *module_inst, | ||||||
|  |                                          WASMSharedHeap *shared_heap) | ||||||
|  | { | ||||||
|  |     WASMMemoryInstance *memory = | ||||||
|  |         wasm_get_default_memory((WASMModuleInstance *)module_inst); | ||||||
|  |     uint64 linear_mem_size; | ||||||
|  | 
 | ||||||
|  |     if (!memory) | ||||||
|  |         return false; | ||||||
|  | 
 | ||||||
|  |     linear_mem_size = memory->memory_data_size; | ||||||
|  | 
 | ||||||
|  |     /* check if linear memory and shared heap are overlapped */ | ||||||
|  |     if ((memory->is_memory64 && linear_mem_size > shared_heap->start_off_mem64) | ||||||
|  |         || (!memory->is_memory64 | ||||||
|  |             && linear_mem_size > shared_heap->start_off_mem32)) { | ||||||
|  |         LOG_WARNING("Linear memory address is overlapped with shared heap"); | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | #if WASM_ENABLE_INTERP != 0 | ||||||
|  |     if (module_inst->module_type == Wasm_Module_Bytecode) { | ||||||
|  |         WASMModuleInstanceExtra *e = | ||||||
|  |             (WASMModuleInstanceExtra *)((WASMModuleInstance *)module_inst)->e; | ||||||
|  |         if (e->shared_heap) { | ||||||
|  |             LOG_WARNING("A shared heap is already attached"); | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         e->shared_heap = shared_heap; | ||||||
|  | #if WASM_ENABLE_JIT != 0 | ||||||
|  | #if UINTPTR_MAX == UINT64_MAX | ||||||
|  |         if (memory->is_memory64) | ||||||
|  |             e->shared_heap_start_off.u64 = shared_heap->start_off_mem64; | ||||||
|  |         else | ||||||
|  |             e->shared_heap_start_off.u64 = shared_heap->start_off_mem32; | ||||||
|  |         e->shared_heap_base_addr_adj = | ||||||
|  |             shared_heap->base_addr - e->shared_heap_start_off.u64; | ||||||
|  | #else | ||||||
|  |         e->shared_heap_start_off.u32[0] = (uint32)shared_heap->start_off_mem32; | ||||||
|  |         e->shared_heap_base_addr_adj = | ||||||
|  |             shared_heap->base_addr - e->shared_heap_start_off.u32[0]; | ||||||
|  | #endif | ||||||
|  | #endif /* end of WASM_ENABLE_JIT != 0 */ | ||||||
|  |     } | ||||||
|  | #endif /* end of WASM_ENABLE_INTERP != 0 */ | ||||||
|  | #if WASM_ENABLE_AOT != 0 | ||||||
|  |     if (module_inst->module_type == Wasm_Module_AoT) { | ||||||
|  |         AOTModuleInstanceExtra *e = | ||||||
|  |             (AOTModuleInstanceExtra *)((AOTModuleInstance *)module_inst)->e; | ||||||
|  |         if (e->shared_heap) { | ||||||
|  |             LOG_WARNING("A shared heap is already attached"); | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         e->shared_heap = shared_heap; | ||||||
|  | #if UINTPTR_MAX == UINT64_MAX | ||||||
|  |         if (memory->is_memory64) | ||||||
|  |             e->shared_heap_start_off.u64 = shared_heap->start_off_mem64; | ||||||
|  |         else | ||||||
|  |             e->shared_heap_start_off.u64 = shared_heap->start_off_mem32; | ||||||
|  |         e->shared_heap_base_addr_adj = | ||||||
|  |             shared_heap->base_addr - e->shared_heap_start_off.u64; | ||||||
|  | #else | ||||||
|  |         e->shared_heap_start_off.u32[0] = (uint32)shared_heap->start_off_mem32; | ||||||
|  |         e->shared_heap_base_addr_adj = | ||||||
|  |             shared_heap->base_addr - e->shared_heap_start_off.u32[0]; | ||||||
|  | #endif | ||||||
|  |     } | ||||||
|  | #endif /* end of WASM_ENABLE_AOT != 0 */ | ||||||
|  | 
 | ||||||
|  |     return true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool | ||||||
|  | wasm_runtime_attach_shared_heap(WASMModuleInstanceCommon *module_inst, | ||||||
|  |                                 WASMSharedHeap *shared_heap) | ||||||
|  | { | ||||||
|  | #if WASM_ENABLE_THREAD_MGR != 0 | ||||||
|  |     return wasm_cluster_attach_shared_heap(module_inst, shared_heap); | ||||||
|  | #else | ||||||
|  |     return wasm_runtime_attach_shared_heap_internal(module_inst, shared_heap); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | wasm_runtime_detach_shared_heap_internal(WASMModuleInstanceCommon *module_inst) | ||||||
|  | { | ||||||
|  | #if WASM_ENABLE_INTERP != 0 | ||||||
|  |     if (module_inst->module_type == Wasm_Module_Bytecode) { | ||||||
|  |         WASMModuleInstanceExtra *e = | ||||||
|  |             (WASMModuleInstanceExtra *)((WASMModuleInstance *)module_inst)->e; | ||||||
|  |         e->shared_heap = NULL; | ||||||
|  | #if WASM_ENABLE_JIT != 0 | ||||||
|  | #if UINTPTR_MAX == UINT64_MAX | ||||||
|  |         e->shared_heap_start_off.u64 = UINT64_MAX; | ||||||
|  | #else | ||||||
|  |         e->shared_heap_start_off.u32[0] = UINT32_MAX; | ||||||
|  | #endif | ||||||
|  |         e->shared_heap_base_addr_adj = NULL; | ||||||
|  | #endif | ||||||
|  |     } | ||||||
|  | #endif /* end of WASM_ENABLE_INTERP != 0 */ | ||||||
|  | #if WASM_ENABLE_AOT != 0 | ||||||
|  |     if (module_inst->module_type == Wasm_Module_AoT) { | ||||||
|  |         AOTModuleInstanceExtra *e = | ||||||
|  |             (AOTModuleInstanceExtra *)((AOTModuleInstance *)module_inst)->e; | ||||||
|  |         e->shared_heap = NULL; | ||||||
|  | #if UINTPTR_MAX == UINT64_MAX | ||||||
|  |         e->shared_heap_start_off.u64 = UINT64_MAX; | ||||||
|  | #else | ||||||
|  |         e->shared_heap_start_off.u32[0] = UINT32_MAX; | ||||||
|  | #endif | ||||||
|  |         e->shared_heap_base_addr_adj = NULL; | ||||||
|  |     } | ||||||
|  | #endif /* end of WASM_ENABLE_AOT != 0 */ | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | wasm_runtime_detach_shared_heap(WASMModuleInstanceCommon *module_inst) | ||||||
|  | { | ||||||
|  | #if WASM_ENABLE_THREAD_MGR != 0 | ||||||
|  |     wasm_cluster_detach_shared_heap(module_inst); | ||||||
|  | #else | ||||||
|  |     wasm_runtime_detach_shared_heap_internal(module_inst); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static WASMSharedHeap * | ||||||
|  | get_shared_heap(WASMModuleInstanceCommon *module_inst_comm) | ||||||
|  | { | ||||||
|  | #if WASM_ENABLE_INTERP != 0 | ||||||
|  |     if (module_inst_comm->module_type == Wasm_Module_Bytecode) { | ||||||
|  |         return ((WASMModuleInstance *)module_inst_comm)->e->shared_heap; | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | #if WASM_ENABLE_AOT != 0 | ||||||
|  |     if (module_inst_comm->module_type == Wasm_Module_AoT) { | ||||||
|  |         AOTModuleInstanceExtra *e = | ||||||
|  |             (AOTModuleInstanceExtra *)((AOTModuleInstance *)module_inst_comm) | ||||||
|  |                 ->e; | ||||||
|  |         return e->shared_heap; | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  |     return NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | WASMSharedHeap * | ||||||
|  | wasm_runtime_get_shared_heap(WASMModuleInstanceCommon *module_inst_comm) | ||||||
|  | { | ||||||
|  |     return get_shared_heap(module_inst_comm); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static bool | ||||||
|  | is_app_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst, | ||||||
|  |                            bool is_memory64, uint64 app_offset, uint32 bytes) | ||||||
|  | { | ||||||
|  |     WASMSharedHeap *heap = get_shared_heap(module_inst); | ||||||
|  | 
 | ||||||
|  |     if (!heap) { | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (bytes == 0) { | ||||||
|  |         bytes = 1; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (!is_memory64) { | ||||||
|  |         if (app_offset >= heap->start_off_mem32 | ||||||
|  |             && app_offset <= UINT32_MAX - bytes + 1) { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         if (app_offset >= heap->start_off_mem64 | ||||||
|  |             && app_offset <= UINT64_MAX - bytes + 1) { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static bool | ||||||
|  | is_native_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst, | ||||||
|  |                               uint8 *addr, uint32 bytes) | ||||||
|  | { | ||||||
|  |     WASMSharedHeap *heap = get_shared_heap(module_inst); | ||||||
|  | 
 | ||||||
|  |     if (heap && addr >= heap->base_addr | ||||||
|  |         && addr + bytes <= heap->base_addr + heap->size | ||||||
|  |         && addr + bytes > addr) { | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |     return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint64 | ||||||
|  | wasm_runtime_shared_heap_malloc(WASMModuleInstanceCommon *module_inst, | ||||||
|  |                                 uint64_t size, void **p_native_addr) | ||||||
|  | { | ||||||
|  |     WASMMemoryInstance *memory = | ||||||
|  |         wasm_get_default_memory((WASMModuleInstance *)module_inst); | ||||||
|  |     WASMSharedHeap *shared_heap = get_shared_heap(module_inst); | ||||||
|  |     void *native_addr = NULL; | ||||||
|  | 
 | ||||||
|  |     if (!memory || !shared_heap) | ||||||
|  |         return 0; | ||||||
|  | 
 | ||||||
|  |     native_addr = mem_allocator_malloc(shared_heap->heap_handle, size); | ||||||
|  |     if (!native_addr) | ||||||
|  |         return 0; | ||||||
|  | 
 | ||||||
|  |     if (p_native_addr) { | ||||||
|  |         *p_native_addr = native_addr; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (memory->is_memory64) | ||||||
|  |         return shared_heap->start_off_mem64 | ||||||
|  |                + ((uint8 *)native_addr - shared_heap->base_addr); | ||||||
|  |     else | ||||||
|  |         return shared_heap->start_off_mem32 | ||||||
|  |                + ((uint8 *)native_addr - shared_heap->base_addr); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | wasm_runtime_shared_heap_free(WASMModuleInstanceCommon *module_inst, uint64 ptr) | ||||||
|  | { | ||||||
|  |     WASMMemoryInstance *memory = | ||||||
|  |         wasm_get_default_memory((WASMModuleInstance *)module_inst); | ||||||
|  |     WASMSharedHeap *shared_heap = get_shared_heap(module_inst); | ||||||
|  |     uint8 *addr = NULL; | ||||||
|  | 
 | ||||||
|  |     if (!memory || !shared_heap) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (memory->is_memory64) { | ||||||
|  |         if (ptr < shared_heap->start_off_mem64) { /* ptr can not > UINT64_MAX */ | ||||||
|  |             LOG_WARNING("The address to free isn't in shared heap"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         addr = shared_heap->base_addr + (ptr - shared_heap->start_off_mem64); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         if (ptr < shared_heap->start_off_mem32 || ptr > UINT32_MAX) { | ||||||
|  |             LOG_WARNING("The address to free isn't in shared heap"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         addr = shared_heap->base_addr + (ptr - shared_heap->start_off_mem32); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     mem_allocator_free(shared_heap->heap_handle, addr); | ||||||
|  | } | ||||||
|  | #endif /* end of WASM_ENABLE_SHARED_HEAP != 0 */ | ||||||
|  | 
 | ||||||
| bool | bool | ||||||
| wasm_runtime_memory_init(mem_alloc_type_t mem_alloc_type, | wasm_runtime_memory_init(mem_alloc_type_t mem_alloc_type, | ||||||
|                          const MemAllocOption *alloc_option) |                          const MemAllocOption *alloc_option) | ||||||
| { | { | ||||||
|  |     bool ret = false; | ||||||
|  | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     if (os_mutex_init(&shared_heap_list_lock)) { | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     if (mem_alloc_type == Alloc_With_Pool) { |     if (mem_alloc_type == Alloc_With_Pool) { | ||||||
|         return wasm_memory_init_with_pool(alloc_option->pool.heap_buf, |         ret = wasm_memory_init_with_pool(alloc_option->pool.heap_buf, | ||||||
|                                          alloc_option->pool.heap_size); |                                          alloc_option->pool.heap_size); | ||||||
|     } |     } | ||||||
|     else if (mem_alloc_type == Alloc_With_Allocator) { |     else if (mem_alloc_type == Alloc_With_Allocator) { | ||||||
|         return wasm_memory_init_with_allocator( |         ret = wasm_memory_init_with_allocator( | ||||||
| #if WASM_MEM_ALLOC_WITH_USER_DATA != 0 | #if WASM_MEM_ALLOC_WITH_USER_DATA != 0 | ||||||
|             alloc_option->allocator.user_data, |             alloc_option->allocator.user_data, | ||||||
| #endif | #endif | ||||||
|  | @ -151,16 +515,58 @@ wasm_runtime_memory_init(mem_alloc_type_t mem_alloc_type, | ||||||
|     } |     } | ||||||
|     else if (mem_alloc_type == Alloc_With_System_Allocator) { |     else if (mem_alloc_type == Alloc_With_System_Allocator) { | ||||||
|         memory_mode = MEMORY_MODE_SYSTEM_ALLOCATOR; |         memory_mode = MEMORY_MODE_SYSTEM_ALLOCATOR; | ||||||
|         return true; |         ret = true; | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|         return false; |         ret = false; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     if (!ret) { | ||||||
|  |         os_mutex_destroy(&shared_heap_list_lock); | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  | static void | ||||||
|  | destroy_shared_heaps() | ||||||
|  | { | ||||||
|  |     WASMSharedHeap *heap; | ||||||
|  |     WASMSharedHeap *cur; | ||||||
|  |     uint64 map_size; | ||||||
|  | 
 | ||||||
|  |     os_mutex_lock(&shared_heap_list_lock); | ||||||
|  |     heap = shared_heap_list; | ||||||
|  |     shared_heap_list = NULL; | ||||||
|  |     os_mutex_unlock(&shared_heap_list_lock); | ||||||
|  | 
 | ||||||
|  |     while (heap) { | ||||||
|  |         cur = heap; | ||||||
|  |         heap = heap->next; | ||||||
|  |         mem_allocator_destroy(cur->heap_handle); | ||||||
|  |         wasm_runtime_free(cur->heap_handle); | ||||||
|  | #ifndef OS_ENABLE_HW_BOUND_CHECK | ||||||
|  |         map_size = cur->size; | ||||||
|  | #else | ||||||
|  |         map_size = 8 * (uint64)BH_GB; | ||||||
|  | #endif | ||||||
|  |         wasm_munmap_linear_memory(cur->base_addr, cur->size, map_size); | ||||||
|  |         wasm_runtime_free(cur); | ||||||
|  |     } | ||||||
|  |     os_mutex_destroy(&shared_heap_list_lock); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| void | void | ||||||
| wasm_runtime_memory_destroy(void) | wasm_runtime_memory_destroy(void) | ||||||
| { | { | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     destroy_shared_heaps(); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     if (memory_mode == MEMORY_MODE_POOL) { |     if (memory_mode == MEMORY_MODE_POOL) { | ||||||
| #if BH_ENABLE_GC_VERIFY == 0 | #if BH_ENABLE_GC_VERIFY == 0 | ||||||
|         (void)mem_allocator_destroy(pool_allocator); |         (void)mem_allocator_destroy(pool_allocator); | ||||||
|  | @ -335,6 +741,13 @@ wasm_runtime_validate_app_addr(WASMModuleInstanceCommon *module_inst_comm, | ||||||
|         goto fail; |         goto fail; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     if (is_app_addr_in_shared_heap(module_inst_comm, memory_inst->is_memory64, | ||||||
|  |                                    app_offset, size)) { | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #if WASM_ENABLE_MEMORY64 != 0 | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|     if (memory_inst->is_memory64) |     if (memory_inst->is_memory64) | ||||||
|         max_linear_memory_size = MAX_LINEAR_MEM64_MEMORY_SIZE; |         max_linear_memory_size = MAX_LINEAR_MEM64_MEMORY_SIZE; | ||||||
|  | @ -364,6 +777,7 @@ wasm_runtime_validate_app_str_addr(WASMModuleInstanceCommon *module_inst_comm, | ||||||
|                                    uint64 app_str_offset) |                                    uint64 app_str_offset) | ||||||
| { | { | ||||||
|     WASMModuleInstance *module_inst = (WASMModuleInstance *)module_inst_comm; |     WASMModuleInstance *module_inst = (WASMModuleInstance *)module_inst_comm; | ||||||
|  |     WASMMemoryInstance *memory_inst; | ||||||
|     uint64 app_end_offset, max_linear_memory_size = MAX_LINEAR_MEMORY_SIZE; |     uint64 app_end_offset, max_linear_memory_size = MAX_LINEAR_MEMORY_SIZE; | ||||||
|     char *str, *str_end; |     char *str, *str_end; | ||||||
| 
 | 
 | ||||||
|  | @ -374,22 +788,42 @@ wasm_runtime_validate_app_str_addr(WASMModuleInstanceCommon *module_inst_comm, | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (!wasm_runtime_get_app_addr_range(module_inst_comm, app_str_offset, NULL, |     memory_inst = wasm_get_default_memory(module_inst); | ||||||
|                                          &app_end_offset)) |     if (!memory_inst) { | ||||||
|  |         goto fail; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     if (is_app_addr_in_shared_heap(module_inst_comm, memory_inst->is_memory64, | ||||||
|  |                                    app_str_offset, 1)) { | ||||||
|  |         WASMSharedHeap *shared_heap = get_shared_heap(module_inst_comm); | ||||||
|  |         str = (char *)shared_heap->base_addr | ||||||
|  |               + (memory_inst->is_memory64 | ||||||
|  |                      ? (app_str_offset - shared_heap->start_off_mem64) | ||||||
|  |                      : (app_str_offset - shared_heap->start_off_mem32)); | ||||||
|  |         str_end = (char *)shared_heap->base_addr + shared_heap->size; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  | #endif | ||||||
|  |     { | ||||||
|  |         if (!wasm_runtime_get_app_addr_range(module_inst_comm, app_str_offset, | ||||||
|  |                                              NULL, &app_end_offset)) | ||||||
|             goto fail; |             goto fail; | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_MEMORY64 != 0 | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|     if (module_inst->memories[0]->is_memory64) |         if (memory_inst->is_memory64) | ||||||
|             max_linear_memory_size = MAX_LINEAR_MEM64_MEMORY_SIZE; |             max_linear_memory_size = MAX_LINEAR_MEM64_MEMORY_SIZE; | ||||||
| #endif | #endif | ||||||
|     /* boundary overflow check, max start offset can only be size - 1, while end
 |         /* boundary overflow check, max start offset can be size - 1, while end
 | ||||||
|      * offset can be size */ |            offset can be size */ | ||||||
|         if (app_str_offset >= max_linear_memory_size |         if (app_str_offset >= max_linear_memory_size | ||||||
|             || app_end_offset > max_linear_memory_size) |             || app_end_offset > max_linear_memory_size) | ||||||
|             goto fail; |             goto fail; | ||||||
| 
 | 
 | ||||||
|         str = wasm_runtime_addr_app_to_native(module_inst_comm, app_str_offset); |         str = wasm_runtime_addr_app_to_native(module_inst_comm, app_str_offset); | ||||||
|         str_end = str + (app_end_offset - app_str_offset); |         str_end = str + (app_end_offset - app_str_offset); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     while (str < str_end && *str != '\0') |     while (str < str_end && *str != '\0') | ||||||
|         str++; |         str++; | ||||||
|     if (str == str_end) |     if (str == str_end) | ||||||
|  | @ -431,6 +865,12 @@ wasm_runtime_validate_native_addr(WASMModuleInstanceCommon *module_inst_comm, | ||||||
|         goto fail; |         goto fail; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     if (is_native_addr_in_shared_heap(module_inst_comm, native_ptr, size)) { | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     SHARED_MEMORY_LOCK(memory_inst); |     SHARED_MEMORY_LOCK(memory_inst); | ||||||
| 
 | 
 | ||||||
|     if (memory_inst->memory_data <= addr |     if (memory_inst->memory_data <= addr | ||||||
|  | @ -465,6 +905,23 @@ wasm_runtime_addr_app_to_native(WASMModuleInstanceCommon *module_inst_comm, | ||||||
|         return NULL; |         return NULL; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     if (is_app_addr_in_shared_heap(module_inst_comm, memory_inst->is_memory64, | ||||||
|  |                                    app_offset, 1)) { | ||||||
|  |         WASMSharedHeap *shared_heap = get_shared_heap(module_inst_comm); | ||||||
|  |         uint64 shared_heap_start = 0; | ||||||
|  | 
 | ||||||
|  |         if (memory_inst && !memory_inst->is_memory64) { | ||||||
|  |             shared_heap_start = shared_heap->start_off_mem32; | ||||||
|  |         } | ||||||
|  |         else if (memory_inst && memory_inst->is_memory64) { | ||||||
|  |             shared_heap_start = shared_heap->start_off_mem64; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return shared_heap->base_addr + app_offset - shared_heap_start; | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     SHARED_MEMORY_LOCK(memory_inst); |     SHARED_MEMORY_LOCK(memory_inst); | ||||||
| 
 | 
 | ||||||
|     addr = memory_inst->memory_data + (uintptr_t)app_offset; |     addr = memory_inst->memory_data + (uintptr_t)app_offset; | ||||||
|  | @ -499,11 +956,32 @@ wasm_runtime_addr_native_to_app(WASMModuleInstanceCommon *module_inst_comm, | ||||||
| 
 | 
 | ||||||
|     bounds_checks = is_bounds_checks_enabled(module_inst_comm); |     bounds_checks = is_bounds_checks_enabled(module_inst_comm); | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     /* If shared heap is enabled, bounds check is always needed */ | ||||||
|  |     bounds_checks = true; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     memory_inst = wasm_get_default_memory(module_inst); |     memory_inst = wasm_get_default_memory(module_inst); | ||||||
|     if (!memory_inst) { |     if (!memory_inst) { | ||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     if (is_native_addr_in_shared_heap(module_inst_comm, addr, 1)) { | ||||||
|  |         WASMSharedHeap *shared_heap = get_shared_heap(module_inst_comm); | ||||||
|  |         uint64 shared_heap_start = 0; | ||||||
|  | 
 | ||||||
|  |         if (memory_inst && !memory_inst->is_memory64) { | ||||||
|  |             shared_heap_start = shared_heap->start_off_mem32; | ||||||
|  |         } | ||||||
|  |         else if (memory_inst && memory_inst->is_memory64) { | ||||||
|  |             shared_heap_start = shared_heap->start_off_mem64; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return shared_heap_start + (addr - shared_heap->base_addr); | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     SHARED_MEMORY_LOCK(memory_inst); |     SHARED_MEMORY_LOCK(memory_inst); | ||||||
| 
 | 
 | ||||||
|     if (bounds_checks) { |     if (bounds_checks) { | ||||||
|  | @ -601,6 +1079,10 @@ wasm_check_app_addr_and_convert(WASMModuleInstance *module_inst, bool is_str, | ||||||
|     WASMMemoryInstance *memory_inst = wasm_get_default_memory(module_inst); |     WASMMemoryInstance *memory_inst = wasm_get_default_memory(module_inst); | ||||||
|     uint8 *native_addr; |     uint8 *native_addr; | ||||||
|     bool bounds_checks; |     bool bounds_checks; | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     WASMSharedHeap *shared_heap; | ||||||
|  |     bool is_in_shared_heap = false; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
|     bh_assert(app_buf_addr <= UINTPTR_MAX && app_buf_size <= UINTPTR_MAX); |     bh_assert(app_buf_addr <= UINTPTR_MAX && app_buf_size <= UINTPTR_MAX); | ||||||
| 
 | 
 | ||||||
|  | @ -609,9 +1091,25 @@ wasm_check_app_addr_and_convert(WASMModuleInstance *module_inst, bool is_str, | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     if (is_app_addr_in_shared_heap((WASMModuleInstanceCommon *)module_inst, | ||||||
|  |                                    memory_inst->is_memory64, app_buf_addr, | ||||||
|  |                                    app_buf_size)) { | ||||||
|  |         shared_heap = get_shared_heap((WASMModuleInstanceCommon *)module_inst); | ||||||
|  |         native_addr = shared_heap->base_addr | ||||||
|  |                       + (memory_inst->is_memory64 | ||||||
|  |                              ? (app_buf_addr - shared_heap->start_off_mem64) | ||||||
|  |                              : (app_buf_addr - shared_heap->start_off_mem32)); | ||||||
|  |         is_in_shared_heap = true; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  | #endif | ||||||
|  |     { | ||||||
|         native_addr = memory_inst->memory_data + (uintptr_t)app_buf_addr; |         native_addr = memory_inst->memory_data + (uintptr_t)app_buf_addr; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     bounds_checks = is_bounds_checks_enabled((wasm_module_inst_t)module_inst); |     bounds_checks = | ||||||
|  |         is_bounds_checks_enabled((WASMModuleInstanceCommon *)module_inst); | ||||||
| 
 | 
 | ||||||
|     if (!bounds_checks) { |     if (!bounds_checks) { | ||||||
|         if (app_buf_addr == 0) { |         if (app_buf_addr == 0) { | ||||||
|  | @ -620,6 +1118,24 @@ wasm_check_app_addr_and_convert(WASMModuleInstance *module_inst, bool is_str, | ||||||
|         goto success; |         goto success; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     if (is_in_shared_heap) { | ||||||
|  |         const char *str, *str_end; | ||||||
|  | 
 | ||||||
|  |         /* The whole string must be in the linear memory */ | ||||||
|  |         str = (const char *)native_addr; | ||||||
|  |         str_end = (const char *)shared_heap->base_addr + shared_heap->size; | ||||||
|  |         while (str < str_end && *str != '\0') | ||||||
|  |             str++; | ||||||
|  |         if (str == str_end) { | ||||||
|  |             wasm_set_exception(module_inst, "out of bounds memory access"); | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |             goto success; | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     /* No need to check the app_offset and buf_size if memory access
 |     /* No need to check the app_offset and buf_size if memory access
 | ||||||
|        boundary check with hardware trap is enabled */ |        boundary check with hardware trap is enabled */ | ||||||
| #ifndef OS_ENABLE_HW_BOUND_CHECK | #ifndef OS_ENABLE_HW_BOUND_CHECK | ||||||
|  | @ -673,11 +1189,9 @@ wasm_get_default_memory(WASMModuleInstance *module_inst) | ||||||
| WASMMemoryInstance * | WASMMemoryInstance * | ||||||
| wasm_get_memory_with_idx(WASMModuleInstance *module_inst, uint32 index) | wasm_get_memory_with_idx(WASMModuleInstance *module_inst, uint32 index) | ||||||
| { | { | ||||||
|     bh_assert(index < module_inst->memory_count); |     if ((index >= module_inst->memory_count) || !module_inst->memories) | ||||||
|     if (module_inst->memories) |  | ||||||
|         return module_inst->memories[index]; |  | ||||||
|     else |  | ||||||
|         return NULL; |         return NULL; | ||||||
|  |     return module_inst->memories[index]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
|  | @ -751,19 +1265,17 @@ wasm_mremap_linear_memory(void *mapped_mem, uint64 old_size, uint64 new_size, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void * | static void * | ||||||
| wasm_mmap_linear_memory(uint64_t map_size, uint64 commit_size) | wasm_mmap_linear_memory(uint64 map_size, uint64 commit_size) | ||||||
| { | { | ||||||
|     return wasm_mremap_linear_memory(NULL, 0, map_size, commit_size); |     return wasm_mremap_linear_memory(NULL, 0, map_size, commit_size); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool | static bool | ||||||
| wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count, | wasm_enlarge_memory_internal(WASMModuleInstanceCommon *module, | ||||||
|                              uint32 memidx) |                              WASMMemoryInstance *memory, uint32 inc_page_count) | ||||||
| { | { | ||||||
| #if WASM_ENABLE_MULTI_MEMORY != 0 | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|     WASMMemoryInstance *memory = wasm_get_memory_with_idx(module, memidx); |     WASMSharedHeap *shared_heap; | ||||||
| #else |  | ||||||
|     WASMMemoryInstance *memory = wasm_get_default_memory(module); |  | ||||||
| #endif | #endif | ||||||
|     uint8 *memory_data_old, *memory_data_new, *heap_data_old; |     uint8 *memory_data_old, *memory_data_new, *heap_data_old; | ||||||
|     uint32 num_bytes_per_page, heap_size; |     uint32 num_bytes_per_page, heap_size; | ||||||
|  | @ -812,6 +1324,24 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count, | ||||||
|         goto return_func; |         goto return_func; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     shared_heap = get_shared_heap(module); | ||||||
|  |     if (shared_heap) { | ||||||
|  |         if (memory->is_memory64 | ||||||
|  |             && total_size_new > shared_heap->start_off_mem64) { | ||||||
|  |             LOG_WARNING("Linear memory address is overlapped with shared heap"); | ||||||
|  |             ret = false; | ||||||
|  |             goto return_func; | ||||||
|  |         } | ||||||
|  |         else if (!memory->is_memory64 | ||||||
|  |                  && total_size_new > shared_heap->start_off_mem32) { | ||||||
|  |             LOG_WARNING("Linear memory address is overlapped with shared heap"); | ||||||
|  |             ret = false; | ||||||
|  |             goto return_func; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     bh_assert(total_size_new |     bh_assert(total_size_new | ||||||
|               <= GET_MAX_LINEAR_MEMORY_SIZE(memory->is_memory64)); |               <= GET_MAX_LINEAR_MEMORY_SIZE(memory->is_memory64)); | ||||||
| 
 | 
 | ||||||
|  | @ -913,7 +1443,7 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count, | ||||||
|     wasm_runtime_set_mem_bound_check_bytes(memory, total_size_new); |     wasm_runtime_set_mem_bound_check_bytes(memory, total_size_new); | ||||||
| 
 | 
 | ||||||
| return_func: | return_func: | ||||||
|     if (!ret && enlarge_memory_error_cb) { |     if (!ret && module && enlarge_memory_error_cb) { | ||||||
|         WASMExecEnv *exec_env = NULL; |         WASMExecEnv *exec_env = NULL; | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_INTERP != 0 | #if WASM_ENABLE_INTERP != 0 | ||||||
|  | @ -926,8 +1456,7 @@ return_func: | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|         enlarge_memory_error_cb(inc_page_count, total_size_old, 0, |         enlarge_memory_error_cb(inc_page_count, total_size_old, 0, | ||||||
|                                 failure_reason, |                                 failure_reason, module, exec_env, | ||||||
|                                 (WASMModuleInstanceCommon *)module, exec_env, |  | ||||||
|                                 enlarge_memory_error_user_data); |                                 enlarge_memory_error_user_data); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -971,15 +1500,16 @@ wasm_enlarge_memory(WASMModuleInstance *module, uint32 inc_page_count) | ||||||
| { | { | ||||||
|     bool ret = false; |     bool ret = false; | ||||||
| 
 | 
 | ||||||
|  |     if (module->memory_count > 0) { | ||||||
| #if WASM_ENABLE_SHARED_MEMORY != 0 | #if WASM_ENABLE_SHARED_MEMORY != 0 | ||||||
|     if (module->memory_count > 0) |  | ||||||
|         shared_memory_lock(module->memories[0]); |         shared_memory_lock(module->memories[0]); | ||||||
| #endif | #endif | ||||||
|     ret = wasm_enlarge_memory_internal(module, inc_page_count, 0); |         ret = wasm_enlarge_memory_internal((WASMModuleInstanceCommon *)module, | ||||||
|  |                                            module->memories[0], inc_page_count); | ||||||
| #if WASM_ENABLE_SHARED_MEMORY != 0 | #if WASM_ENABLE_SHARED_MEMORY != 0 | ||||||
|     if (module->memory_count > 0) |  | ||||||
|         shared_memory_unlock(module->memories[0]); |         shared_memory_unlock(module->memories[0]); | ||||||
| #endif | #endif | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  | @ -990,15 +1520,117 @@ wasm_enlarge_memory_with_idx(WASMModuleInstance *module, uint32 inc_page_count, | ||||||
| { | { | ||||||
|     bool ret = false; |     bool ret = false; | ||||||
| 
 | 
 | ||||||
|  |     if (memidx < module->memory_count) { | ||||||
| #if WASM_ENABLE_SHARED_MEMORY != 0 | #if WASM_ENABLE_SHARED_MEMORY != 0 | ||||||
|     if (memidx < module->memory_count) |  | ||||||
|         shared_memory_lock(module->memories[memidx]); |         shared_memory_lock(module->memories[memidx]); | ||||||
| #endif | #endif | ||||||
|     ret = wasm_enlarge_memory_internal(module, inc_page_count, memidx); |         ret = wasm_enlarge_memory_internal((WASMModuleInstanceCommon *)module, | ||||||
|  |                                            module->memories[memidx], | ||||||
|  |                                            inc_page_count); | ||||||
| #if WASM_ENABLE_SHARED_MEMORY != 0 | #if WASM_ENABLE_SHARED_MEMORY != 0 | ||||||
|     if (memidx < module->memory_count) |  | ||||||
|         shared_memory_unlock(module->memories[memidx]); |         shared_memory_unlock(module->memories[memidx]); | ||||||
| #endif | #endif | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | WASMMemoryInstance * | ||||||
|  | wasm_runtime_lookup_memory(WASMModuleInstanceCommon *module_inst, | ||||||
|  |                            const char *name) | ||||||
|  | { | ||||||
|  | #if WASM_ENABLE_INTERP != 0 | ||||||
|  |     if (module_inst->module_type == Wasm_Module_Bytecode) | ||||||
|  |         return wasm_lookup_memory((WASMModuleInstance *)module_inst, name); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if WASM_ENABLE_AOT != 0 | ||||||
|  |     if (module_inst->module_type == Wasm_Module_AoT) | ||||||
|  |         return aot_lookup_memory((WASMModuleInstance *)module_inst, name); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     return NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | WASMMemoryInstance * | ||||||
|  | wasm_runtime_get_default_memory(WASMModuleInstanceCommon *module_inst) | ||||||
|  | { | ||||||
|  | #if WASM_ENABLE_INTERP != 0 | ||||||
|  |     if (module_inst->module_type == Wasm_Module_Bytecode) | ||||||
|  |         return wasm_get_default_memory((WASMModuleInstance *)module_inst); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if WASM_ENABLE_AOT != 0 | ||||||
|  |     if (module_inst->module_type == Wasm_Module_AoT) | ||||||
|  |         return aot_get_default_memory((AOTModuleInstance *)module_inst); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     return NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | WASMMemoryInstance * | ||||||
|  | wasm_runtime_get_memory(WASMModuleInstanceCommon *module_inst, uint32 index) | ||||||
|  | { | ||||||
|  | #if WASM_ENABLE_INTERP != 0 | ||||||
|  |     if (module_inst->module_type == Wasm_Module_Bytecode) | ||||||
|  |         return wasm_get_memory_with_idx((WASMModuleInstance *)module_inst, | ||||||
|  |                                         index); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if WASM_ENABLE_AOT != 0 | ||||||
|  |     if (module_inst->module_type == Wasm_Module_AoT) | ||||||
|  |         return aot_get_memory_with_index((AOTModuleInstance *)module_inst, | ||||||
|  |                                          index); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     return NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint64 | ||||||
|  | wasm_memory_get_cur_page_count(WASMMemoryInstance *memory) | ||||||
|  | { | ||||||
|  |     return memory->cur_page_count; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint64 | ||||||
|  | wasm_memory_get_max_page_count(WASMMemoryInstance *memory) | ||||||
|  | { | ||||||
|  |     return memory->max_page_count; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | uint64 | ||||||
|  | wasm_memory_get_bytes_per_page(WASMMemoryInstance *memory) | ||||||
|  | { | ||||||
|  |     return memory->num_bytes_per_page; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool | ||||||
|  | wasm_memory_get_shared(WASMMemoryInstance *memory) | ||||||
|  | { | ||||||
|  |     return memory->is_shared_memory; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void * | ||||||
|  | wasm_memory_get_base_address(WASMMemoryInstance *memory) | ||||||
|  | { | ||||||
|  |     return memory->memory_data; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool | ||||||
|  | wasm_memory_enlarge(WASMMemoryInstance *memory, uint64 inc_page_count) | ||||||
|  | { | ||||||
|  |     bool ret = false; | ||||||
|  | 
 | ||||||
|  |     if (memory) { | ||||||
|  | #if WASM_ENABLE_SHARED_MEMORY != 0 | ||||||
|  |         shared_memory_lock(memory); | ||||||
|  | #endif | ||||||
|  |         ret = | ||||||
|  |             wasm_enlarge_memory_internal(NULL, memory, (uint32)inc_page_count); | ||||||
|  | #if WASM_ENABLE_SHARED_MEMORY != 0 | ||||||
|  |         shared_memory_unlock(memory); | ||||||
|  | #endif | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -41,6 +41,35 @@ SET_LINEAR_MEMORY_SIZE(WASMMemoryInstance *memory, uint64 size) | ||||||
| #define SET_LINEAR_MEMORY_SIZE(memory, size) memory->memory_data_size = size | #define SET_LINEAR_MEMORY_SIZE(memory, size) memory->memory_data_size = size | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  | WASMSharedHeap * | ||||||
|  | wasm_runtime_create_shared_heap(SharedHeapInitArgs *init_args); | ||||||
|  | 
 | ||||||
|  | bool | ||||||
|  | wasm_runtime_attach_shared_heap(WASMModuleInstanceCommon *module_inst, | ||||||
|  |                                 WASMSharedHeap *shared_heap); | ||||||
|  | bool | ||||||
|  | wasm_runtime_attach_shared_heap_internal(WASMModuleInstanceCommon *module_inst, | ||||||
|  |                                          WASMSharedHeap *shared_heap); | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | wasm_runtime_detach_shared_heap(WASMModuleInstanceCommon *module_inst); | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | wasm_runtime_detach_shared_heap_internal(WASMModuleInstanceCommon *module_inst); | ||||||
|  | 
 | ||||||
|  | WASMSharedHeap * | ||||||
|  | wasm_runtime_get_shared_heap(WASMModuleInstanceCommon *module_inst_comm); | ||||||
|  | 
 | ||||||
|  | uint64 | ||||||
|  | wasm_runtime_shared_heap_malloc(WASMModuleInstanceCommon *module_inst, | ||||||
|  |                                 uint64 size, void **p_native_addr); | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | wasm_runtime_shared_heap_free(WASMModuleInstanceCommon *module_inst, | ||||||
|  |                               uint64 ptr); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| bool | bool | ||||||
| wasm_runtime_memory_init(mem_alloc_type_t mem_alloc_type, | wasm_runtime_memory_init(mem_alloc_type_t mem_alloc_type, | ||||||
|                          const MemAllocOption *alloc_option); |                          const MemAllocOption *alloc_option); | ||||||
|  |  | ||||||
|  | @ -33,6 +33,11 @@ uint32 | ||||||
| get_spectest_export_apis(NativeSymbol **p_libc_builtin_apis); | get_spectest_export_apis(NativeSymbol **p_libc_builtin_apis); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  | uint32 | ||||||
|  | get_lib_shared_heap_export_apis(NativeSymbol **p_shared_heap_apis); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| uint32 | uint32 | ||||||
| get_libc_wasi_export_apis(NativeSymbol **p_libc_wasi_apis); | get_libc_wasi_export_apis(NativeSymbol **p_libc_wasi_apis); | ||||||
| 
 | 
 | ||||||
|  | @ -512,6 +517,14 @@ wasm_native_init() | ||||||
|         goto fail; |         goto fail; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     n_native_symbols = get_lib_shared_heap_export_apis(&native_symbols); | ||||||
|  |     if (n_native_symbols > 0 | ||||||
|  |         && !wasm_native_register_natives("env", native_symbols, | ||||||
|  |                                          n_native_symbols)) | ||||||
|  |         goto fail; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #if WASM_ENABLE_BASE_LIB != 0 | #if WASM_ENABLE_BASE_LIB != 0 | ||||||
|     n_native_symbols = get_base_lib_export_apis(&native_symbols); |     n_native_symbols = get_base_lib_export_apis(&native_symbols); | ||||||
|     if (n_native_symbols > 0 |     if (n_native_symbols > 0 | ||||||
|  |  | ||||||
|  | @ -185,6 +185,9 @@ static bool | ||||||
| is_sig_addr_in_guard_pages(void *sig_addr, WASMModuleInstance *module_inst) | is_sig_addr_in_guard_pages(void *sig_addr, WASMModuleInstance *module_inst) | ||||||
| { | { | ||||||
|     WASMMemoryInstance *memory_inst; |     WASMMemoryInstance *memory_inst; | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     WASMSharedHeap *shared_heap; | ||||||
|  | #endif | ||||||
|     uint8 *mapped_mem_start_addr = NULL; |     uint8 *mapped_mem_start_addr = NULL; | ||||||
|     uint8 *mapped_mem_end_addr = NULL; |     uint8 *mapped_mem_end_addr = NULL; | ||||||
|     uint32 i; |     uint32 i; | ||||||
|  | @ -202,6 +205,21 @@ is_sig_addr_in_guard_pages(void *sig_addr, WASMModuleInstance *module_inst) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     shared_heap = | ||||||
|  |         wasm_runtime_get_shared_heap((WASMModuleInstanceCommon *)module_inst); | ||||||
|  |     if (shared_heap) { | ||||||
|  |         mapped_mem_start_addr = shared_heap->base_addr; | ||||||
|  |         mapped_mem_end_addr = shared_heap->base_addr + 8 * (uint64)BH_GB; | ||||||
|  |         if (mapped_mem_start_addr <= (uint8 *)sig_addr | ||||||
|  |             && (uint8 *)sig_addr < mapped_mem_end_addr) { | ||||||
|  |             /* The address which causes segmentation fault is inside
 | ||||||
|  |                the shared heap's guard regions */ | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     return false; |     return false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -340,7 +358,6 @@ runtime_exception_handler(EXCEPTION_POINTERS *exce_info) | ||||||
|     PEXCEPTION_RECORD ExceptionRecord = exce_info->ExceptionRecord; |     PEXCEPTION_RECORD ExceptionRecord = exce_info->ExceptionRecord; | ||||||
|     uint8 *sig_addr = (uint8 *)ExceptionRecord->ExceptionInformation[1]; |     uint8 *sig_addr = (uint8 *)ExceptionRecord->ExceptionInformation[1]; | ||||||
|     WASMModuleInstance *module_inst; |     WASMModuleInstance *module_inst; | ||||||
|     WASMMemoryInstance *memory_inst; |  | ||||||
|     WASMJmpBuf *jmpbuf_node; |     WASMJmpBuf *jmpbuf_node; | ||||||
|     uint8 *mapped_mem_start_addr = NULL; |     uint8 *mapped_mem_start_addr = NULL; | ||||||
|     uint8 *mapped_mem_end_addr = NULL; |     uint8 *mapped_mem_end_addr = NULL; | ||||||
|  | @ -1484,6 +1501,22 @@ wasm_runtime_load_ex(uint8 *buf, uint32 size, const LoadArgs *args, | ||||||
|                                           error_buf_size); |                                           error_buf_size); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | WASM_RUNTIME_API_EXTERN bool | ||||||
|  | wasm_runtime_resolve_symbols(WASMModuleCommon *module) | ||||||
|  | { | ||||||
|  | #if WASM_ENABLE_INTERP != 0 | ||||||
|  |     if (module->module_type == Wasm_Module_Bytecode) { | ||||||
|  |         return wasm_resolve_symbols((WASMModule *)module); | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | #if WASM_ENABLE_AOT != 0 | ||||||
|  |     if (module->module_type == Wasm_Module_AoT) { | ||||||
|  |         return aot_resolve_symbols((AOTModule *)module); | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  |     return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| WASMModuleCommon * | WASMModuleCommon * | ||||||
| wasm_runtime_load(uint8 *buf, uint32 size, char *error_buf, | wasm_runtime_load(uint8 *buf, uint32 size, char *error_buf, | ||||||
|                   uint32 error_buf_size) |                   uint32 error_buf_size) | ||||||
|  | @ -2192,6 +2225,13 @@ wasm_runtime_get_user_data(WASMExecEnv *exec_env) | ||||||
|     return exec_env->user_data; |     return exec_env->user_data; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void | ||||||
|  | wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, | ||||||
|  |                                        uint8 *native_stack_boundary) | ||||||
|  | { | ||||||
|  |     exec_env->user_native_stack_boundary = native_stack_boundary; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #ifdef OS_ENABLE_HW_BOUND_CHECK | #ifdef OS_ENABLE_HW_BOUND_CHECK | ||||||
| void | void | ||||||
| wasm_runtime_access_exce_check_guard_page() | wasm_runtime_access_exce_check_guard_page() | ||||||
|  | @ -3577,7 +3617,8 @@ wasm_runtime_init_wasi(WASMModuleInstanceCommon *module_inst, | ||||||
|         char mapping_copy_buf[256]; |         char mapping_copy_buf[256]; | ||||||
|         char *mapping_copy = mapping_copy_buf; |         char *mapping_copy = mapping_copy_buf; | ||||||
|         char *map_mapped = NULL, *map_host = NULL; |         char *map_mapped = NULL, *map_host = NULL; | ||||||
|         const unsigned long max_len = strlen(map_dir_list[i]) * 2 + 3; |         const unsigned long max_len = | ||||||
|  |             (unsigned long)strlen(map_dir_list[i]) * 2 + 3; | ||||||
| 
 | 
 | ||||||
|         /* Allocation limit for runtime environments with reduced stack size */ |         /* Allocation limit for runtime environments with reduced stack size */ | ||||||
|         if (max_len > 256) { |         if (max_len > 256) { | ||||||
|  | @ -3867,15 +3908,11 @@ wasm_runtime_is_wasi_mode(WASMModuleInstanceCommon *module_inst) | ||||||
| WASMFunctionInstanceCommon * | WASMFunctionInstanceCommon * | ||||||
| wasm_runtime_lookup_wasi_start_function(WASMModuleInstanceCommon *module_inst) | wasm_runtime_lookup_wasi_start_function(WASMModuleInstanceCommon *module_inst) | ||||||
| { | { | ||||||
|     uint32 i; |  | ||||||
| 
 |  | ||||||
| #if WASM_ENABLE_INTERP != 0 | #if WASM_ENABLE_INTERP != 0 | ||||||
|     if (module_inst->module_type == Wasm_Module_Bytecode) { |     if (module_inst->module_type == Wasm_Module_Bytecode) { | ||||||
|         WASMModuleInstance *wasm_inst = (WASMModuleInstance *)module_inst; |         WASMModuleInstance *wasm_inst = (WASMModuleInstance *)module_inst; | ||||||
|         WASMFunctionInstance *func; |         WASMFunctionInstance *func = wasm_lookup_function(wasm_inst, "_start"); | ||||||
|         for (i = 0; i < wasm_inst->export_func_count; i++) { |         if (func) { | ||||||
|             if (!strcmp(wasm_inst->export_functions[i].name, "_start")) { |  | ||||||
|                 func = wasm_inst->export_functions[i].function; |  | ||||||
|             if (func->u.func->func_type->param_count != 0 |             if (func->u.func->func_type->param_count != 0 | ||||||
|                 || func->u.func->func_type->result_count != 0) { |                 || func->u.func->func_type->result_count != 0) { | ||||||
|                 LOG_ERROR("Lookup wasi _start function failed: " |                 LOG_ERROR("Lookup wasi _start function failed: " | ||||||
|  | @ -3884,7 +3921,6 @@ wasm_runtime_lookup_wasi_start_function(WASMModuleInstanceCommon *module_inst) | ||||||
|             } |             } | ||||||
|             return (WASMFunctionInstanceCommon *)func; |             return (WASMFunctionInstanceCommon *)func; | ||||||
|         } |         } | ||||||
|         } |  | ||||||
|         return NULL; |         return NULL; | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
|  | @ -3892,19 +3928,15 @@ wasm_runtime_lookup_wasi_start_function(WASMModuleInstanceCommon *module_inst) | ||||||
| #if WASM_ENABLE_AOT != 0 | #if WASM_ENABLE_AOT != 0 | ||||||
|     if (module_inst->module_type == Wasm_Module_AoT) { |     if (module_inst->module_type == Wasm_Module_AoT) { | ||||||
|         AOTModuleInstance *aot_inst = (AOTModuleInstance *)module_inst; |         AOTModuleInstance *aot_inst = (AOTModuleInstance *)module_inst; | ||||||
|         AOTFunctionInstance *export_funcs = |         AOTFunctionInstance *func = aot_lookup_function(aot_inst, "_start"); | ||||||
|             (AOTFunctionInstance *)aot_inst->export_functions; |         if (func) { | ||||||
|         for (i = 0; i < aot_inst->export_func_count; i++) { |             AOTFuncType *func_type = func->u.func.func_type; | ||||||
|             if (!strcmp(export_funcs[i].func_name, "_start")) { |             if (func_type->param_count != 0 || func_type->result_count != 0) { | ||||||
|                 AOTFuncType *func_type = export_funcs[i].u.func.func_type; |  | ||||||
|                 if (func_type->param_count != 0 |  | ||||||
|                     || func_type->result_count != 0) { |  | ||||||
|                 LOG_ERROR("Lookup wasi _start function failed: " |                 LOG_ERROR("Lookup wasi _start function failed: " | ||||||
|                           "invalid function type.\n"); |                           "invalid function type.\n"); | ||||||
|                 return NULL; |                 return NULL; | ||||||
|             } |             } | ||||||
|                 return (WASMFunctionInstanceCommon *)&export_funcs[i]; |             return func; | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|         return NULL; |         return NULL; | ||||||
|     } |     } | ||||||
|  | @ -4498,9 +4530,14 @@ wasm_runtime_invoke_native_raw(WASMExecEnv *exec_env, void *func_ptr, | ||||||
|                                uint32 *argv, uint32 argc, uint32 *argv_ret) |                                uint32 *argv, uint32 argc, uint32 *argv_ret) | ||||||
| { | { | ||||||
|     WASMModuleInstanceCommon *module = wasm_runtime_get_module_inst(exec_env); |     WASMModuleInstanceCommon *module = wasm_runtime_get_module_inst(exec_env); | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |     WASMMemoryInstance *memory = | ||||||
|  |         wasm_get_default_memory((WASMModuleInstance *)module); | ||||||
|  |     bool is_memory64 = memory ? memory->is_memory64 : false; | ||||||
|  | #endif | ||||||
|     typedef void (*NativeRawFuncPtr)(WASMExecEnv *, uint64 *); |     typedef void (*NativeRawFuncPtr)(WASMExecEnv *, uint64 *); | ||||||
|     NativeRawFuncPtr invoke_native_raw = (NativeRawFuncPtr)func_ptr; |     NativeRawFuncPtr invoke_native_raw = (NativeRawFuncPtr)func_ptr; | ||||||
|     uint64 argv_buf[16] = { 0 }, *argv1 = argv_buf, *argv_dst, size, arg_i64; |     uint64 argv_buf[16] = { 0 }, *argv1 = argv_buf, *argv_dst, size; | ||||||
|     uint32 *argv_src = argv, i, argc1, ptr_len; |     uint32 *argv_src = argv, i, argc1, ptr_len; | ||||||
|     uint32 arg_i32; |     uint32 arg_i32; | ||||||
|     bool ret = false; |     bool ret = false; | ||||||
|  | @ -4525,11 +4562,11 @@ wasm_runtime_invoke_native_raw(WASMExecEnv *exec_env, void *func_ptr, | ||||||
| #endif | #endif | ||||||
|             { |             { | ||||||
|                 *(uint32 *)argv_dst = arg_i32 = *argv_src++; |                 *(uint32 *)argv_dst = arg_i32 = *argv_src++; | ||||||
|                 /* TODO: memory64 if future there is a way for supporting
 |                 if (signature | ||||||
|                  * wasm64 and wasm32 in libc at the same time, remove the | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|                  * macro control */ |                     && !is_memory64 | ||||||
| #if WASM_ENABLE_MEMORY64 == 0 | #endif | ||||||
|                 if (signature) { |                 ) { | ||||||
|                     if (signature[i + 1] == '*') { |                     if (signature[i + 1] == '*') { | ||||||
|                         /* param is a pointer */ |                         /* param is a pointer */ | ||||||
|                         if (signature[i + 2] == '~') |                         if (signature[i + 2] == '~') | ||||||
|  | @ -4558,17 +4595,18 @@ wasm_runtime_invoke_native_raw(WASMExecEnv *exec_env, void *func_ptr, | ||||||
|                                 module, (uint64)arg_i32); |                                 module, (uint64)arg_i32); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| #endif |  | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             case VALUE_TYPE_I64: |             case VALUE_TYPE_I64: | ||||||
| #if WASM_ENABLE_MEMORY64 != 0 | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|             { |             { | ||||||
|  |                 uint64 arg_i64; | ||||||
|  | 
 | ||||||
|                 PUT_I64_TO_ADDR((uint32 *)argv_dst, |                 PUT_I64_TO_ADDR((uint32 *)argv_dst, | ||||||
|                                 GET_I64_FROM_ADDR(argv_src)); |                                 GET_I64_FROM_ADDR(argv_src)); | ||||||
|                 argv_src += 2; |                 argv_src += 2; | ||||||
|                 arg_i64 = *argv_dst; |                 arg_i64 = *argv_dst; | ||||||
|                 if (signature) { |                 if (signature && is_memory64) { | ||||||
|                     /* TODO: memory64 pointer with length need a new symbol
 |                     /* TODO: memory64 pointer with length need a new symbol
 | ||||||
|                      * to represent type i64, with '~' still represent i32 |                      * to represent type i64, with '~' still represent i32 | ||||||
|                      * length */ |                      * length */ | ||||||
|  | @ -4729,9 +4767,6 @@ wasm_runtime_invoke_native_raw(WASMExecEnv *exec_env, void *func_ptr, | ||||||
| fail: | fail: | ||||||
|     if (argv1 != argv_buf) |     if (argv1 != argv_buf) | ||||||
|         wasm_runtime_free(argv1); |         wasm_runtime_free(argv1); | ||||||
| #if WASM_ENABLE_MEMORY64 == 0 |  | ||||||
|     (void)arg_i64; |  | ||||||
| #endif |  | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -5655,6 +5690,11 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr, | ||||||
|                            uint32 *argv_ret) |                            uint32 *argv_ret) | ||||||
| { | { | ||||||
|     WASMModuleInstanceCommon *module = wasm_runtime_get_module_inst(exec_env); |     WASMModuleInstanceCommon *module = wasm_runtime_get_module_inst(exec_env); | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |     WASMMemoryInstance *memory = | ||||||
|  |         wasm_get_default_memory((WASMModuleInstance *)module); | ||||||
|  |     bool is_memory64 = memory ? memory->is_memory64 : false; | ||||||
|  | #endif | ||||||
|     uint64 argv_buf[32] = { 0 }, *argv1 = argv_buf, *ints, *stacks, size, |     uint64 argv_buf[32] = { 0 }, *argv1 = argv_buf, *ints, *stacks, size, | ||||||
|            arg_i64; |            arg_i64; | ||||||
|     uint32 *argv_src = argv, i, argc1, n_ints = 0, n_stacks = 0; |     uint32 *argv_src = argv, i, argc1, n_ints = 0, n_stacks = 0; | ||||||
|  | @ -5720,11 +5760,11 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr, | ||||||
|             { |             { | ||||||
|                 arg_i32 = *argv_src++; |                 arg_i32 = *argv_src++; | ||||||
|                 arg_i64 = arg_i32; |                 arg_i64 = arg_i32; | ||||||
|                 /* TODO: memory64 if future there is a way for supporting
 |                 if (signature | ||||||
|                  * wasm64 and wasm32 in libc at the same time, remove the | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|                  * macro control */ |                     && !is_memory64 | ||||||
| #if WASM_ENABLE_MEMORY64 == 0 | #endif | ||||||
|                 if (signature) { |                 ) { | ||||||
|                     if (signature[i + 1] == '*') { |                     if (signature[i + 1] == '*') { | ||||||
|                         /* param is a pointer */ |                         /* param is a pointer */ | ||||||
|                         if (signature[i + 2] == '~') |                         if (signature[i + 2] == '~') | ||||||
|  | @ -5751,7 +5791,6 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr, | ||||||
|                             module, (uint64)arg_i32); |                             module, (uint64)arg_i32); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| #endif |  | ||||||
|                 if (n_ints < MAX_REG_INTS) |                 if (n_ints < MAX_REG_INTS) | ||||||
|                     ints[n_ints++] = arg_i64; |                     ints[n_ints++] = arg_i64; | ||||||
|                 else |                 else | ||||||
|  | @ -5763,7 +5802,7 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr, | ||||||
|             { |             { | ||||||
|                 arg_i64 = GET_I64_FROM_ADDR(argv_src); |                 arg_i64 = GET_I64_FROM_ADDR(argv_src); | ||||||
|                 argv_src += 2; |                 argv_src += 2; | ||||||
|                 if (signature) { |                 if (signature && is_memory64) { | ||||||
|                     /* TODO: memory64 pointer with length need a new symbol
 |                     /* TODO: memory64 pointer with length need a new symbol
 | ||||||
|                      * to represent type i64, with '~' still represent i32 |                      * to represent type i64, with '~' still represent i32 | ||||||
|                      * length */ |                      * length */ | ||||||
|  |  | ||||||
|  | @ -673,6 +673,11 @@ wasm_runtime_set_user_data(WASMExecEnv *exec_env, void *user_data); | ||||||
| WASM_RUNTIME_API_EXTERN void * | WASM_RUNTIME_API_EXTERN void * | ||||||
| wasm_runtime_get_user_data(WASMExecEnv *exec_env); | wasm_runtime_get_user_data(WASMExecEnv *exec_env); | ||||||
| 
 | 
 | ||||||
|  | /* See wasm_export.h for description */ | ||||||
|  | WASM_RUNTIME_API_EXTERN void | ||||||
|  | wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, | ||||||
|  |                                        uint8 *native_stack_boundary); | ||||||
|  | 
 | ||||||
| #if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 | #if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 | ||||||
| /* See wasm_export.h for description */ | /* See wasm_export.h for description */ | ||||||
| WASM_RUNTIME_API_EXTERN void | WASM_RUNTIME_API_EXTERN void | ||||||
|  |  | ||||||
|  | @ -8,6 +8,9 @@ | ||||||
| #if WASM_ENABLE_THREAD_MGR != 0 | #if WASM_ENABLE_THREAD_MGR != 0 | ||||||
| #include "../libraries/thread-mgr/thread_manager.h" | #include "../libraries/thread-mgr/thread_manager.h" | ||||||
| #endif | #endif | ||||||
|  | #if WASM_ENABLE_AOT != 0 | ||||||
|  | #include "../aot/aot_runtime.h" | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Note: this lock can be per memory. |  * Note: this lock can be per memory. | ||||||
|  | @ -243,6 +246,31 @@ map_try_release_wait_info(HashMap *wait_hash_map, AtomicWaitInfo *wait_info, | ||||||
|     destroy_wait_info(wait_info); |     destroy_wait_info(wait_info); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  | static bool | ||||||
|  | is_native_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst, | ||||||
|  |                               uint8 *addr, uint32 bytes) | ||||||
|  | { | ||||||
|  |     WASMSharedHeap *shared_heap = NULL; | ||||||
|  | 
 | ||||||
|  | #if WASM_ENABLE_INTERP != 0 | ||||||
|  |     if (module_inst->module_type == Wasm_Module_Bytecode) { | ||||||
|  |         shared_heap = ((WASMModuleInstance *)module_inst)->e->shared_heap; | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | #if WASM_ENABLE_AOT != 0 | ||||||
|  |     if (module_inst->module_type == Wasm_Module_AoT) { | ||||||
|  |         AOTModuleInstanceExtra *e = | ||||||
|  |             (AOTModuleInstanceExtra *)((AOTModuleInstance *)module_inst)->e; | ||||||
|  |         shared_heap = e->shared_heap; | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     return shared_heap && addr >= shared_heap->base_addr | ||||||
|  |            && addr + bytes <= shared_heap->base_addr + shared_heap->size; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| uint32 | uint32 | ||||||
| wasm_runtime_atomic_wait(WASMModuleInstanceCommon *module, void *address, | wasm_runtime_atomic_wait(WASMModuleInstanceCommon *module, void *address, | ||||||
|                          uint64 expect, int64 timeout, bool wait64) |                          uint64 expect, int64 timeout, bool wait64) | ||||||
|  | @ -271,9 +299,17 @@ wasm_runtime_atomic_wait(WASMModuleInstanceCommon *module, void *address, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     shared_memory_lock(module_inst->memories[0]); |     shared_memory_lock(module_inst->memories[0]); | ||||||
|     if ((uint8 *)address < module_inst->memories[0]->memory_data |     if ( | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |         /* not in shared heap */ | ||||||
|  |         !is_native_addr_in_shared_heap((WASMModuleInstanceCommon *)module_inst, | ||||||
|  |                                        address, wait64 ? 8 : 4) | ||||||
|  |         && | ||||||
|  | #endif | ||||||
|  |         /* and not in linear memory */ | ||||||
|  |         ((uint8 *)address < module_inst->memories[0]->memory_data | ||||||
|          || (uint8 *)address + (wait64 ? 8 : 4) |          || (uint8 *)address + (wait64 ? 8 : 4) | ||||||
|                > module_inst->memories[0]->memory_data_end) { |                 > module_inst->memories[0]->memory_data_end)) { | ||||||
|         shared_memory_unlock(module_inst->memories[0]); |         shared_memory_unlock(module_inst->memories[0]); | ||||||
|         wasm_runtime_set_exception(module, "out of bounds memory access"); |         wasm_runtime_set_exception(module, "out of bounds memory access"); | ||||||
|         return -1; |         return -1; | ||||||
|  | @ -397,6 +433,11 @@ wasm_runtime_atomic_notify(WASMModuleInstanceCommon *module, void *address, | ||||||
| 
 | 
 | ||||||
|     shared_memory_lock(module_inst->memories[0]); |     shared_memory_lock(module_inst->memories[0]); | ||||||
|     out_of_bounds = |     out_of_bounds = | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |         /* not in shared heap */ | ||||||
|  |         !is_native_addr_in_shared_heap(module, address, 4) && | ||||||
|  | #endif | ||||||
|  |         /* and not in linear memory */ | ||||||
|         ((uint8 *)address < module_inst->memories[0]->memory_data |         ((uint8 *)address < module_inst->memories[0]->memory_data | ||||||
|          || (uint8 *)address + 4 > module_inst->memories[0]->memory_data_end); |          || (uint8 *)address + 4 > module_inst->memories[0]->memory_data_end); | ||||||
|     shared_memory_unlock(module_inst->memories[0]); |     shared_memory_unlock(module_inst->memories[0]); | ||||||
|  |  | ||||||
|  | @ -146,10 +146,21 @@ aot_validate_wasm(AOTCompContext *comp_ctx) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_MEMORY64 != 0 | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|     if (comp_ctx->pointer_size < sizeof(uint64) && IS_MEMORY64) { |     if (comp_ctx->pointer_size < sizeof(uint64)) { | ||||||
|         aot_set_last_error("Compiling wasm64 to 32bit platform is not allowed"); |         if (IS_MEMORY64) { | ||||||
|  |             aot_set_last_error("Compiling wasm64(contains i64 memory section) " | ||||||
|  |                                "to 32bit platform is not allowed"); | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         for (uint32 i = 0; i < comp_ctx->comp_data->table_count; ++i) { | ||||||
|  |             if (IS_TABLE64(i)) { | ||||||
|  |                 aot_set_last_error("Compiling wasm64(contains i64 table " | ||||||
|  |                                    "section) to 32bit platform is not allowed"); | ||||||
|  |                 return false; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|     return true; |     return true; | ||||||
|  |  | ||||||
|  | @ -532,8 +532,13 @@ set_local_gc_ref(AOTCompFrame *frame, int n, LLVMValueRef value, uint8 ref_type) | ||||||
| #define IS_MEMORY64 (comp_ctx->comp_data->memories[0].flags & MEMORY64_FLAG) | #define IS_MEMORY64 (comp_ctx->comp_data->memories[0].flags & MEMORY64_FLAG) | ||||||
| #define MEMORY64_COND_VALUE(VAL_IF_ENABLED, VAL_IF_DISABLED) \ | #define MEMORY64_COND_VALUE(VAL_IF_ENABLED, VAL_IF_DISABLED) \ | ||||||
|     (IS_MEMORY64 ? VAL_IF_ENABLED : VAL_IF_DISABLED) |     (IS_MEMORY64 ? VAL_IF_ENABLED : VAL_IF_DISABLED) | ||||||
|  | #define IS_TABLE64(i) \ | ||||||
|  |     (comp_ctx->comp_data->tables[i].table_type.flags & TABLE64_FLAG) | ||||||
|  | #define TABLE64_COND_VALUE(i, VAL_IF_ENABLED, VAL_IF_DISABLED) \ | ||||||
|  |     (IS_TABLE64(i) ? VAL_IF_ENABLED : VAL_IF_DISABLED) | ||||||
| #else | #else | ||||||
| #define MEMORY64_COND_VALUE(VAL_IF_ENABLED, VAL_IF_DISABLED) (VAL_IF_DISABLED) | #define MEMORY64_COND_VALUE(VAL_IF_ENABLED, VAL_IF_DISABLED) (VAL_IF_DISABLED) | ||||||
|  | #define TABLE64_COND_VALUE(i, VAL_IF_ENABLED, VAL_IF_DISABLED) (VAL_IF_DISABLED) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #define POP_I32(v) POP(v, VALUE_TYPE_I32) | #define POP_I32(v) POP(v, VALUE_TYPE_I32) | ||||||
|  | @ -548,6 +553,9 @@ set_local_gc_ref(AOTCompFrame *frame, int n, LLVMValueRef value, uint8 ref_type) | ||||||
|     POP(v, MEMORY64_COND_VALUE(VALUE_TYPE_I64, VALUE_TYPE_I32)) |     POP(v, MEMORY64_COND_VALUE(VALUE_TYPE_I64, VALUE_TYPE_I32)) | ||||||
| #define POP_PAGE_COUNT(v) \ | #define POP_PAGE_COUNT(v) \ | ||||||
|     POP(v, MEMORY64_COND_VALUE(VALUE_TYPE_I64, VALUE_TYPE_I32)) |     POP(v, MEMORY64_COND_VALUE(VALUE_TYPE_I64, VALUE_TYPE_I32)) | ||||||
|  | #define POP_TBL_ELEM_IDX(v) \ | ||||||
|  |     POP(v, TABLE64_COND_VALUE(tbl_idx, VALUE_TYPE_I64, VALUE_TYPE_I32)) | ||||||
|  | #define POP_TBL_ELEM_LEN(v) POP_TBL_ELEM_IDX(v) | ||||||
| 
 | 
 | ||||||
| #define POP_COND(llvm_value)                                                   \ | #define POP_COND(llvm_value)                                                   \ | ||||||
|     do {                                                                       \ |     do {                                                                       \ | ||||||
|  | @ -613,6 +621,9 @@ set_local_gc_ref(AOTCompFrame *frame, int n, LLVMValueRef value, uint8 ref_type) | ||||||
| #define PUSH_GC_REF(v) PUSH(v, VALUE_TYPE_GC_REF) | #define PUSH_GC_REF(v) PUSH(v, VALUE_TYPE_GC_REF) | ||||||
| #define PUSH_PAGE_COUNT(v) \ | #define PUSH_PAGE_COUNT(v) \ | ||||||
|     PUSH(v, MEMORY64_COND_VALUE(VALUE_TYPE_I64, VALUE_TYPE_I32)) |     PUSH(v, MEMORY64_COND_VALUE(VALUE_TYPE_I64, VALUE_TYPE_I32)) | ||||||
|  | #define PUSH_TBL_ELEM_IDX(v) \ | ||||||
|  |     PUSH(v, TABLE64_COND_VALUE(tbl_idx, VALUE_TYPE_I64, VALUE_TYPE_I32)) | ||||||
|  | #define PUSH_TBL_ELEM_LEN(v) PUSH_TBL_ELEM_IDX(v) | ||||||
| 
 | 
 | ||||||
| #define SET_CONST(v)                                                          \ | #define SET_CONST(v)                                                          \ | ||||||
|     do {                                                                      \ |     do {                                                                      \ | ||||||
|  |  | ||||||
|  | @ -4439,6 +4439,9 @@ aot_obj_data_create(AOTCompContext *comp_ctx) | ||||||
|     if (comp_ctx->call_stack_features.frame_per_function) { |     if (comp_ctx->call_stack_features.frame_per_function) { | ||||||
|         obj_data->target_info.feature_flags |= WASM_FEATURE_FRAME_PER_FUNCTION; |         obj_data->target_info.feature_flags |= WASM_FEATURE_FRAME_PER_FUNCTION; | ||||||
|     } |     } | ||||||
|  |     if (!comp_ctx->call_stack_features.func_idx) { | ||||||
|  |         obj_data->target_info.feature_flags |= WASM_FEATURE_FRAME_NO_FUNC_IDX; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     bh_print_time("Begin to resolve object file info"); |     bh_print_time("Begin to resolve object file info"); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -912,7 +912,7 @@ check_suspend_flags(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|         aot_set_last_error("llvm build LOAD failed"); |         aot_set_last_error("llvm build LOAD failed"); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|     /* Set terminate_flags memory accecc to volatile, so that the value
 |     /* Set terminate_flags memory access to volatile, so that the value
 | ||||||
|         will always be loaded from memory rather than register */ |         will always be loaded from memory rather than register */ | ||||||
|     LLVMSetVolatile(terminate_flags, true); |     LLVMSetVolatile(terminate_flags, true); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -885,6 +885,7 @@ alloc_frame_for_aot_func(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (!comp_ctx->is_jit_mode) { |     if (!comp_ctx->is_jit_mode) { | ||||||
|  |         if (comp_ctx->call_stack_features.func_idx) { | ||||||
|             /* aot mode: new_frame->func_idx = func_idx */ |             /* aot mode: new_frame->func_idx = func_idx */ | ||||||
|             func_idx_val = comp_ctx->pointer_size == sizeof(uint64) |             func_idx_val = comp_ctx->pointer_size == sizeof(uint64) | ||||||
|                                ? I64_CONST(func_idx) |                                ? I64_CONST(func_idx) | ||||||
|  | @ -892,20 +893,22 @@ alloc_frame_for_aot_func(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|             offset = I32_CONST(comp_ctx->pointer_size); |             offset = I32_CONST(comp_ctx->pointer_size); | ||||||
|             CHECK_LLVM_CONST(func_idx_val); |             CHECK_LLVM_CONST(func_idx_val); | ||||||
|             CHECK_LLVM_CONST(offset); |             CHECK_LLVM_CONST(offset); | ||||||
|         if (!(func_idx_ptr = |             if (!(func_idx_ptr = LLVMBuildInBoundsGEP2( | ||||||
|                   LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE, new_frame, |                       comp_ctx->builder, INT8_TYPE, new_frame, &offset, 1, | ||||||
|                                         &offset, 1, "func_idx_addr")) |                       "func_idx_addr")) | ||||||
|                 || !(func_idx_ptr = |                 || !(func_idx_ptr = | ||||||
|                          LLVMBuildBitCast(comp_ctx->builder, func_idx_ptr, |                          LLVMBuildBitCast(comp_ctx->builder, func_idx_ptr, | ||||||
|                                           INTPTR_T_PTR_TYPE, "func_idx_ptr"))) { |                                           INTPTR_T_PTR_TYPE, "func_idx_ptr"))) { | ||||||
|                 aot_set_last_error("llvm get func_idx_ptr failed"); |                 aot_set_last_error("llvm get func_idx_ptr failed"); | ||||||
|                 return false; |                 return false; | ||||||
|             } |             } | ||||||
|         if (!LLVMBuildStore(comp_ctx->builder, func_idx_val, func_idx_ptr)) { |             if (!LLVMBuildStore(comp_ctx->builder, func_idx_val, | ||||||
|  |                                 func_idx_ptr)) { | ||||||
|                 aot_set_last_error("llvm build store failed"); |                 aot_set_last_error("llvm build store failed"); | ||||||
|                 return false; |                 return false; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|     else { |     else { | ||||||
|         /* jit mode: frame->function = module_inst->e->functions + func_index */ |         /* jit mode: frame->function = module_inst->e->functions + func_index */ | ||||||
|         LLVMValueRef functions; |         LLVMValueRef functions; | ||||||
|  | @ -1404,7 +1407,9 @@ aot_compile_op_call(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|     LLVMValueRef *param_values = NULL, value_ret = NULL, func; |     LLVMValueRef *param_values = NULL, value_ret = NULL, func; | ||||||
|     LLVMValueRef import_func_idx, res; |     LLVMValueRef import_func_idx, res; | ||||||
|     LLVMValueRef ext_ret, ext_ret_ptr, ext_ret_idx; |     LLVMValueRef ext_ret, ext_ret_ptr, ext_ret_idx; | ||||||
|  | #if WASM_ENABLE_AOT_STACK_FRAME != 0 | ||||||
|     LLVMValueRef func_idx_ref; |     LLVMValueRef func_idx_ref; | ||||||
|  | #endif | ||||||
|     int32 i, j = 0, param_count, result_count, ext_ret_count; |     int32 i, j = 0, param_count, result_count, ext_ret_count; | ||||||
|     uint64 total_size; |     uint64 total_size; | ||||||
|     uint8 wasm_ret_type; |     uint8 wasm_ret_type; | ||||||
|  | @ -2084,6 +2089,9 @@ aot_compile_op_call_indirect(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|     LLVMValueRef ext_ret_offset, ext_ret_ptr, ext_ret, res; |     LLVMValueRef ext_ret_offset, ext_ret_ptr, ext_ret, res; | ||||||
|     LLVMValueRef *param_values = NULL, *value_rets = NULL; |     LLVMValueRef *param_values = NULL, *value_rets = NULL; | ||||||
|     LLVMValueRef *result_phis = NULL, value_ret, import_func_count; |     LLVMValueRef *result_phis = NULL, value_ret, import_func_count; | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |     LLVMValueRef u32_max, u32_cmp_result = NULL; | ||||||
|  | #endif | ||||||
|     LLVMTypeRef *param_types = NULL, ret_type; |     LLVMTypeRef *param_types = NULL, ret_type; | ||||||
|     LLVMTypeRef llvm_func_type, llvm_func_ptr_type; |     LLVMTypeRef llvm_func_type, llvm_func_ptr_type; | ||||||
|     LLVMTypeRef ext_ret_ptr_type; |     LLVMTypeRef ext_ret_ptr_type; | ||||||
|  | @ -2148,7 +2156,7 @@ aot_compile_op_call_indirect(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|     func_param_count = func_type->param_count; |     func_param_count = func_type->param_count; | ||||||
|     func_result_count = func_type->result_count; |     func_result_count = func_type->result_count; | ||||||
| 
 | 
 | ||||||
|     POP_I32(elem_idx); |     POP_TBL_ELEM_IDX(elem_idx); | ||||||
| 
 | 
 | ||||||
|     /* get the cur size of the table instance */ |     /* get the cur size of the table instance */ | ||||||
|     if (!(offset = I32_CONST(get_tbl_inst_offset(comp_ctx, func_ctx, tbl_idx) |     if (!(offset = I32_CONST(get_tbl_inst_offset(comp_ctx, func_ctx, tbl_idx) | ||||||
|  | @ -2177,6 +2185,27 @@ aot_compile_op_call_indirect(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|         goto fail; |         goto fail; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |     /* Check if elem index >= UINT32_MAX */ | ||||||
|  |     if (IS_TABLE64(tbl_idx)) { | ||||||
|  |         if (!(u32_max = I64_CONST(UINT32_MAX))) { | ||||||
|  |             aot_set_last_error("llvm build const failed"); | ||||||
|  |             goto fail; | ||||||
|  |         } | ||||||
|  |         if (!(u32_cmp_result = | ||||||
|  |                   LLVMBuildICmp(comp_ctx->builder, LLVMIntUGE, elem_idx, | ||||||
|  |                                 u32_max, "cmp_elem_idx_u32_max"))) { | ||||||
|  |             aot_set_last_error("llvm build icmp failed."); | ||||||
|  |             goto fail; | ||||||
|  |         } | ||||||
|  |         if (!(elem_idx = LLVMBuildTrunc(comp_ctx->builder, elem_idx, I32_TYPE, | ||||||
|  |                                         "elem_idx_i32"))) { | ||||||
|  |             aot_set_last_error("llvm build trunc failed."); | ||||||
|  |             goto fail; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     /* Check if (uint32)elem index >= table size */ |     /* Check if (uint32)elem index >= table size */ | ||||||
|     if (!(cmp_elem_idx = LLVMBuildICmp(comp_ctx->builder, LLVMIntUGE, elem_idx, |     if (!(cmp_elem_idx = LLVMBuildICmp(comp_ctx->builder, LLVMIntUGE, elem_idx, | ||||||
|                                        table_size_const, "cmp_elem_idx"))) { |                                        table_size_const, "cmp_elem_idx"))) { | ||||||
|  | @ -2184,7 +2213,19 @@ aot_compile_op_call_indirect(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|         goto fail; |         goto fail; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* Throw exception if elem index >= table size */ | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |     if (IS_TABLE64(tbl_idx)) { | ||||||
|  |         if (!(cmp_elem_idx = | ||||||
|  |                   LLVMBuildOr(comp_ctx->builder, cmp_elem_idx, u32_cmp_result, | ||||||
|  |                               "larger_than_u32_max_or_cur_size"))) { | ||||||
|  |             aot_set_last_error("llvm build or failed."); | ||||||
|  |             goto fail; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     /* Throw exception if elem index >= table size or elem index >= UINT32_MAX
 | ||||||
|  |      */ | ||||||
|     if (!(check_elem_idx_succ = LLVMAppendBasicBlockInContext( |     if (!(check_elem_idx_succ = LLVMAppendBasicBlockInContext( | ||||||
|               comp_ctx->context, func_ctx->func, "check_elem_idx_succ"))) { |               comp_ctx->context, func_ctx->func, "check_elem_idx_succ"))) { | ||||||
|         aot_set_last_error("llvm add basic block failed."); |         aot_set_last_error("llvm add basic block failed."); | ||||||
|  |  | ||||||
|  | @ -118,10 +118,10 @@ aot_check_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
| { | { | ||||||
|     LLVMValueRef offset_const = |     LLVMValueRef offset_const = | ||||||
|         MEMORY64_COND_VALUE(I64_CONST(offset), I32_CONST(offset)); |         MEMORY64_COND_VALUE(I64_CONST(offset), I32_CONST(offset)); | ||||||
|     LLVMValueRef addr, maddr, offset1, cmp1, cmp2, cmp; |     LLVMValueRef addr, maddr, maddr_phi = NULL, offset1, cmp1, cmp2, cmp; | ||||||
|     LLVMValueRef mem_base_addr, mem_check_bound; |     LLVMValueRef mem_base_addr, mem_check_bound; | ||||||
|     LLVMBasicBlockRef block_curr = LLVMGetInsertBlock(comp_ctx->builder); |     LLVMBasicBlockRef block_curr = LLVMGetInsertBlock(comp_ctx->builder); | ||||||
|     LLVMBasicBlockRef check_succ; |     LLVMBasicBlockRef check_succ, block_maddr_phi = NULL; | ||||||
|     AOTValue *aot_value_top; |     AOTValue *aot_value_top; | ||||||
|     uint32 local_idx_of_aot_value = 0; |     uint32 local_idx_of_aot_value = 0; | ||||||
|     uint64 const_value; |     uint64 const_value; | ||||||
|  | @ -131,6 +131,11 @@ aot_check_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|     bool is_shared_memory = |     bool is_shared_memory = | ||||||
|         comp_ctx->comp_data->memories[0].flags & SHARED_MEMORY_FLAG; |         comp_ctx->comp_data->memories[0].flags & SHARED_MEMORY_FLAG; | ||||||
| #endif | #endif | ||||||
|  | #if WASM_ENABLE_MEMORY64 == 0 | ||||||
|  |     bool is_memory64 = false; | ||||||
|  | #else | ||||||
|  |     bool is_memory64 = IS_MEMORY64; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
|     is_target_64bit = (comp_ctx->pointer_size == sizeof(uint64)) ? true : false; |     is_target_64bit = (comp_ctx->pointer_size == sizeof(uint64)) ? true : false; | ||||||
| 
 | 
 | ||||||
|  | @ -268,8 +273,137 @@ aot_check_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* offset1 = offset + addr; */ |     /* offset1 = offset + addr; */ | ||||||
|  |     /* TODO: check whether integer overflow occurs when memory is 64-bit
 | ||||||
|  |              and boundary check is enabled */ | ||||||
|     BUILD_OP(Add, offset_const, addr, offset1, "offset1"); |     BUILD_OP(Add, offset_const, addr, offset1, "offset1"); | ||||||
| 
 | 
 | ||||||
|  |     if (comp_ctx->enable_shared_heap /* TODO: && mem_idx == 0 */) { | ||||||
|  |         LLVMBasicBlockRef app_addr_in_shared_heap, app_addr_in_linear_mem; | ||||||
|  |         LLVMValueRef is_in_shared_heap, shared_heap_check_bound = NULL; | ||||||
|  | 
 | ||||||
|  |         /* Add basic blocks */ | ||||||
|  |         ADD_BASIC_BLOCK(app_addr_in_shared_heap, "app_addr_in_shared_heap"); | ||||||
|  |         ADD_BASIC_BLOCK(app_addr_in_linear_mem, "app_addr_in_linear_mem"); | ||||||
|  |         ADD_BASIC_BLOCK(block_maddr_phi, "maddr_phi"); | ||||||
|  | 
 | ||||||
|  |         LLVMMoveBasicBlockAfter(app_addr_in_shared_heap, block_curr); | ||||||
|  |         LLVMMoveBasicBlockAfter(app_addr_in_linear_mem, | ||||||
|  |                                 app_addr_in_shared_heap); | ||||||
|  |         LLVMMoveBasicBlockAfter(block_maddr_phi, app_addr_in_linear_mem); | ||||||
|  | 
 | ||||||
|  |         LLVMPositionBuilderAtEnd(comp_ctx->builder, block_maddr_phi); | ||||||
|  |         if (!(maddr_phi = | ||||||
|  |                   LLVMBuildPhi(comp_ctx->builder, | ||||||
|  |                                enable_segue ? INT8_PTR_TYPE_GS : INT8_PTR_TYPE, | ||||||
|  |                                "maddr_phi"))) { | ||||||
|  |             aot_set_last_error("llvm build phi failed"); | ||||||
|  |             goto fail; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         LLVMPositionBuilderAtEnd(comp_ctx->builder, block_curr); | ||||||
|  | 
 | ||||||
|  |         if (!is_target_64bit) { | ||||||
|  |             /* Check whether interger overflow occurs in addr + offset */ | ||||||
|  |             LLVMBasicBlockRef check_integer_overflow_end; | ||||||
|  |             ADD_BASIC_BLOCK(check_integer_overflow_end, | ||||||
|  |                             "check_integer_overflow_end"); | ||||||
|  |             LLVMMoveBasicBlockAfter(check_integer_overflow_end, block_curr); | ||||||
|  | 
 | ||||||
|  |             BUILD_ICMP(LLVMIntULT, offset1, addr, cmp1, "cmp1"); | ||||||
|  |             if (!aot_emit_exception(comp_ctx, func_ctx, | ||||||
|  |                                     EXCE_OUT_OF_BOUNDS_MEMORY_ACCESS, true, | ||||||
|  |                                     cmp1, check_integer_overflow_end)) { | ||||||
|  |                 goto fail; | ||||||
|  |             } | ||||||
|  |             SET_BUILD_POS(check_integer_overflow_end); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         shared_heap_check_bound = | ||||||
|  |             is_memory64 ? I64_CONST(UINT64_MAX - bytes + 1) | ||||||
|  |                         : (comp_ctx->pointer_size == sizeof(uint64) | ||||||
|  |                                ? I64_CONST(UINT32_MAX - bytes + 1) | ||||||
|  |                                : I32_CONST(UINT32_MAX - bytes + 1)); | ||||||
|  |         CHECK_LLVM_CONST(shared_heap_check_bound); | ||||||
|  | 
 | ||||||
|  |         /* Check whether the bytes to access are in shared heap */ | ||||||
|  |         if (!comp_ctx->enable_bound_check) { | ||||||
|  |             /* Use IntUGT but not IntUGE to compare, since (1) in the ems
 | ||||||
|  |                memory allocator, the hmu node includes hmu header and hmu | ||||||
|  |                memory, only the latter is returned to the caller as the | ||||||
|  |                allocated memory, the hmu header isn't returned so the | ||||||
|  |                first byte of the shared heap won't be accesed, (2) using | ||||||
|  |                IntUGT gets better performance than IntUGE in some cases */ | ||||||
|  |             BUILD_ICMP(LLVMIntUGT, offset1, func_ctx->shared_heap_start_off, | ||||||
|  |                        is_in_shared_heap, "is_in_shared_heap"); | ||||||
|  |             /* We don't check the shared heap's upper boundary if boundary
 | ||||||
|  |                check isn't enabled, the runtime may also use the guard pages | ||||||
|  |                of shared heap to check the boundary if hardware boundary | ||||||
|  |                check feature is enabled. */ | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             /* Use IntUGT but not IntUGE to compare, same as above */ | ||||||
|  |             BUILD_ICMP(LLVMIntUGT, offset1, func_ctx->shared_heap_start_off, | ||||||
|  |                        cmp1, "cmp1"); | ||||||
|  |             /* Check the shared heap's upper boundary if boundary check is
 | ||||||
|  |                enabled */ | ||||||
|  |             BUILD_ICMP(LLVMIntULE, offset1, shared_heap_check_bound, cmp2, | ||||||
|  |                        "cmp2"); | ||||||
|  |             BUILD_OP(And, cmp1, cmp2, is_in_shared_heap, "is_in_shared_heap"); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (!LLVMBuildCondBr(comp_ctx->builder, is_in_shared_heap, | ||||||
|  |                              app_addr_in_shared_heap, app_addr_in_linear_mem)) { | ||||||
|  |             aot_set_last_error("llvm build cond br failed"); | ||||||
|  |             goto fail; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         LLVMPositionBuilderAtEnd(comp_ctx->builder, app_addr_in_shared_heap); | ||||||
|  | 
 | ||||||
|  |         /* Get native address inside shared heap */ | ||||||
|  |         if (!(maddr = | ||||||
|  |                   LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE, | ||||||
|  |                                         func_ctx->shared_heap_base_addr_adj, | ||||||
|  |                                         &offset1, 1, "maddr_shared_heap"))) { | ||||||
|  |             aot_set_last_error("llvm build inbounds gep failed"); | ||||||
|  |             goto fail; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (enable_segue) { | ||||||
|  |             LLVMValueRef mem_base_addr_u64, maddr_u64, offset_to_mem_base; | ||||||
|  | 
 | ||||||
|  |             if (!(maddr_u64 = LLVMBuildPtrToInt(comp_ctx->builder, maddr, | ||||||
|  |                                                 I64_TYPE, "maddr_u64")) | ||||||
|  |                 || !(mem_base_addr_u64 = | ||||||
|  |                          LLVMBuildPtrToInt(comp_ctx->builder, mem_base_addr, | ||||||
|  |                                            I64_TYPE, "mem_base_addr_u64"))) { | ||||||
|  |                 aot_set_last_error("llvm build ptr to int failed"); | ||||||
|  |                 goto fail; | ||||||
|  |             } | ||||||
|  |             if (!(offset_to_mem_base = | ||||||
|  |                       LLVMBuildSub(comp_ctx->builder, maddr_u64, | ||||||
|  |                                    mem_base_addr_u64, "offset_to_mem_base"))) { | ||||||
|  |                 aot_set_last_error("llvm build sub failed"); | ||||||
|  |                 goto fail; | ||||||
|  |             } | ||||||
|  |             if (!(maddr = LLVMBuildIntToPtr( | ||||||
|  |                       comp_ctx->builder, offset_to_mem_base, INT8_PTR_TYPE_GS, | ||||||
|  |                       "maddr_shared_heap_segue"))) { | ||||||
|  |                 aot_set_last_error("llvm build int to ptr failed."); | ||||||
|  |                 goto fail; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         LLVMAddIncoming(maddr_phi, &maddr, &app_addr_in_shared_heap, 1); | ||||||
|  | 
 | ||||||
|  |         if (!LLVMBuildBr(comp_ctx->builder, block_maddr_phi)) { | ||||||
|  |             aot_set_last_error("llvm build br failed"); | ||||||
|  |             goto fail; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         LLVMPositionBuilderAtEnd(comp_ctx->builder, app_addr_in_linear_mem); | ||||||
|  |         block_curr = LLVMGetInsertBlock(comp_ctx->builder); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     if (comp_ctx->enable_bound_check |     if (comp_ctx->enable_bound_check | ||||||
|         && !(is_local_of_aot_value |         && !(is_local_of_aot_value | ||||||
|              && aot_checked_addr_list_find(func_ctx, local_idx_of_aot_value, |              && aot_checked_addr_list_find(func_ctx, local_idx_of_aot_value, | ||||||
|  | @ -304,12 +438,18 @@ aot_check_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|         if (is_target_64bit) { |         if (is_target_64bit) { | ||||||
|             BUILD_ICMP(LLVMIntUGT, offset1, mem_check_bound, cmp, "cmp"); |             BUILD_ICMP(LLVMIntUGT, offset1, mem_check_bound, cmp, "cmp"); | ||||||
|         } |         } | ||||||
|  |         else { | ||||||
|  |             if (comp_ctx->enable_shared_heap /* TODO: && mem_idx == 0 */) { | ||||||
|  |                 /* Check integer overflow has been checked above */ | ||||||
|  |                 BUILD_ICMP(LLVMIntUGT, offset1, mem_check_bound, cmp, "cmp"); | ||||||
|  |             } | ||||||
|             else { |             else { | ||||||
|                 /* Check integer overflow */ |                 /* Check integer overflow */ | ||||||
|                 BUILD_ICMP(LLVMIntULT, offset1, addr, cmp1, "cmp1"); |                 BUILD_ICMP(LLVMIntULT, offset1, addr, cmp1, "cmp1"); | ||||||
|                 BUILD_ICMP(LLVMIntUGT, offset1, mem_check_bound, cmp2, "cmp2"); |                 BUILD_ICMP(LLVMIntUGT, offset1, mem_check_bound, cmp2, "cmp2"); | ||||||
|                 BUILD_OP(Or, cmp1, cmp2, cmp, "cmp"); |                 BUILD_OP(Or, cmp1, cmp2, cmp, "cmp"); | ||||||
|             } |             } | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         /* Add basic blocks */ |         /* Add basic blocks */ | ||||||
|         ADD_BASIC_BLOCK(check_succ, "check_succ"); |         ADD_BASIC_BLOCK(check_succ, "check_succ"); | ||||||
|  | @ -354,6 +494,18 @@ aot_check_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|             goto fail; |             goto fail; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     if (comp_ctx->enable_shared_heap /* TODO: && mem_idx == 0 */) { | ||||||
|  |         block_curr = LLVMGetInsertBlock(comp_ctx->builder); | ||||||
|  |         LLVMAddIncoming(maddr_phi, &maddr, &block_curr, 1); | ||||||
|  |         if (!LLVMBuildBr(comp_ctx->builder, block_maddr_phi)) { | ||||||
|  |             aot_set_last_error("llvm build br failed"); | ||||||
|  |             goto fail; | ||||||
|  |         } | ||||||
|  |         LLVMPositionBuilderAtEnd(comp_ctx->builder, block_maddr_phi); | ||||||
|  |         return maddr_phi; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|         return maddr; |         return maddr; | ||||||
| fail: | fail: | ||||||
|     return NULL; |     return NULL; | ||||||
|  | @ -985,10 +1137,15 @@ check_bulk_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|                            LLVMValueRef offset, LLVMValueRef bytes) |                            LLVMValueRef offset, LLVMValueRef bytes) | ||||||
| { | { | ||||||
|     LLVMValueRef maddr, max_addr, cmp; |     LLVMValueRef maddr, max_addr, cmp; | ||||||
|     LLVMValueRef mem_base_addr; |     LLVMValueRef mem_base_addr, maddr_phi = NULL; | ||||||
|     LLVMBasicBlockRef block_curr = LLVMGetInsertBlock(comp_ctx->builder); |     LLVMBasicBlockRef block_curr = LLVMGetInsertBlock(comp_ctx->builder); | ||||||
|     LLVMBasicBlockRef check_succ; |     LLVMBasicBlockRef check_succ, block_maddr_phi = NULL; | ||||||
|     LLVMValueRef mem_size; |     LLVMValueRef mem_size; | ||||||
|  | #if WASM_ENABLE_MEMORY64 == 0 | ||||||
|  |     bool is_memory64 = false; | ||||||
|  | #else | ||||||
|  |     bool is_memory64 = IS_MEMORY64; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
|     /* Get memory base address and memory data size */ |     /* Get memory base address and memory data size */ | ||||||
| #if WASM_ENABLE_SHARED_MEMORY != 0 | #if WASM_ENABLE_SHARED_MEMORY != 0 | ||||||
|  | @ -1053,9 +1210,96 @@ check_bulk_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|     offset = |     offset = | ||||||
|         LLVMBuildZExt(comp_ctx->builder, offset, I64_TYPE, "extend_offset"); |         LLVMBuildZExt(comp_ctx->builder, offset, I64_TYPE, "extend_offset"); | ||||||
|     bytes = LLVMBuildZExt(comp_ctx->builder, bytes, I64_TYPE, "extend_len"); |     bytes = LLVMBuildZExt(comp_ctx->builder, bytes, I64_TYPE, "extend_len"); | ||||||
|  |     if (!offset || !bytes) { | ||||||
|  |         aot_set_last_error("llvm build zext failed."); | ||||||
|  |         goto fail; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|  |     /* TODO: check whether integer overflow occurs when memory is 64-bit
 | ||||||
|  |              and boundary check is enabled */ | ||||||
|     BUILD_OP(Add, offset, bytes, max_addr, "max_addr"); |     BUILD_OP(Add, offset, bytes, max_addr, "max_addr"); | ||||||
|  | 
 | ||||||
|  |     if (comp_ctx->enable_shared_heap /* TODO: && mem_idx == 0 */) { | ||||||
|  |         LLVMBasicBlockRef app_addr_in_shared_heap, app_addr_in_linear_mem; | ||||||
|  |         LLVMValueRef shared_heap_start_off, shared_heap_check_bound; | ||||||
|  |         LLVMValueRef max_offset, cmp1, cmp2, is_in_shared_heap; | ||||||
|  | 
 | ||||||
|  |         /* Add basic blocks */ | ||||||
|  |         ADD_BASIC_BLOCK(app_addr_in_shared_heap, "app_addr_in_shared_heap"); | ||||||
|  |         ADD_BASIC_BLOCK(app_addr_in_linear_mem, "app_addr_in_linear_mem"); | ||||||
|  |         ADD_BASIC_BLOCK(block_maddr_phi, "maddr_phi"); | ||||||
|  | 
 | ||||||
|  |         LLVMMoveBasicBlockAfter(app_addr_in_shared_heap, block_curr); | ||||||
|  |         LLVMMoveBasicBlockAfter(app_addr_in_linear_mem, | ||||||
|  |                                 app_addr_in_shared_heap); | ||||||
|  |         LLVMMoveBasicBlockAfter(block_maddr_phi, check_succ); | ||||||
|  | 
 | ||||||
|  |         LLVMPositionBuilderAtEnd(comp_ctx->builder, block_maddr_phi); | ||||||
|  |         if (!(maddr_phi = LLVMBuildPhi(comp_ctx->builder, INT8_PTR_TYPE, | ||||||
|  |                                        "maddr_phi"))) { | ||||||
|  |             aot_set_last_error("llvm build phi failed"); | ||||||
|  |             goto fail; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         LLVMPositionBuilderAtEnd(comp_ctx->builder, block_curr); | ||||||
|  | 
 | ||||||
|  |         shared_heap_start_off = func_ctx->shared_heap_start_off; | ||||||
|  |         if (comp_ctx->pointer_size == sizeof(uint32)) { | ||||||
|  |             if (!(shared_heap_start_off = | ||||||
|  |                       LLVMBuildZExt(comp_ctx->builder, shared_heap_start_off, | ||||||
|  |                                     I64_TYPE, "shared_heap_start_off_u64"))) { | ||||||
|  |                 aot_set_last_error("llvm build zext failed"); | ||||||
|  |                 goto fail; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         shared_heap_check_bound = | ||||||
|  |             is_memory64 ? I64_CONST(UINT64_MAX) : I64_CONST(UINT32_MAX); | ||||||
|  |         CHECK_LLVM_CONST(shared_heap_check_bound); | ||||||
|  | 
 | ||||||
|  |         /* Check whether the bytes to access are in shared heap */ | ||||||
|  |         if (!comp_ctx->enable_bound_check) { | ||||||
|  |             /* Use IntUGT but not IntUGE to compare, same as the check
 | ||||||
|  |                in aot_check_memory_overflow */ | ||||||
|  |             BUILD_ICMP(LLVMIntUGT, offset, func_ctx->shared_heap_start_off, | ||||||
|  |                        is_in_shared_heap, "is_in_shared_heap"); | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             BUILD_ICMP(LLVMIntUGT, offset, func_ctx->shared_heap_start_off, | ||||||
|  |                        cmp1, "cmp1"); | ||||||
|  |             BUILD_OP(Add, max_addr, I64_NEG_ONE, max_offset, "max_offset"); | ||||||
|  |             BUILD_ICMP(LLVMIntULE, max_offset, shared_heap_check_bound, cmp2, | ||||||
|  |                        "cmp2"); | ||||||
|  |             BUILD_OP(And, cmp1, cmp2, is_in_shared_heap, "is_in_shared_heap"); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (!LLVMBuildCondBr(comp_ctx->builder, is_in_shared_heap, | ||||||
|  |                              app_addr_in_shared_heap, app_addr_in_linear_mem)) { | ||||||
|  |             aot_set_last_error("llvm build cond br failed"); | ||||||
|  |             goto fail; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         LLVMPositionBuilderAtEnd(comp_ctx->builder, app_addr_in_shared_heap); | ||||||
|  | 
 | ||||||
|  |         /* Get native address inside shared heap */ | ||||||
|  |         if (!(maddr = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE, | ||||||
|  |                                             func_ctx->shared_heap_base_addr_adj, | ||||||
|  |                                             &offset, 1, "maddr_shared_heap"))) { | ||||||
|  |             aot_set_last_error("llvm build inbounds gep failed"); | ||||||
|  |             goto fail; | ||||||
|  |         } | ||||||
|  |         LLVMAddIncoming(maddr_phi, &maddr, &app_addr_in_shared_heap, 1); | ||||||
|  | 
 | ||||||
|  |         if (!LLVMBuildBr(comp_ctx->builder, block_maddr_phi)) { | ||||||
|  |             aot_set_last_error("llvm build br failed"); | ||||||
|  |             goto fail; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         LLVMPositionBuilderAtEnd(comp_ctx->builder, app_addr_in_linear_mem); | ||||||
|  |         block_curr = LLVMGetInsertBlock(comp_ctx->builder); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     BUILD_ICMP(LLVMIntUGT, max_addr, mem_size, cmp, "cmp_max_mem_addr"); |     BUILD_ICMP(LLVMIntUGT, max_addr, mem_size, cmp, "cmp_max_mem_addr"); | ||||||
|  | 
 | ||||||
|     if (!aot_emit_exception(comp_ctx, func_ctx, |     if (!aot_emit_exception(comp_ctx, func_ctx, | ||||||
|                             EXCE_OUT_OF_BOUNDS_MEMORY_ACCESS, true, cmp, |                             EXCE_OUT_OF_BOUNDS_MEMORY_ACCESS, true, cmp, | ||||||
|                             check_succ)) { |                             check_succ)) { | ||||||
|  | @ -1068,11 +1312,23 @@ check_bulk_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|         aot_set_last_error("llvm build add failed."); |         aot_set_last_error("llvm build add failed."); | ||||||
|         goto fail; |         goto fail; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     if (comp_ctx->enable_shared_heap /* TODO: && mem_idx == 0 */) { | ||||||
|  |         block_curr = LLVMGetInsertBlock(comp_ctx->builder); | ||||||
|  |         LLVMAddIncoming(maddr_phi, &maddr, &block_curr, 1); | ||||||
|  |         if (!LLVMBuildBr(comp_ctx->builder, block_maddr_phi)) { | ||||||
|  |             aot_set_last_error("llvm build br failed"); | ||||||
|  |             goto fail; | ||||||
|  |         } | ||||||
|  |         LLVMPositionBuilderAtEnd(comp_ctx->builder, block_maddr_phi); | ||||||
|  |         return maddr_phi; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|         return maddr; |         return maddr; | ||||||
| fail: | fail: | ||||||
|     return NULL; |     return NULL; | ||||||
| } | } | ||||||
| #endif /* end of WASM_ENABLE_BULK_MEMORY != 0 or WASM_ENABLE_STRINGREF != 0 */ | #endif /* end of WASM_ENABLE_BULK_MEMORY != 0 || WASM_ENABLE_STRINGREF != 0 */ | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_BULK_MEMORY != 0 | #if WASM_ENABLE_BULK_MEMORY != 0 | ||||||
| bool | bool | ||||||
|  |  | ||||||
|  | @ -10,6 +10,78 @@ | ||||||
| #include "aot_emit_gc.h" | #include "aot_emit_gc.h" | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  | static bool | ||||||
|  | zero_extend_u64(AOTCompContext *comp_ctx, LLVMValueRef *value, const char *name) | ||||||
|  | { | ||||||
|  |     if (comp_ctx->pointer_size == sizeof(uint64)) { | ||||||
|  |         /* zero extend to uint64 if the target is 64-bit */ | ||||||
|  |         *value = LLVMBuildZExt(comp_ctx->builder, *value, I64_TYPE, name); | ||||||
|  |         if (!*value) { | ||||||
|  |             aot_set_last_error("llvm build zero extend failed."); | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     return true; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /* check whether a table64 elem idx is greater than UINT32_MAX, if so, throw
 | ||||||
|  |  * exception, otherwise trunc it to uint32 */ | ||||||
|  | static bool | ||||||
|  | check_tbl_elem_idx_and_trunc(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|  |                              LLVMValueRef *elem_idx, uint32 tbl_idx) | ||||||
|  | { | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |     LLVMValueRef u32_max, u32_cmp_result; | ||||||
|  |     LLVMBasicBlockRef check_elem_idx_succ; | ||||||
|  | 
 | ||||||
|  |     if (!IS_TABLE64(tbl_idx)) { | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* Check if elem index >= UINT32_MAX */ | ||||||
|  |     if (!(u32_max = I64_CONST(UINT32_MAX))) { | ||||||
|  |         aot_set_last_error("llvm build const failed"); | ||||||
|  |         goto fail; | ||||||
|  |     } | ||||||
|  |     if (!(u32_cmp_result = | ||||||
|  |               LLVMBuildICmp(comp_ctx->builder, LLVMIntUGE, *elem_idx, u32_max, | ||||||
|  |                             "cmp_elem_idx_u32_max"))) { | ||||||
|  |         aot_set_last_error("llvm build icmp failed."); | ||||||
|  |         goto fail; | ||||||
|  |     } | ||||||
|  |     if (!(*elem_idx = LLVMBuildTrunc(comp_ctx->builder, *elem_idx, I32_TYPE, | ||||||
|  |                                      "elem_idx_i32"))) { | ||||||
|  |         aot_set_last_error("llvm build trunc failed."); | ||||||
|  |         goto fail; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* Throw exception if elem index >= UINT32_MAX*/ | ||||||
|  |     if (!(check_elem_idx_succ = LLVMAppendBasicBlockInContext( | ||||||
|  |               comp_ctx->context, func_ctx->func, "check_elem_idx_succ"))) { | ||||||
|  |         aot_set_last_error("llvm add basic block failed."); | ||||||
|  |         goto fail; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     LLVMMoveBasicBlockAfter(check_elem_idx_succ, | ||||||
|  |                             LLVMGetInsertBlock(comp_ctx->builder)); | ||||||
|  | 
 | ||||||
|  |     if (!(aot_emit_exception(comp_ctx, func_ctx, | ||||||
|  |                              EXCE_OUT_OF_BOUNDS_TABLE_ACCESS, true, | ||||||
|  |                              u32_cmp_result, check_elem_idx_succ))) | ||||||
|  |         goto fail; | ||||||
|  | 
 | ||||||
|  |     return true; | ||||||
|  | fail: | ||||||
|  |     return false; | ||||||
|  | #else | ||||||
|  |     return true; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | #endif /* WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC !=0 */ | ||||||
|  | 
 | ||||||
| uint64 | uint64 | ||||||
| get_tbl_inst_offset(const AOTCompContext *comp_ctx, | get_tbl_inst_offset(const AOTCompContext *comp_ctx, | ||||||
|                     const AOTFuncContext *func_ctx, uint32 tbl_idx) |                     const AOTFuncContext *func_ctx, uint32 tbl_idx) | ||||||
|  | @ -158,6 +230,10 @@ aot_check_table_access(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|         goto fail; |         goto fail; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     if (!check_tbl_elem_idx_and_trunc(comp_ctx, func_ctx, &elem_idx, tbl_idx)) { | ||||||
|  |         goto fail; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /* Check if (uint32)elem index >= table size */ |     /* Check if (uint32)elem index >= table size */ | ||||||
|     if (!(cmp_elem_idx = LLVMBuildICmp(comp_ctx->builder, LLVMIntUGE, elem_idx, |     if (!(cmp_elem_idx = LLVMBuildICmp(comp_ctx->builder, LLVMIntUGE, elem_idx, | ||||||
|                                        tbl_sz, "cmp_elem_idx"))) { |                                        tbl_sz, "cmp_elem_idx"))) { | ||||||
|  | @ -192,7 +268,7 @@ aot_compile_op_table_get(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|     LLVMValueRef elem_idx, offset, func_idx; |     LLVMValueRef elem_idx, offset, func_idx; | ||||||
|     LLVMValueRef table_elem_base, table_elem_addr, table_elem; |     LLVMValueRef table_elem_base, table_elem_addr, table_elem; | ||||||
| 
 | 
 | ||||||
|     POP_I32(elem_idx); |     POP_TBL_ELEM_IDX(elem_idx); | ||||||
| 
 | 
 | ||||||
|     if (!aot_check_table_access(comp_ctx, func_ctx, tbl_idx, elem_idx)) { |     if (!aot_check_table_access(comp_ctx, func_ctx, tbl_idx, elem_idx)) { | ||||||
|         goto fail; |         goto fail; | ||||||
|  | @ -289,7 +365,7 @@ aot_compile_op_table_set(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     POP_I32(elem_idx); |     POP_TBL_ELEM_IDX(elem_idx); | ||||||
| 
 | 
 | ||||||
|     if (!aot_check_table_access(comp_ctx, func_ctx, tbl_idx, elem_idx)) { |     if (!aot_check_table_access(comp_ctx, func_ctx, tbl_idx, elem_idx)) { | ||||||
|         goto fail; |         goto fail; | ||||||
|  | @ -388,7 +464,11 @@ aot_compile_op_table_init(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|     /* s */ |     /* s */ | ||||||
|     POP_I32(param_values[4]); |     POP_I32(param_values[4]); | ||||||
|     /* d */ |     /* d */ | ||||||
|     POP_I32(param_values[5]); |     POP_TBL_ELEM_IDX(param_values[5]); | ||||||
|  |     if (!check_tbl_elem_idx_and_trunc(comp_ctx, func_ctx, ¶m_values[5], | ||||||
|  |                                       tbl_idx)) { | ||||||
|  |         goto fail; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     /* "" means return void */ |     /* "" means return void */ | ||||||
|     if (!(LLVMBuildCall2(comp_ctx->builder, func_type, func, param_values, 6, |     if (!(LLVMBuildCall2(comp_ctx->builder, func_type, func, param_values, 6, | ||||||
|  | @ -408,6 +488,7 @@ aot_compile_op_table_copy(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
| { | { | ||||||
|     LLVMTypeRef param_types[6], ret_type, func_type, func_ptr_type; |     LLVMTypeRef param_types[6], ret_type, func_type, func_ptr_type; | ||||||
|     LLVMValueRef func, param_values[6], value; |     LLVMValueRef func, param_values[6], value; | ||||||
|  |     uint32 tbl_idx; | ||||||
| 
 | 
 | ||||||
|     param_types[0] = INT8_PTR_TYPE; |     param_types[0] = INT8_PTR_TYPE; | ||||||
|     param_types[1] = I32_TYPE; |     param_types[1] = I32_TYPE; | ||||||
|  | @ -434,12 +515,34 @@ aot_compile_op_table_copy(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|         goto fail; |         goto fail; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /* In table64, the length should be i32 type if any one of src/dst table
 | ||||||
|  |      * is i32 type, set the table index to the lesser-or-equal table when | ||||||
|  |      * popping length n */ | ||||||
|  |     if (!(comp_ctx->comp_data->tables[src_tbl_idx].table_type.flags | ||||||
|  |           & TABLE64_FLAG)) | ||||||
|  |         tbl_idx = src_tbl_idx; | ||||||
|  |     else | ||||||
|  |         tbl_idx = dst_tbl_idx; | ||||||
|     /* n */ |     /* n */ | ||||||
|     POP_I32(param_values[3]); |     POP_TBL_ELEM_LEN(param_values[3]); | ||||||
|  |     if (!check_tbl_elem_idx_and_trunc(comp_ctx, func_ctx, ¶m_values[3], | ||||||
|  |                                       tbl_idx)) { | ||||||
|  |         goto fail; | ||||||
|  |     } | ||||||
|     /* s */ |     /* s */ | ||||||
|     POP_I32(param_values[4]); |     tbl_idx = src_tbl_idx; | ||||||
|  |     POP_TBL_ELEM_IDX(param_values[4]); | ||||||
|  |     if (!check_tbl_elem_idx_and_trunc(comp_ctx, func_ctx, ¶m_values[4], | ||||||
|  |                                       tbl_idx)) { | ||||||
|  |         goto fail; | ||||||
|  |     } | ||||||
|     /* d */ |     /* d */ | ||||||
|     POP_I32(param_values[5]); |     tbl_idx = dst_tbl_idx; | ||||||
|  |     POP_TBL_ELEM_IDX(param_values[5]); | ||||||
|  |     if (!check_tbl_elem_idx_and_trunc(comp_ctx, func_ctx, ¶m_values[5], | ||||||
|  |                                       tbl_idx)) { | ||||||
|  |         goto fail; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     /* "" means return void */ |     /* "" means return void */ | ||||||
|     if (!(LLVMBuildCall2(comp_ctx->builder, func_type, func, param_values, 6, |     if (!(LLVMBuildCall2(comp_ctx->builder, func_type, func, param_values, 6, | ||||||
|  | @ -484,7 +587,14 @@ aot_compile_op_table_size(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|         goto fail; |         goto fail; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     PUSH_I32(tbl_sz); | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |     if (IS_TABLE64(tbl_idx)) { | ||||||
|  |         if (!zero_extend_u64(comp_ctx, &tbl_sz, "length64")) { | ||||||
|  |             goto fail; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  |     PUSH_TBL_ELEM_IDX(tbl_sz); | ||||||
| 
 | 
 | ||||||
|     return true; |     return true; | ||||||
| fail: | fail: | ||||||
|  | @ -517,7 +627,11 @@ aot_compile_op_table_grow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* n */ |     /* n */ | ||||||
|     POP_I32(param_values[2]); |     POP_TBL_ELEM_LEN(param_values[2]); | ||||||
|  |     if (!check_tbl_elem_idx_and_trunc(comp_ctx, func_ctx, ¶m_values[2], | ||||||
|  |                                       tbl_idx)) { | ||||||
|  |         goto fail; | ||||||
|  |     } | ||||||
|     /* v */ |     /* v */ | ||||||
| 
 | 
 | ||||||
|     if (comp_ctx->enable_gc) { |     if (comp_ctx->enable_gc) { | ||||||
|  | @ -545,7 +659,14 @@ aot_compile_op_table_grow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|         goto fail; |         goto fail; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     PUSH_I32(ret); | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |     if (IS_TABLE64(tbl_idx)) { | ||||||
|  |         if (!zero_extend_u64(comp_ctx, &ret, "table_size64")) { | ||||||
|  |             goto fail; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  |     PUSH_TBL_ELEM_LEN(ret); | ||||||
| 
 | 
 | ||||||
|     return true; |     return true; | ||||||
| fail: | fail: | ||||||
|  | @ -579,7 +700,11 @@ aot_compile_op_table_fill(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* n */ |     /* n */ | ||||||
|     POP_I32(param_values[2]); |     POP_TBL_ELEM_LEN(param_values[2]); | ||||||
|  |     if (!check_tbl_elem_idx_and_trunc(comp_ctx, func_ctx, ¶m_values[2], | ||||||
|  |                                       tbl_idx)) { | ||||||
|  |         goto fail; | ||||||
|  |     } | ||||||
|     /* v */ |     /* v */ | ||||||
| 
 | 
 | ||||||
|     if (comp_ctx->enable_gc) { |     if (comp_ctx->enable_gc) { | ||||||
|  | @ -601,7 +726,11 @@ aot_compile_op_table_fill(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     /* i */ |     /* i */ | ||||||
|     POP_I32(param_values[4]); |     POP_TBL_ELEM_IDX(param_values[4]); | ||||||
|  |     if (!check_tbl_elem_idx_and_trunc(comp_ctx, func_ctx, ¶m_values[4], | ||||||
|  |                                       tbl_idx)) { | ||||||
|  |         goto fail; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     /* "" means return void */ |     /* "" means return void */ | ||||||
|     if (!(LLVMBuildCall2(comp_ctx->builder, func_type, func, param_values, 5, |     if (!(LLVMBuildCall2(comp_ctx->builder, func_type, func, param_values, 5, | ||||||
|  |  | ||||||
|  | @ -1518,6 +1518,75 @@ create_memory_info(const AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static bool | ||||||
|  | create_shared_heap_info(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx) | ||||||
|  | { | ||||||
|  |     LLVMValueRef offset, base_addr_p, start_off_p, cmp; | ||||||
|  |     uint32 offset_u32; | ||||||
|  | 
 | ||||||
|  |     /* Load aot_inst->e->shared_heap_base_addr_adj */ | ||||||
|  |     offset_u32 = get_module_inst_extra_offset(comp_ctx); | ||||||
|  | #if WASM_ENABLE_JIT != 0 && WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     if (comp_ctx->is_jit_mode) | ||||||
|  |         offset_u32 += | ||||||
|  |             offsetof(WASMModuleInstanceExtra, shared_heap_base_addr_adj); | ||||||
|  |     else | ||||||
|  | #endif | ||||||
|  |         offset_u32 += | ||||||
|  |             offsetof(AOTModuleInstanceExtra, shared_heap_base_addr_adj); | ||||||
|  |     offset = I32_CONST(offset_u32); | ||||||
|  |     CHECK_LLVM_CONST(offset); | ||||||
|  | 
 | ||||||
|  |     if (!(base_addr_p = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE, | ||||||
|  |                                               func_ctx->aot_inst, &offset, 1, | ||||||
|  |                                               "shared_heap_base_addr_adj_p"))) { | ||||||
|  |         aot_set_last_error("llvm build inbounds gep failed"); | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |     if (!(func_ctx->shared_heap_base_addr_adj = | ||||||
|  |               LLVMBuildLoad2(comp_ctx->builder, INT8_PTR_TYPE, base_addr_p, | ||||||
|  |                              "shared_heap_base_addr_adj"))) { | ||||||
|  |         aot_set_last_error("llvm build load failed"); | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* Load aot_inst->e->shared_heap_start_off */ | ||||||
|  |     offset_u32 = get_module_inst_extra_offset(comp_ctx); | ||||||
|  | #if WASM_ENABLE_JIT != 0 && WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     if (comp_ctx->is_jit_mode) | ||||||
|  |         offset_u32 += offsetof(WASMModuleInstanceExtra, shared_heap_start_off); | ||||||
|  |     else | ||||||
|  | #endif | ||||||
|  |         offset_u32 += offsetof(AOTModuleInstanceExtra, shared_heap_start_off); | ||||||
|  |     offset = I32_CONST(offset_u32); | ||||||
|  |     CHECK_LLVM_CONST(offset); | ||||||
|  | 
 | ||||||
|  |     if (!(start_off_p = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE, | ||||||
|  |                                               func_ctx->aot_inst, &offset, 1, | ||||||
|  |                                               "shared_heap_start_off_p"))) { | ||||||
|  |         aot_set_last_error("llvm build inbounds gep failed"); | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |     if (!(func_ctx->shared_heap_start_off = LLVMBuildLoad2( | ||||||
|  |               comp_ctx->builder, | ||||||
|  |               comp_ctx->pointer_size == sizeof(uint64) ? I64_TYPE : I32_TYPE, | ||||||
|  |               start_off_p, "shared_heap_start_off"))) { | ||||||
|  |         aot_set_last_error("llvm build load failed"); | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (!(cmp = LLVMBuildIsNotNull(comp_ctx->builder, | ||||||
|  |                                    func_ctx->shared_heap_base_addr_adj, | ||||||
|  |                                    "has_shared_heap"))) { | ||||||
|  |         aot_set_last_error("llvm build is not null failed"); | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return true; | ||||||
|  | fail: | ||||||
|  |     return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static bool | static bool | ||||||
| create_cur_exception(const AOTCompContext *comp_ctx, AOTFuncContext *func_ctx) | create_cur_exception(const AOTCompContext *comp_ctx, AOTFuncContext *func_ctx) | ||||||
| { | { | ||||||
|  | @ -1808,6 +1877,12 @@ aot_create_func_context(const AOTCompData *comp_data, AOTCompContext *comp_ctx, | ||||||
|         goto fail; |         goto fail; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /* Load shared heap, shared heap start off mem32 or mem64 */ | ||||||
|  |     if (comp_ctx->enable_shared_heap | ||||||
|  |         && !create_shared_heap_info(comp_ctx, func_ctx)) { | ||||||
|  |         goto fail; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     return func_ctx; |     return func_ctx; | ||||||
| 
 | 
 | ||||||
| fail: | fail: | ||||||
|  | @ -2619,6 +2694,9 @@ aot_create_comp_context(const AOTCompData *comp_data, aot_comp_option_t option) | ||||||
|     if (option->enable_gc) |     if (option->enable_gc) | ||||||
|         comp_ctx->enable_gc = true; |         comp_ctx->enable_gc = true; | ||||||
| 
 | 
 | ||||||
|  |     if (option->enable_shared_heap) | ||||||
|  |         comp_ctx->enable_shared_heap = true; | ||||||
|  | 
 | ||||||
|     comp_ctx->opt_level = option->opt_level; |     comp_ctx->opt_level = option->opt_level; | ||||||
|     comp_ctx->size_level = option->size_level; |     comp_ctx->size_level = option->size_level; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -242,6 +242,9 @@ typedef struct AOTFuncContext { | ||||||
|     bool mem_space_unchanged; |     bool mem_space_unchanged; | ||||||
|     AOTCheckedAddrList checked_addr_list; |     AOTCheckedAddrList checked_addr_list; | ||||||
| 
 | 
 | ||||||
|  |     LLVMValueRef shared_heap_base_addr_adj; | ||||||
|  |     LLVMValueRef shared_heap_start_off; | ||||||
|  | 
 | ||||||
|     LLVMBasicBlockRef got_exception_block; |     LLVMBasicBlockRef got_exception_block; | ||||||
|     LLVMBasicBlockRef func_return_block; |     LLVMBasicBlockRef func_return_block; | ||||||
|     LLVMValueRef exception_id_phi; |     LLVMValueRef exception_id_phi; | ||||||
|  | @ -467,6 +470,8 @@ typedef struct AOTCompContext { | ||||||
|     /* Enable GC */ |     /* Enable GC */ | ||||||
|     bool enable_gc; |     bool enable_gc; | ||||||
| 
 | 
 | ||||||
|  |     bool enable_shared_heap; | ||||||
|  | 
 | ||||||
|     uint32 opt_level; |     uint32 opt_level; | ||||||
|     uint32 size_level; |     uint32 size_level; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -70,7 +70,9 @@ aot_alloc_tiny_frame_for_aot_func(AOTCompContext *comp_ctx, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* Save the func_idx on the top of the stack */ |     /* Save the func_idx on the top of the stack */ | ||||||
|  |     if (comp_ctx->call_stack_features.func_idx) { | ||||||
|         ADD_STORE(func_index, wasm_stack_top); |         ADD_STORE(func_index, wasm_stack_top); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     /* increment the stack pointer */ |     /* increment the stack pointer */ | ||||||
|     INT_CONST(offset, sizeof(AOTTinyFrame), I32_TYPE, true); |     INT_CONST(offset, sizeof(AOTTinyFrame), I32_TYPE, true); | ||||||
|  |  | ||||||
|  | @ -6,17 +6,27 @@ | ||||||
| #ifndef __AOT_COMP_OPTION_H__ | #ifndef __AOT_COMP_OPTION_H__ | ||||||
| #define __AOT_COMP_OPTION_H__ | #define __AOT_COMP_OPTION_H__ | ||||||
| 
 | 
 | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     /* Enables or disables bounds checks for stack frames. When enabled, the AOT
 |     /* Enables or disables bounds checks for stack frames. When enabled, the AOT
 | ||||||
|      * compiler generates code to check if the stack pointer is within the |      * compiler generates code to check if the stack pointer is within the | ||||||
|      * bounds of the current stack frame (and if not, traps). */ |      * bounds of the current stack frame (and if not, traps). */ | ||||||
|     bool bounds_checks; |     bool bounds_checks; | ||||||
| 
 | 
 | ||||||
|     /*  Enables or disables instruction pointer (IP) tracking.*/ |     /* Enables or disables instruction pointer (IP) tracking. */ | ||||||
|     bool ip; |     bool ip; | ||||||
| 
 | 
 | ||||||
|  |     /* Enables or disables function index in the stack trace. Please note that
 | ||||||
|  |      * function index can be recovered from the instruction pointer using | ||||||
|  |      * ip2function.py script, so enabling this feature along with `ip` might | ||||||
|  |      * often be redundant. | ||||||
|  |      * This option will automatically be enabled for GC and Perf Profiling mode. | ||||||
|  |      */ | ||||||
|  |     bool func_idx; | ||||||
|  | 
 | ||||||
|     /* Enables or disables tracking instruction pointer of a trap. Only takes
 |     /* Enables or disables tracking instruction pointer of a trap. Only takes
 | ||||||
|      * effect when `ip` is enabled.*/ |      * effect when `ip` is enabled. */ | ||||||
|     bool trap_ip; |     bool trap_ip; | ||||||
| 
 | 
 | ||||||
|     /* Enables or disables parameters, locals and stack operands. */ |     /* Enables or disables parameters, locals and stack operands. */ | ||||||
|  | @ -63,6 +73,7 @@ typedef struct AOTCompOption { | ||||||
|     bool enable_llvm_pgo; |     bool enable_llvm_pgo; | ||||||
|     bool enable_stack_estimation; |     bool enable_stack_estimation; | ||||||
|     bool quick_invoke_c_api_import; |     bool quick_invoke_c_api_import; | ||||||
|  |     bool enable_shared_heap; | ||||||
|     char *use_prof_file; |     char *use_prof_file; | ||||||
|     uint32_t opt_level; |     uint32_t opt_level; | ||||||
|     uint32_t size_level; |     uint32_t size_level; | ||||||
|  |  | ||||||
|  | @ -534,6 +534,10 @@ typedef struct LoadArgs { | ||||||
|     bool clone_wasm_binary; |     bool clone_wasm_binary; | ||||||
|     /* This option is only used by the AOT/wasm loader (see wasm_export.h) */ |     /* This option is only used by the AOT/wasm loader (see wasm_export.h) */ | ||||||
|     bool wasm_binary_freeable; |     bool wasm_binary_freeable; | ||||||
|  |     /* false by default, if true, don't resolve the symbols yet. The
 | ||||||
|  |        wasm_runtime_load_ex has to be followed by a wasm_runtime_resolve_symbols | ||||||
|  |        call */ | ||||||
|  |     bool no_resolve; | ||||||
|     /* TODO: more fields? */ |     /* TODO: more fields? */ | ||||||
| } LoadArgs; | } LoadArgs; | ||||||
| #endif /* LOAD_ARGS_OPTION_DEFINED */ | #endif /* LOAD_ARGS_OPTION_DEFINED */ | ||||||
|  |  | ||||||
|  | @ -120,6 +120,10 @@ typedef struct WASMModuleInstanceCommon *wasm_module_inst_t; | ||||||
| typedef void WASMFunctionInstanceCommon; | typedef void WASMFunctionInstanceCommon; | ||||||
| typedef WASMFunctionInstanceCommon *wasm_function_inst_t; | typedef WASMFunctionInstanceCommon *wasm_function_inst_t; | ||||||
| 
 | 
 | ||||||
|  | /* Memory instance */ | ||||||
|  | struct WASMMemoryInstance; | ||||||
|  | typedef struct WASMMemoryInstance *wasm_memory_inst_t; | ||||||
|  | 
 | ||||||
| /* WASM section */ | /* WASM section */ | ||||||
| typedef struct wasm_section_t { | typedef struct wasm_section_t { | ||||||
|     struct wasm_section_t *next; |     struct wasm_section_t *next; | ||||||
|  | @ -135,6 +139,9 @@ typedef struct wasm_section_t { | ||||||
| struct WASMExecEnv; | struct WASMExecEnv; | ||||||
| typedef struct WASMExecEnv *wasm_exec_env_t; | typedef struct WASMExecEnv *wasm_exec_env_t; | ||||||
| 
 | 
 | ||||||
|  | struct WASMSharedHeap; | ||||||
|  | typedef struct WASMSharedHeap *wasm_shared_heap_t; | ||||||
|  | 
 | ||||||
| /* Package Type */ | /* Package Type */ | ||||||
| typedef enum { | typedef enum { | ||||||
|     Wasm_Module_Bytecode = 0, |     Wasm_Module_Bytecode = 0, | ||||||
|  | @ -248,6 +255,11 @@ typedef struct LoadArgs { | ||||||
|     const strings), making it possible to free the wasm binary buffer after |     const strings), making it possible to free the wasm binary buffer after | ||||||
|     loading. */ |     loading. */ | ||||||
|     bool wasm_binary_freeable; |     bool wasm_binary_freeable; | ||||||
|  | 
 | ||||||
|  |     /* false by default, if true, don't resolve the symbols yet. The
 | ||||||
|  |        wasm_runtime_load_ex has to be followed by a wasm_runtime_resolve_symbols | ||||||
|  |        call */ | ||||||
|  |     bool no_resolve; | ||||||
|     /* TODO: more fields? */ |     /* TODO: more fields? */ | ||||||
| } LoadArgs; | } LoadArgs; | ||||||
| #endif /* LOAD_ARGS_OPTION_DEFINED */ | #endif /* LOAD_ARGS_OPTION_DEFINED */ | ||||||
|  | @ -320,6 +332,10 @@ typedef enum { | ||||||
|     WASM_LOG_LEVEL_VERBOSE = 4 |     WASM_LOG_LEVEL_VERBOSE = 4 | ||||||
| } log_level_t; | } log_level_t; | ||||||
| 
 | 
 | ||||||
|  | typedef struct SharedHeapInitArgs { | ||||||
|  |     uint32_t size; | ||||||
|  | } SharedHeapInitArgs; | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Initialize the WASM runtime environment, and also initialize |  * Initialize the WASM runtime environment, and also initialize | ||||||
|  * the memory allocator with system allocator, which calls os_malloc |  * the memory allocator with system allocator, which calls os_malloc | ||||||
|  | @ -565,6 +581,12 @@ WASM_RUNTIME_API_EXTERN wasm_module_t | ||||||
| wasm_runtime_load_ex(uint8_t *buf, uint32_t size, const LoadArgs *args, | wasm_runtime_load_ex(uint8_t *buf, uint32_t size, const LoadArgs *args, | ||||||
|                      char *error_buf, uint32_t error_buf_size); |                      char *error_buf, uint32_t error_buf_size); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * Resolve symbols for a previously loaded WASM module. Only useful when the | ||||||
|  |  * module was loaded with LoadArgs::no_resolve set to true | ||||||
|  |  */ | ||||||
|  | WASM_RUNTIME_API_EXTERN bool | ||||||
|  | wasm_runtime_resolve_symbols(wasm_module_t module); | ||||||
| /**
 | /**
 | ||||||
|  * Load a WASM module from a specified WASM or AOT section list. |  * Load a WASM module from a specified WASM or AOT section list. | ||||||
|  * |  * | ||||||
|  | @ -939,6 +961,100 @@ WASM_RUNTIME_API_EXTERN void | ||||||
| wasm_runtime_set_module_inst(wasm_exec_env_t exec_env, | wasm_runtime_set_module_inst(wasm_exec_env_t exec_env, | ||||||
|                              const wasm_module_inst_t module_inst); |                              const wasm_module_inst_t module_inst); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Lookup a memory instance by name | ||||||
|  |  * | ||||||
|  |  * @param module_inst The module instance | ||||||
|  |  * @param name The name of the memory instance | ||||||
|  |  * | ||||||
|  |  * @return The memory instance if found, NULL otherwise | ||||||
|  |  */ | ||||||
|  | WASM_RUNTIME_API_EXTERN wasm_memory_inst_t | ||||||
|  | wasm_runtime_lookup_memory(const wasm_module_inst_t module_inst, | ||||||
|  |                            const char *name); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Get the default memory instance | ||||||
|  |  * | ||||||
|  |  * @param module_inst The module instance | ||||||
|  |  * | ||||||
|  |  * @return The memory instance if found, NULL otherwise | ||||||
|  |  */ | ||||||
|  | WASM_RUNTIME_API_EXTERN wasm_memory_inst_t | ||||||
|  | wasm_runtime_get_default_memory(const wasm_module_inst_t module_inst); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Get a memory instance by index | ||||||
|  |  * | ||||||
|  |  * @param module_inst The module instance | ||||||
|  |  * @param index The index of the memory instance | ||||||
|  |  * | ||||||
|  |  * @return The memory instance if found, NULL otherwise | ||||||
|  |  */ | ||||||
|  | WASM_RUNTIME_API_EXTERN wasm_memory_inst_t | ||||||
|  | wasm_runtime_get_memory(const wasm_module_inst_t module_inst, uint32_t index); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Get the current number of pages for a memory instance | ||||||
|  |  * | ||||||
|  |  * @param memory_inst The memory instance | ||||||
|  |  * | ||||||
|  |  * @return The current number of pages | ||||||
|  |  */ | ||||||
|  | WASM_RUNTIME_API_EXTERN uint64_t | ||||||
|  | wasm_memory_get_cur_page_count(const wasm_memory_inst_t memory_inst); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Get the maximum number of pages for a memory instance | ||||||
|  |  * | ||||||
|  |  * @param memory_inst The memory instance | ||||||
|  |  * | ||||||
|  |  * @return The maximum number of pages | ||||||
|  |  */ | ||||||
|  | WASM_RUNTIME_API_EXTERN uint64_t | ||||||
|  | wasm_memory_get_max_page_count(const wasm_memory_inst_t memory_inst); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Get the number of bytes per page for a memory instance | ||||||
|  |  * | ||||||
|  |  * @param memory_inst The memory instance | ||||||
|  |  * | ||||||
|  |  * @return The number of bytes per page | ||||||
|  |  */ | ||||||
|  | WASM_RUNTIME_API_EXTERN uint64_t | ||||||
|  | wasm_memory_get_bytes_per_page(const wasm_memory_inst_t memory_inst); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Get the shared status for a memory instance | ||||||
|  |  * | ||||||
|  |  * @param memory_inst The memory instance | ||||||
|  |  * | ||||||
|  |  * @return True if shared, false otherwise | ||||||
|  |  */ | ||||||
|  | WASM_RUNTIME_API_EXTERN bool | ||||||
|  | wasm_memory_get_shared(const wasm_memory_inst_t memory_inst); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Get the base address for a memory instance | ||||||
|  |  * | ||||||
|  |  * @param memory_inst The memory instance | ||||||
|  |  * | ||||||
|  |  * @return The base address on success, false otherwise | ||||||
|  |  */ | ||||||
|  | WASM_RUNTIME_API_EXTERN void * | ||||||
|  | wasm_memory_get_base_address(const wasm_memory_inst_t memory_inst); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * @brief Enlarge a memory instance by a number of pages | ||||||
|  |  * | ||||||
|  |  * @param memory_inst The memory instance | ||||||
|  |  * @param inc_page_count The number of pages to add | ||||||
|  |  * | ||||||
|  |  * @return True if successful, false otherwise | ||||||
|  |  */ | ||||||
|  | WASM_RUNTIME_API_EXTERN bool | ||||||
|  | wasm_memory_enlarge(wasm_memory_inst_t memory_inst, uint64_t inc_page_count); | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Call the given WASM function of a WASM module instance with |  * Call the given WASM function of a WASM module instance with | ||||||
|  * arguments (bytecode and AoT). |  * arguments (bytecode and AoT). | ||||||
|  | @ -1050,8 +1166,8 @@ wasm_application_execute_main(wasm_module_inst_t module_inst, int32_t argc, | ||||||
|                               char *argv[]); |                               char *argv[]); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Find the specified function in argv[0] from a WASM module instance |  * Find the specified function from a WASM module instance and execute | ||||||
|  * and execute that function. |  * that function. | ||||||
|  * |  * | ||||||
|  * @param module_inst the WASM module instance |  * @param module_inst the WASM module instance | ||||||
|  * @param name the name of the function to execute. |  * @param name the name of the function to execute. | ||||||
|  | @ -1639,6 +1755,26 @@ wasm_runtime_set_user_data(wasm_exec_env_t exec_env, void *user_data); | ||||||
| WASM_RUNTIME_API_EXTERN void * | WASM_RUNTIME_API_EXTERN void * | ||||||
| wasm_runtime_get_user_data(wasm_exec_env_t exec_env); | wasm_runtime_get_user_data(wasm_exec_env_t exec_env); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * Set native stack boundary to execution environment, if it is set, | ||||||
|  |  * it will be used instead of getting the boundary with the platform | ||||||
|  |  * layer API when calling wasm functions. This is useful for some | ||||||
|  |  * fiber cases. | ||||||
|  |  * | ||||||
|  |  * Note: unlike setting the boundary by runtime, this API doesn't add | ||||||
|  |  * the WASM_STACK_GUARD_SIZE(see comments in core/config.h) to the | ||||||
|  |  * exec_env's native_stack_boundary to reserve bytes to the native | ||||||
|  |  * thread stack boundary, which is used to throw native stack overflow | ||||||
|  |  * exception if the guard boundary is reached. Developer should ensure | ||||||
|  |  * that enough guard bytes are kept. | ||||||
|  |  * | ||||||
|  |  * @param exec_env the execution environment | ||||||
|  |  * @param native_stack_boundary the user data to be set | ||||||
|  |  */ | ||||||
|  | WASM_RUNTIME_API_EXTERN void | ||||||
|  | wasm_runtime_set_native_stack_boundary(wasm_exec_env_t exec_env, | ||||||
|  |                                        uint8_t *native_stack_boundary); | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Dump runtime memory consumption, including: |  * Dump runtime memory consumption, including: | ||||||
|  *     Exec env memory consumption |  *     Exec env memory consumption | ||||||
|  | @ -2110,6 +2246,60 @@ wasm_runtime_detect_native_stack_overflow_size(wasm_exec_env_t exec_env, | ||||||
| WASM_RUNTIME_API_EXTERN bool | WASM_RUNTIME_API_EXTERN bool | ||||||
| wasm_runtime_is_underlying_binary_freeable(const wasm_module_t module); | wasm_runtime_is_underlying_binary_freeable(const wasm_module_t module); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * Create a shared heap | ||||||
|  |  * | ||||||
|  |  * @param init_args the initialization arguments | ||||||
|  |  * @return the shared heap created | ||||||
|  |  */ | ||||||
|  | WASM_RUNTIME_API_EXTERN wasm_shared_heap_t | ||||||
|  | wasm_runtime_create_shared_heap(SharedHeapInitArgs *init_args); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Attach a shared heap to a module instance | ||||||
|  |  * | ||||||
|  |  * @param module_inst the module instance | ||||||
|  |  * @param shared_heap the shared heap | ||||||
|  |  * @return true if success, false if failed | ||||||
|  |  */ | ||||||
|  | WASM_RUNTIME_API_EXTERN bool | ||||||
|  | wasm_runtime_attach_shared_heap(wasm_module_inst_t module_inst, | ||||||
|  |                                 wasm_shared_heap_t shared_heap); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Detach a shared heap from a module instance | ||||||
|  |  * | ||||||
|  |  * @param module_inst the module instance | ||||||
|  |  */ | ||||||
|  | WASM_RUNTIME_API_EXTERN void | ||||||
|  | wasm_runtime_detach_shared_heap(wasm_module_inst_t module_inst); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Allocate memory from a shared heap | ||||||
|  |  * | ||||||
|  |  * @param module_inst the module instance | ||||||
|  |  * @param size required memory size | ||||||
|  |  * @param p_native_addr native address of allocated memory | ||||||
|  |  * | ||||||
|  |  * @return return the allocated memory address, which re-uses part of the wasm | ||||||
|  |  * address space and is in the range of [UINT32 - shared_heap_size + 1, UINT32] | ||||||
|  |  * (when the wasm memory is 32-bit) or [UINT64 - shared_heap_size + 1, UINT64] | ||||||
|  |  * (when the wasm memory is 64-bit). Note that it is not an absolute address. | ||||||
|  |  *         Return non-zero if success, zero if failed. | ||||||
|  |  */ | ||||||
|  | WASM_RUNTIME_API_EXTERN uint64_t | ||||||
|  | wasm_runtime_shared_heap_malloc(wasm_module_inst_t module_inst, uint64_t size, | ||||||
|  |                                 void **p_native_addr); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Free the memory allocated from shared heap | ||||||
|  |  * | ||||||
|  |  * @param module_inst the module instance | ||||||
|  |  * @param ptr the offset in wasm app | ||||||
|  |  */ | ||||||
|  | WASM_RUNTIME_API_EXTERN void | ||||||
|  | wasm_runtime_shared_heap_free(wasm_module_inst_t module_inst, uint64_t ptr); | ||||||
|  | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -96,6 +96,10 @@ extern "C" { | ||||||
| #define MAX_PAGE_COUNT_FLAG 0x01 | #define MAX_PAGE_COUNT_FLAG 0x01 | ||||||
| #define SHARED_MEMORY_FLAG 0x02 | #define SHARED_MEMORY_FLAG 0x02 | ||||||
| #define MEMORY64_FLAG 0x04 | #define MEMORY64_FLAG 0x04 | ||||||
|  | #define MAX_TABLE_SIZE_FLAG 0x01 | ||||||
|  | /* the shared flag for table is not actual used now */ | ||||||
|  | #define SHARED_TABLE_FLAG 0x02 | ||||||
|  | #define TABLE64_FLAG 0x04 | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * In the multi-memory proposal, the memarg in loads and stores are |  * In the multi-memory proposal, the memarg in loads and stores are | ||||||
|  | @ -497,6 +501,7 @@ typedef struct WASMTableType { | ||||||
|      * 0: no max size and not shared |      * 0: no max size and not shared | ||||||
|      * 1: has max size |      * 1: has max size | ||||||
|      * 2: shared |      * 2: shared | ||||||
|  |      * 4: table64 | ||||||
|      */ |      */ | ||||||
|     uint8 flags; |     uint8 flags; | ||||||
|     bool possible_grow; |     bool possible_grow; | ||||||
|  | @ -523,6 +528,7 @@ typedef uint64 mem_offset_t; | ||||||
| typedef uint32 mem_offset_t; | typedef uint32 mem_offset_t; | ||||||
| #define PR_MEM_OFFSET PRIu32 | #define PR_MEM_OFFSET PRIu32 | ||||||
| #endif | #endif | ||||||
|  | typedef mem_offset_t tbl_elem_idx_t; | ||||||
| 
 | 
 | ||||||
| typedef struct WASMMemory { | typedef struct WASMMemory { | ||||||
|     uint32 flags; |     uint32 flags; | ||||||
|  | @ -980,7 +986,8 @@ struct WASMModule { | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_DEBUG_INTERP != 0 || WASM_ENABLE_FAST_JIT != 0  \ | #if WASM_ENABLE_DEBUG_INTERP != 0 || WASM_ENABLE_FAST_JIT != 0  \ | ||||||
|     || WASM_ENABLE_DUMP_CALL_STACK != 0 || WASM_ENABLE_JIT != 0 |     || WASM_ENABLE_DUMP_CALL_STACK != 0 || WASM_ENABLE_JIT != 0 \ | ||||||
|  |     || WASM_ENABLE_WAMR_COMPILER != 0 | ||||||
|     uint8 *load_addr; |     uint8 *load_addr; | ||||||
|     uint64 load_size; |     uint64 load_size; | ||||||
| #endif | #endif | ||||||
|  | @ -1245,6 +1252,9 @@ wasm_value_type_size_internal(uint8 value_type, uint8 pointer_size) | ||||||
|     else { |     else { | ||||||
|         bh_assert(0); |         bh_assert(0); | ||||||
|     } |     } | ||||||
|  | #if WASM_ENABLE_GC == 0 | ||||||
|  |     (void)pointer_size; | ||||||
|  | #endif | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -46,6 +46,28 @@ typedef float64 CellType_F64; | ||||||
| #define get_linear_mem_size() GET_LINEAR_MEMORY_SIZE(memory) | #define get_linear_mem_size() GET_LINEAR_MEMORY_SIZE(memory) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  | #if WASM_ENABLE_MULTI_MEMORY != 0 | ||||||
|  | /* Only enable shared heap for the default memory */ | ||||||
|  | #define is_default_memory (memidx == 0) | ||||||
|  | #else | ||||||
|  | #define is_default_memory true | ||||||
|  | #endif | ||||||
|  | #define app_addr_in_shared_heap(app_addr, bytes)                             \ | ||||||
|  |     (shared_heap && is_default_memory && (app_addr) >= shared_heap_start_off \ | ||||||
|  |      && (app_addr) <= shared_heap_end_off - bytes + 1) | ||||||
|  | 
 | ||||||
|  | #define shared_heap_addr_app_to_native(app_addr, native_addr) \ | ||||||
|  |     native_addr = shared_heap_base_addr + ((app_addr)-shared_heap_start_off) | ||||||
|  | 
 | ||||||
|  | #define CHECK_SHARED_HEAP_OVERFLOW(app_addr, bytes, native_addr) \ | ||||||
|  |     if (app_addr_in_shared_heap(app_addr, bytes))                \ | ||||||
|  |         shared_heap_addr_app_to_native(app_addr, native_addr);   \ | ||||||
|  |     else | ||||||
|  | #else | ||||||
|  | #define CHECK_SHARED_HEAP_OVERFLOW(app_addr, bytes, native_addr) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #if WASM_ENABLE_MEMORY64 == 0 | #if WASM_ENABLE_MEMORY64 == 0 | ||||||
| 
 | 
 | ||||||
| #if (!defined(OS_ENABLE_HW_BOUND_CHECK) \ | #if (!defined(OS_ENABLE_HW_BOUND_CHECK) \ | ||||||
|  | @ -53,6 +75,7 @@ typedef float64 CellType_F64; | ||||||
| #define CHECK_MEMORY_OVERFLOW(bytes)                                           \ | #define CHECK_MEMORY_OVERFLOW(bytes)                                           \ | ||||||
|     do {                                                                       \ |     do {                                                                       \ | ||||||
|         uint64 offset1 = (uint64)offset + (uint64)addr;                        \ |         uint64 offset1 = (uint64)offset + (uint64)addr;                        \ | ||||||
|  |         CHECK_SHARED_HEAP_OVERFLOW(offset1, bytes, maddr)                      \ | ||||||
|         if (disable_bounds_checks || offset1 + bytes <= get_linear_mem_size()) \ |         if (disable_bounds_checks || offset1 + bytes <= get_linear_mem_size()) \ | ||||||
|             /* If offset1 is in valid range, maddr must also                   \
 |             /* If offset1 is in valid range, maddr must also                   \
 | ||||||
|                be in valid range, no need to check it again. */                \ |                be in valid range, no need to check it again. */                \ | ||||||
|  | @ -64,6 +87,7 @@ typedef float64 CellType_F64; | ||||||
| #define CHECK_BULK_MEMORY_OVERFLOW(start, bytes, maddr)                        \ | #define CHECK_BULK_MEMORY_OVERFLOW(start, bytes, maddr)                        \ | ||||||
|     do {                                                                       \ |     do {                                                                       \ | ||||||
|         uint64 offset1 = (uint32)(start);                                      \ |         uint64 offset1 = (uint32)(start);                                      \ | ||||||
|  |         CHECK_SHARED_HEAP_OVERFLOW(offset1, bytes, maddr)                      \ | ||||||
|         if (disable_bounds_checks || offset1 + bytes <= get_linear_mem_size()) \ |         if (disable_bounds_checks || offset1 + bytes <= get_linear_mem_size()) \ | ||||||
|             /* App heap space is not valid space for                           \
 |             /* App heap space is not valid space for                           \
 | ||||||
|              bulk memory operation */                                          \ |              bulk memory operation */                                          \ | ||||||
|  | @ -71,18 +95,24 @@ typedef float64 CellType_F64; | ||||||
|         else                                                                   \ |         else                                                                   \ | ||||||
|             goto out_of_bounds;                                                \ |             goto out_of_bounds;                                                \ | ||||||
|     } while (0) |     } while (0) | ||||||
|  | 
 | ||||||
| #else /* else of !defined(OS_ENABLE_HW_BOUND_CHECK) || \ | #else /* else of !defined(OS_ENABLE_HW_BOUND_CHECK) || \ | ||||||
|          WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 */ |          WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 */ | ||||||
|  | 
 | ||||||
| #define CHECK_MEMORY_OVERFLOW(bytes)                      \ | #define CHECK_MEMORY_OVERFLOW(bytes)                      \ | ||||||
|     do {                                                  \ |     do {                                                  \ | ||||||
|         uint64 offset1 = (uint64)offset + (uint64)addr;   \ |         uint64 offset1 = (uint64)offset + (uint64)addr;   \ | ||||||
|  |         CHECK_SHARED_HEAP_OVERFLOW(offset1, bytes, maddr) \ | ||||||
|         maddr = memory->memory_data + offset1;            \ |         maddr = memory->memory_data + offset1;            \ | ||||||
|     } while (0) |     } while (0) | ||||||
| 
 | 
 | ||||||
| #define CHECK_BULK_MEMORY_OVERFLOW(start, bytes, maddr)   \ | #define CHECK_BULK_MEMORY_OVERFLOW(start, bytes, maddr)   \ | ||||||
|     do {                                                  \ |     do {                                                  \ | ||||||
|         maddr = memory->memory_data + (uint32)(start);  \ |         uint64 offset1 = (uint32)(start);                 \ | ||||||
|  |         CHECK_SHARED_HEAP_OVERFLOW(offset1, bytes, maddr) \ | ||||||
|  |         maddr = memory->memory_data + offset1;            \ | ||||||
|     } while (0) |     } while (0) | ||||||
|  | 
 | ||||||
| #endif /* end of !defined(OS_ENABLE_HW_BOUND_CHECK) || \ | #endif /* end of !defined(OS_ENABLE_HW_BOUND_CHECK) || \ | ||||||
|           WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 */ |           WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 */ | ||||||
| 
 | 
 | ||||||
|  | @ -91,6 +121,7 @@ typedef float64 CellType_F64; | ||||||
| #define CHECK_MEMORY_OVERFLOW(bytes)                                        \ | #define CHECK_MEMORY_OVERFLOW(bytes)                                        \ | ||||||
|     do {                                                                    \ |     do {                                                                    \ | ||||||
|         uint64 offset1 = (uint64)offset + (uint64)addr;                     \ |         uint64 offset1 = (uint64)offset + (uint64)addr;                     \ | ||||||
|  |         CHECK_SHARED_HEAP_OVERFLOW(offset1, bytes, maddr)                   \ | ||||||
|         /* If memory64 is enabled, offset1, offset1 + bytes can overflow */ \ |         /* If memory64 is enabled, offset1, offset1 + bytes can overflow */ \ | ||||||
|         if (disable_bounds_checks                                           \ |         if (disable_bounds_checks                                           \ | ||||||
|             || (offset1 >= offset && offset1 + bytes >= offset1             \ |             || (offset1 >= offset && offset1 + bytes >= offset1             \ | ||||||
|  | @ -99,9 +130,11 @@ typedef float64 CellType_F64; | ||||||
|         else                                                                \ |         else                                                                \ | ||||||
|             goto out_of_bounds;                                             \ |             goto out_of_bounds;                                             \ | ||||||
|     } while (0) |     } while (0) | ||||||
|  | 
 | ||||||
| #define CHECK_BULK_MEMORY_OVERFLOW(start, bytes, maddr)            \ | #define CHECK_BULK_MEMORY_OVERFLOW(start, bytes, maddr)            \ | ||||||
|     do {                                                           \ |     do {                                                           \ | ||||||
|         uint64 offset1 = (uint64)(start);                          \ |         uint64 offset1 = (uint64)(start);                          \ | ||||||
|  |         CHECK_SHARED_HEAP_OVERFLOW(offset1, bytes, maddr)          \ | ||||||
|         /* If memory64 is enabled, offset1 + bytes can overflow */ \ |         /* If memory64 is enabled, offset1 + bytes can overflow */ \ | ||||||
|         if (disable_bounds_checks                                  \ |         if (disable_bounds_checks                                  \ | ||||||
|             || (offset1 + bytes >= offset1                         \ |             || (offset1 + bytes >= offset1                         \ | ||||||
|  | @ -511,9 +544,9 @@ wasm_interp_get_frame_ref(WASMInterpFrame *frame) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_MEMORY64 != 0 | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
| #define PUSH_MEM_OFFSET(value)                     \ | #define COND_PUSH_TEMPLATE(cond, value)            \ | ||||||
|     do {                                           \ |     do {                                           \ | ||||||
|         if (is_memory64) {                         \ |         if (cond) {                                \ | ||||||
|             PUT_I64_TO_ADDR(frame_sp, value);      \ |             PUT_I64_TO_ADDR(frame_sp, value);      \ | ||||||
|             frame_sp += 2;                         \ |             frame_sp += 2;                         \ | ||||||
|         }                                          \ |         }                                          \ | ||||||
|  | @ -521,8 +554,11 @@ wasm_interp_get_frame_ref(WASMInterpFrame *frame) | ||||||
|             *(int32 *)frame_sp++ = (int32)(value); \ |             *(int32 *)frame_sp++ = (int32)(value); \ | ||||||
|         }                                          \ |         }                                          \ | ||||||
|     } while (0) |     } while (0) | ||||||
|  | #define PUSH_MEM_OFFSET(value) COND_PUSH_TEMPLATE(is_memory64, value) | ||||||
|  | #define PUSH_TBL_ELEM_IDX(value) COND_PUSH_TEMPLATE(is_table64, value) | ||||||
| #else | #else | ||||||
| #define PUSH_MEM_OFFSET(value) PUSH_I32(value) | #define PUSH_MEM_OFFSET(value) PUSH_I32(value) | ||||||
|  | #define PUSH_TBL_ELEM_IDX(value) PUSH_I32(value) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #define PUSH_PAGE_COUNT(value) PUSH_MEM_OFFSET(value) | #define PUSH_PAGE_COUNT(value) PUSH_MEM_OFFSET(value) | ||||||
|  | @ -558,8 +594,10 @@ wasm_interp_get_frame_ref(WASMInterpFrame *frame) | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_MEMORY64 != 0 | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
| #define POP_MEM_OFFSET() (is_memory64 ? POP_I64() : POP_I32()) | #define POP_MEM_OFFSET() (is_memory64 ? POP_I64() : POP_I32()) | ||||||
|  | #define POP_TBL_ELEM_IDX() (is_table64 ? POP_I64() : POP_I32()) | ||||||
| #else | #else | ||||||
| #define POP_MEM_OFFSET() POP_I32() | #define POP_MEM_OFFSET() POP_I32() | ||||||
|  | #define POP_TBL_ELEM_IDX() POP_I32() | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #define POP_PAGE_COUNT() POP_MEM_OFFSET() | #define POP_PAGE_COUNT() POP_MEM_OFFSET() | ||||||
|  | @ -1562,7 +1600,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|     uint8 opcode; |     uint8 opcode; | ||||||
|     uint32 i, depth, cond, count, fidx, tidx, lidx, frame_size = 0; |     uint32 i, depth, cond, count, fidx, tidx, lidx, frame_size = 0; | ||||||
|     uint32 all_cell_num = 0; |     uint32 all_cell_num = 0; | ||||||
|     int32 val; |     tbl_elem_idx_t val; | ||||||
|     uint8 *else_addr, *end_addr, *maddr = NULL; |     uint8 *else_addr, *end_addr, *maddr = NULL; | ||||||
|     uint32 local_idx, local_offset, global_idx; |     uint32 local_idx, local_offset, global_idx; | ||||||
|     uint8 local_type, *global_addr; |     uint8 local_type, *global_addr; | ||||||
|  | @ -1602,9 +1640,26 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|     /* TODO: multi-memories for now assuming the memory idx type is consistent
 |     /* TODO: multi-memories for now assuming the memory idx type is consistent
 | ||||||
|      * across multi-memories */ |      * across multi-memories */ | ||||||
|     bool is_memory64 = false; |     bool is_memory64 = false; | ||||||
|  |     bool is_table64 = false; | ||||||
|     if (memory) |     if (memory) | ||||||
|         is_memory64 = memory->is_memory64; |         is_memory64 = memory->is_memory64; | ||||||
| #endif | #endif | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     WASMSharedHeap *shared_heap = module->e->shared_heap; | ||||||
|  |     uint8 *shared_heap_base_addr = shared_heap ? shared_heap->base_addr : NULL; | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |     uint64 shared_heap_start_off = | ||||||
|  |         shared_heap ? (is_memory64 ? shared_heap->start_off_mem64 | ||||||
|  |                                    : shared_heap->start_off_mem32) | ||||||
|  |                     : 0; | ||||||
|  |     uint64 shared_heap_end_off = | ||||||
|  |         shared_heap ? (is_memory64 ? UINT64_MAX : UINT32_MAX) : 0; | ||||||
|  | #else | ||||||
|  |     uint64 shared_heap_start_off = | ||||||
|  |         shared_heap ? shared_heap->start_off_mem32 : 0; | ||||||
|  |     uint64 shared_heap_end_off = shared_heap ? UINT32_MAX : 0; | ||||||
|  | #endif | ||||||
|  | #endif /* end of WASM_ENABLE_SHARED_HEAP != 0 */ | ||||||
| #if WASM_ENABLE_MULTI_MEMORY != 0 | #if WASM_ENABLE_MULTI_MEMORY != 0 | ||||||
|     uint32 memidx = 0; |     uint32 memidx = 0; | ||||||
|     uint32 memidx_cached = (uint32)-1; |     uint32 memidx_cached = (uint32)-1; | ||||||
|  | @ -2315,7 +2370,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
| 
 | 
 | ||||||
|                 /**
 |                 /**
 | ||||||
|                  * type check. compiler will make sure all like |                  * type check. compiler will make sure all like | ||||||
|                  * (call_indirect (type $x) (i32.const 1)) |                  * (call_indirect (type $x) (it.const 1)) | ||||||
|                  * the function type has to be defined in the module also |                  * the function type has to be defined in the module also | ||||||
|                  * no matter it is used or not |                  * no matter it is used or not | ||||||
|                  */ |                  */ | ||||||
|  | @ -2334,9 +2389,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|                 /* clang-format on */ |                 /* clang-format on */ | ||||||
| 
 | 
 | ||||||
|                 tbl_inst = wasm_get_table_inst(module, tbl_idx); |                 tbl_inst = wasm_get_table_inst(module, tbl_idx); | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                 is_table64 = tbl_inst->is_table64; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
|                 val = POP_I32(); |                 val = POP_TBL_ELEM_IDX(); | ||||||
|                 if ((uint32)val >= tbl_inst->cur_size) { |                 if (val >= tbl_inst->cur_size) { | ||||||
|                     wasm_set_exception(module, "undefined element"); |                     wasm_set_exception(module, "undefined element"); | ||||||
|                     goto got_exception; |                     goto got_exception; | ||||||
|                 } |                 } | ||||||
|  | @ -2482,15 +2540,19 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
| 
 | 
 | ||||||
|             HANDLE_OP(WASM_OP_TABLE_GET) |             HANDLE_OP(WASM_OP_TABLE_GET) | ||||||
|             { |             { | ||||||
|                 uint32 tbl_idx, elem_idx; |                 uint32 tbl_idx; | ||||||
|  |                 tbl_elem_idx_t elem_idx; | ||||||
|                 WASMTableInstance *tbl_inst; |                 WASMTableInstance *tbl_inst; | ||||||
| 
 | 
 | ||||||
|                 read_leb_uint32(frame_ip, frame_ip_end, tbl_idx); |                 read_leb_uint32(frame_ip, frame_ip_end, tbl_idx); | ||||||
|                 bh_assert(tbl_idx < module->table_count); |                 bh_assert(tbl_idx < module->table_count); | ||||||
| 
 | 
 | ||||||
|                 tbl_inst = wasm_get_table_inst(module, tbl_idx); |                 tbl_inst = wasm_get_table_inst(module, tbl_idx); | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                 is_table64 = tbl_inst->is_table64; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
|                 elem_idx = POP_I32(); |                 elem_idx = POP_TBL_ELEM_IDX(); | ||||||
|                 if (elem_idx >= tbl_inst->cur_size) { |                 if (elem_idx >= tbl_inst->cur_size) { | ||||||
|                     wasm_set_exception(module, "out of bounds table access"); |                     wasm_set_exception(module, "out of bounds table access"); | ||||||
|                     goto got_exception; |                     goto got_exception; | ||||||
|  | @ -2507,20 +2569,24 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|             HANDLE_OP(WASM_OP_TABLE_SET) |             HANDLE_OP(WASM_OP_TABLE_SET) | ||||||
|             { |             { | ||||||
|                 WASMTableInstance *tbl_inst; |                 WASMTableInstance *tbl_inst; | ||||||
|                 uint32 tbl_idx, elem_idx; |                 uint32 tbl_idx; | ||||||
|  |                 tbl_elem_idx_t elem_idx; | ||||||
|                 table_elem_type_t elem_val; |                 table_elem_type_t elem_val; | ||||||
| 
 | 
 | ||||||
|                 read_leb_uint32(frame_ip, frame_ip_end, tbl_idx); |                 read_leb_uint32(frame_ip, frame_ip_end, tbl_idx); | ||||||
|                 bh_assert(tbl_idx < module->table_count); |                 bh_assert(tbl_idx < module->table_count); | ||||||
| 
 | 
 | ||||||
|                 tbl_inst = wasm_get_table_inst(module, tbl_idx); |                 tbl_inst = wasm_get_table_inst(module, tbl_idx); | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                 is_table64 = tbl_inst->is_table64; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_GC == 0 | #if WASM_ENABLE_GC == 0 | ||||||
|                 elem_val = POP_I32(); |                 elem_val = POP_I32(); | ||||||
| #else | #else | ||||||
|                 elem_val = POP_REF(); |                 elem_val = POP_REF(); | ||||||
| #endif | #endif | ||||||
|                 elem_idx = POP_I32(); |                 elem_idx = POP_TBL_ELEM_IDX(); | ||||||
|                 if (elem_idx >= tbl_inst->cur_size) { |                 if (elem_idx >= tbl_inst->cur_size) { | ||||||
|                     wasm_set_exception(module, "out of bounds table access"); |                     wasm_set_exception(module, "out of bounds table access"); | ||||||
|                     goto got_exception; |                     goto got_exception; | ||||||
|  | @ -3455,8 +3521,15 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|                         str_obj = (WASMString)wasm_stringref_obj_get_value( |                         str_obj = (WASMString)wasm_stringref_obj_get_value( | ||||||
|                             stringref_obj); |                             stringref_obj); | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |                         if (app_addr_in_shared_heap((uint64)addr, 1)) | ||||||
|  |                             shared_heap_addr_app_to_native((uint64)addr, maddr); | ||||||
|  |                         else | ||||||
|  | #endif | ||||||
|  |                         { | ||||||
|                             memory_inst = module->memories[mem_idx]; |                             memory_inst = module->memories[mem_idx]; | ||||||
|                             maddr = memory_inst->memory_data + addr; |                             maddr = memory_inst->memory_data + addr; | ||||||
|  |                         } | ||||||
| 
 | 
 | ||||||
|                         if (opcode == WASM_OP_STRING_ENCODE_WTF16) { |                         if (opcode == WASM_OP_STRING_ENCODE_WTF16) { | ||||||
|                             flag = WTF16; |                             flag = WTF16; | ||||||
|  | @ -3623,8 +3696,15 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|                         addr = POP_I32(); |                         addr = POP_I32(); | ||||||
|                         stringview_wtf8_obj = POP_REF(); |                         stringview_wtf8_obj = POP_REF(); | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |                         if (app_addr_in_shared_heap((uint64)addr, 1)) | ||||||
|  |                             shared_heap_addr_app_to_native((uint64)addr, maddr); | ||||||
|  |                         else | ||||||
|  | #endif | ||||||
|  |                         { | ||||||
|                             memory_inst = module->memories[mem_idx]; |                             memory_inst = module->memories[mem_idx]; | ||||||
|                             maddr = memory_inst->memory_data + addr; |                             maddr = memory_inst->memory_data + addr; | ||||||
|  |                         } | ||||||
| 
 | 
 | ||||||
|                         bytes_written = wasm_string_encode( |                         bytes_written = wasm_string_encode( | ||||||
|                             (WASMString)wasm_stringview_wtf8_obj_get_value( |                             (WASMString)wasm_stringview_wtf8_obj_get_value( | ||||||
|  | @ -4616,13 +4696,19 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
| 
 | 
 | ||||||
|             HANDLE_OP(WASM_OP_MEMORY_GROW) |             HANDLE_OP(WASM_OP_MEMORY_GROW) | ||||||
|             { |             { | ||||||
|                 uint32 mem_idx, delta, prev_page_count; |                 uint32 mem_idx, prev_page_count; | ||||||
|  |                 mem_offset_t delta; | ||||||
| 
 | 
 | ||||||
|                 read_leb_memidx(frame_ip, frame_ip_end, mem_idx); |                 read_leb_memidx(frame_ip, frame_ip_end, mem_idx); | ||||||
|                 prev_page_count = memory->cur_page_count; |                 prev_page_count = memory->cur_page_count; | ||||||
|                 delta = (uint32)POP_PAGE_COUNT(); |                 delta = POP_PAGE_COUNT(); | ||||||
| 
 | 
 | ||||||
|                 if (!wasm_enlarge_memory_with_idx(module, delta, mem_idx)) { |                 if ( | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                     delta > UINT32_MAX || | ||||||
|  | #endif | ||||||
|  |                     !wasm_enlarge_memory_with_idx(module, (uint32)delta, | ||||||
|  |                                                   mem_idx)) { | ||||||
|                     /* failed to memory.grow, return -1 */ |                     /* failed to memory.grow, return -1 */ | ||||||
|                     PUSH_PAGE_COUNT(-1); |                     PUSH_PAGE_COUNT(-1); | ||||||
|                 } |                 } | ||||||
|  | @ -5651,9 +5737,18 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
| #ifndef OS_ENABLE_HW_BOUND_CHECK | #ifndef OS_ENABLE_HW_BOUND_CHECK | ||||||
|                         CHECK_BULK_MEMORY_OVERFLOW(addr, bytes, maddr); |                         CHECK_BULK_MEMORY_OVERFLOW(addr, bytes, maddr); | ||||||
| #else | #else | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |                         if (app_addr_in_shared_heap((uint64)(uint32)addr, | ||||||
|  |                                                     bytes)) | ||||||
|  |                             shared_heap_addr_app_to_native((uint64)(uint32)addr, | ||||||
|  |                                                            maddr); | ||||||
|  |                         else | ||||||
|  | #endif | ||||||
|  |                         { | ||||||
|                             if ((uint64)(uint32)addr + bytes > linear_mem_size) |                             if ((uint64)(uint32)addr + bytes > linear_mem_size) | ||||||
|                                 goto out_of_bounds; |                                 goto out_of_bounds; | ||||||
|                             maddr = memory->memory_data + (uint32)addr; |                             maddr = memory->memory_data + (uint32)addr; | ||||||
|  |                         } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|                         if (bh_bitmap_get_bit(module->e->common.data_dropped, |                         if (bh_bitmap_get_bit(module->e->common.data_dropped, | ||||||
|  | @ -5703,15 +5798,30 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
| #if WASM_ENABLE_THREAD_MGR != 0 | #if WASM_ENABLE_THREAD_MGR != 0 | ||||||
|                         linear_mem_size = get_linear_mem_size(); |                         linear_mem_size = get_linear_mem_size(); | ||||||
| #endif | #endif | ||||||
|  | 
 | ||||||
|  |                         dlen = linear_mem_size - dst; | ||||||
|  | 
 | ||||||
|                         /* dst boundary check */ |                         /* dst boundary check */ | ||||||
| #ifndef OS_ENABLE_HW_BOUND_CHECK | #ifndef OS_ENABLE_HW_BOUND_CHECK | ||||||
|                         CHECK_BULK_MEMORY_OVERFLOW(dst, len, mdst); |                         CHECK_BULK_MEMORY_OVERFLOW(dst, len, mdst); | ||||||
| #else | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |                         if (app_addr_in_shared_heap((uint64)dst, len)) | ||||||
|  |                             dlen = shared_heap_end_off - dst + 1; | ||||||
|  | #endif | ||||||
|  | #else /* else of OS_ENABLE_HW_BOUND_CHECK */ | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |                         if (app_addr_in_shared_heap((uint64)dst, len)) { | ||||||
|  |                             shared_heap_addr_app_to_native((uint64)dst, mdst); | ||||||
|  |                             dlen = shared_heap_end_off - dst + 1; | ||||||
|  |                         } | ||||||
|  |                         else | ||||||
|  | #endif | ||||||
|  |                         { | ||||||
|                             if ((uint64)dst + len > linear_mem_size) |                             if ((uint64)dst + len > linear_mem_size) | ||||||
|                                 goto out_of_bounds; |                                 goto out_of_bounds; | ||||||
|                             mdst = memory->memory_data + dst; |                             mdst = memory->memory_data + dst; | ||||||
| #endif |                         } | ||||||
|                         dlen = linear_mem_size - dst; | #endif /* end of OS_ENABLE_HW_BOUND_CHECK */ | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_MULTI_MEMORY != 0 | #if WASM_ENABLE_MULTI_MEMORY != 0 | ||||||
|                         /* src memidx */ |                         /* src memidx */ | ||||||
|  | @ -5727,9 +5837,16 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
| #ifndef OS_ENABLE_HW_BOUND_CHECK | #ifndef OS_ENABLE_HW_BOUND_CHECK | ||||||
|                         CHECK_BULK_MEMORY_OVERFLOW(src, len, msrc); |                         CHECK_BULK_MEMORY_OVERFLOW(src, len, msrc); | ||||||
| #else | #else | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |                         if (app_addr_in_shared_heap((uint64)src, len)) | ||||||
|  |                             shared_heap_addr_app_to_native((uint64)src, msrc); | ||||||
|  |                         else | ||||||
|  | #endif | ||||||
|  |                         { | ||||||
|                             if ((uint64)src + len > linear_mem_size) |                             if ((uint64)src + len > linear_mem_size) | ||||||
|                                 goto out_of_bounds; |                                 goto out_of_bounds; | ||||||
|                             msrc = memory->memory_data + src; |                             msrc = memory->memory_data + src; | ||||||
|  |                         } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_MEMORY64 == 0 | #if WASM_ENABLE_MEMORY64 == 0 | ||||||
|  | @ -5766,9 +5883,17 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
| #ifndef OS_ENABLE_HW_BOUND_CHECK | #ifndef OS_ENABLE_HW_BOUND_CHECK | ||||||
|                         CHECK_BULK_MEMORY_OVERFLOW(dst, len, mdst); |                         CHECK_BULK_MEMORY_OVERFLOW(dst, len, mdst); | ||||||
| #else | #else | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |                         if (app_addr_in_shared_heap((uint64)(uint32)dst, len)) | ||||||
|  |                             shared_heap_addr_app_to_native((uint64)(uint32)dst, | ||||||
|  |                                                            mdst); | ||||||
|  |                         else | ||||||
|  | #endif | ||||||
|  |                         { | ||||||
|                             if ((uint64)(uint32)dst + len > linear_mem_size) |                             if ((uint64)(uint32)dst + len > linear_mem_size) | ||||||
|                                 goto out_of_bounds; |                                 goto out_of_bounds; | ||||||
|                             mdst = memory->memory_data + (uint32)dst; |                             mdst = memory->memory_data + (uint32)dst; | ||||||
|  |                         } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|                         memset(mdst, fill_val, len); |                         memset(mdst, fill_val, len); | ||||||
|  | @ -5778,8 +5903,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
| #if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 | #if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 | ||||||
|                     case WASM_OP_TABLE_INIT: |                     case WASM_OP_TABLE_INIT: | ||||||
|                     { |                     { | ||||||
|                         uint32 tbl_idx, elem_idx; |                         uint32 tbl_idx; | ||||||
|                         uint32 n, s, d; |                         tbl_elem_idx_t elem_idx, d; | ||||||
|  |                         uint32 n, s; | ||||||
|                         WASMTableInstance *tbl_inst; |                         WASMTableInstance *tbl_inst; | ||||||
|                         table_elem_type_t *table_elems; |                         table_elem_type_t *table_elems; | ||||||
|                         InitializerExpression *tbl_seg_init_values = NULL, |                         InitializerExpression *tbl_seg_init_values = NULL, | ||||||
|  | @ -5793,10 +5919,13 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|                         bh_assert(tbl_idx < module->module->table_count); |                         bh_assert(tbl_idx < module->module->table_count); | ||||||
| 
 | 
 | ||||||
|                         tbl_inst = wasm_get_table_inst(module, tbl_idx); |                         tbl_inst = wasm_get_table_inst(module, tbl_idx); | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                         is_table64 = tbl_inst->is_table64; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
|                         n = (uint32)POP_I32(); |                         n = (uint32)POP_I32(); | ||||||
|                         s = (uint32)POP_I32(); |                         s = (uint32)POP_I32(); | ||||||
|                         d = (uint32)POP_I32(); |                         d = (tbl_elem_idx_t)POP_TBL_ELEM_IDX(); | ||||||
| 
 | 
 | ||||||
|                         if (!bh_bitmap_get_bit(module->e->common.elem_dropped, |                         if (!bh_bitmap_get_bit(module->e->common.elem_dropped, | ||||||
|                                                elem_idx)) { |                                                elem_idx)) { | ||||||
|  | @ -5809,8 +5938,15 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|                                     .value_count; |                                     .value_count; | ||||||
|                         } |                         } | ||||||
| 
 | 
 | ||||||
|                         if (offset_len_out_of_bounds(s, n, tbl_seg_len) |                         /* TODO: memory64 current implementation of table64
 | ||||||
|                             || offset_len_out_of_bounds(d, n, |                          * still assumes the max table size UINT32_MAX | ||||||
|  |                          */ | ||||||
|  |                         if ( | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                             d > UINT32_MAX || | ||||||
|  | #endif | ||||||
|  |                             offset_len_out_of_bounds(s, n, tbl_seg_len) | ||||||
|  |                             || offset_len_out_of_bounds((uint32)d, n, | ||||||
|                                                         tbl_inst->cur_size)) { |                                                         tbl_inst->cur_size)) { | ||||||
|                             wasm_set_exception(module, |                             wasm_set_exception(module, | ||||||
|                                                "out of bounds table access"); |                                                "out of bounds table access"); | ||||||
|  | @ -5864,7 +6000,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|                     case WASM_OP_TABLE_COPY: |                     case WASM_OP_TABLE_COPY: | ||||||
|                     { |                     { | ||||||
|                         uint32 src_tbl_idx, dst_tbl_idx; |                         uint32 src_tbl_idx, dst_tbl_idx; | ||||||
|                         uint32 n, s, d; |                         tbl_elem_idx_t n, s, d; | ||||||
|                         WASMTableInstance *src_tbl_inst, *dst_tbl_inst; |                         WASMTableInstance *src_tbl_inst, *dst_tbl_inst; | ||||||
| 
 | 
 | ||||||
|                         read_leb_uint32(frame_ip, frame_ip_end, dst_tbl_idx); |                         read_leb_uint32(frame_ip, frame_ip_end, dst_tbl_idx); | ||||||
|  | @ -5877,14 +6013,29 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
| 
 | 
 | ||||||
|                         src_tbl_inst = wasm_get_table_inst(module, src_tbl_idx); |                         src_tbl_inst = wasm_get_table_inst(module, src_tbl_idx); | ||||||
| 
 | 
 | ||||||
|                         n = (uint32)POP_I32(); | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|                         s = (uint32)POP_I32(); |                         is_table64 = src_tbl_inst->is_table64 | ||||||
|                         d = (uint32)POP_I32(); |                                      && dst_tbl_inst->is_table64; | ||||||
|  | #endif | ||||||
|  |                         n = (tbl_elem_idx_t)POP_TBL_ELEM_IDX(); | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                         is_table64 = src_tbl_inst->is_table64; | ||||||
|  | #endif | ||||||
|  |                         s = (tbl_elem_idx_t)POP_TBL_ELEM_IDX(); | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                         is_table64 = dst_tbl_inst->is_table64; | ||||||
|  | #endif | ||||||
|  |                         d = (tbl_elem_idx_t)POP_TBL_ELEM_IDX(); | ||||||
| 
 | 
 | ||||||
|                         if (offset_len_out_of_bounds(d, n, |                         if ( | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                             n > UINT32_MAX || s > UINT32_MAX || d > UINT32_MAX | ||||||
|  |                             || | ||||||
|  | #endif | ||||||
|  |                             offset_len_out_of_bounds((uint32)d, (uint32)n, | ||||||
|                                                      dst_tbl_inst->cur_size) |                                                      dst_tbl_inst->cur_size) | ||||||
|                             || offset_len_out_of_bounds( |                             || offset_len_out_of_bounds( | ||||||
|                                 s, n, src_tbl_inst->cur_size)) { |                                 (uint32)s, (uint32)n, src_tbl_inst->cur_size)) { | ||||||
|                             wasm_set_exception(module, |                             wasm_set_exception(module, | ||||||
|                                                "out of bounds table access"); |                                                "out of bounds table access"); | ||||||
|                             goto got_exception; |                             goto got_exception; | ||||||
|  | @ -5907,28 +6058,37 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|                     case WASM_OP_TABLE_GROW: |                     case WASM_OP_TABLE_GROW: | ||||||
|                     { |                     { | ||||||
|                         WASMTableInstance *tbl_inst; |                         WASMTableInstance *tbl_inst; | ||||||
|                         uint32 tbl_idx, n, orig_tbl_sz; |                         uint32 tbl_idx, orig_tbl_sz; | ||||||
|  |                         tbl_elem_idx_t n; | ||||||
|                         table_elem_type_t init_val; |                         table_elem_type_t init_val; | ||||||
| 
 | 
 | ||||||
|                         read_leb_uint32(frame_ip, frame_ip_end, tbl_idx); |                         read_leb_uint32(frame_ip, frame_ip_end, tbl_idx); | ||||||
|                         bh_assert(tbl_idx < module->table_count); |                         bh_assert(tbl_idx < module->table_count); | ||||||
| 
 | 
 | ||||||
|                         tbl_inst = wasm_get_table_inst(module, tbl_idx); |                         tbl_inst = wasm_get_table_inst(module, tbl_idx); | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                         is_table64 = tbl_inst->is_table64; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
|                         orig_tbl_sz = tbl_inst->cur_size; |                         orig_tbl_sz = tbl_inst->cur_size; | ||||||
| 
 | 
 | ||||||
|                         n = POP_I32(); |                         n = POP_TBL_ELEM_IDX(); | ||||||
| #if WASM_ENABLE_GC == 0 | #if WASM_ENABLE_GC == 0 | ||||||
|                         init_val = POP_I32(); |                         init_val = POP_I32(); | ||||||
| #else | #else | ||||||
|                         init_val = POP_REF(); |                         init_val = POP_REF(); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|                         if (!wasm_enlarge_table(module, tbl_idx, n, init_val)) { |                         if ( | ||||||
|                             PUSH_I32(-1); | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                             n > UINT32_MAX || | ||||||
|  | #endif | ||||||
|  |                             !wasm_enlarge_table(module, tbl_idx, (uint32)n, | ||||||
|  |                                                 init_val)) { | ||||||
|  |                             PUSH_TBL_ELEM_IDX(-1); | ||||||
|                         } |                         } | ||||||
|                         else { |                         else { | ||||||
|                             PUSH_I32(orig_tbl_sz); |                             PUSH_TBL_ELEM_IDX(orig_tbl_sz); | ||||||
|                         } |                         } | ||||||
|                         break; |                         break; | ||||||
|                     } |                     } | ||||||
|  | @ -5941,13 +6101,17 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|                         bh_assert(tbl_idx < module->table_count); |                         bh_assert(tbl_idx < module->table_count); | ||||||
| 
 | 
 | ||||||
|                         tbl_inst = wasm_get_table_inst(module, tbl_idx); |                         tbl_inst = wasm_get_table_inst(module, tbl_idx); | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                         is_table64 = tbl_inst->is_table64; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
|                         PUSH_I32(tbl_inst->cur_size); |                         PUSH_TBL_ELEM_IDX(tbl_inst->cur_size); | ||||||
|                         break; |                         break; | ||||||
|                     } |                     } | ||||||
|                     case WASM_OP_TABLE_FILL: |                     case WASM_OP_TABLE_FILL: | ||||||
|                     { |                     { | ||||||
|                         uint32 tbl_idx, n; |                         uint32 tbl_idx; | ||||||
|  |                         tbl_elem_idx_t n, elem_idx; | ||||||
|                         WASMTableInstance *tbl_inst; |                         WASMTableInstance *tbl_inst; | ||||||
|                         table_elem_type_t fill_val; |                         table_elem_type_t fill_val; | ||||||
| 
 | 
 | ||||||
|  | @ -5955,24 +6119,32 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|                         bh_assert(tbl_idx < module->table_count); |                         bh_assert(tbl_idx < module->table_count); | ||||||
| 
 | 
 | ||||||
|                         tbl_inst = wasm_get_table_inst(module, tbl_idx); |                         tbl_inst = wasm_get_table_inst(module, tbl_idx); | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                         is_table64 = tbl_inst->is_table64; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
|                         n = POP_I32(); |                         n = POP_TBL_ELEM_IDX(); | ||||||
| #if WASM_ENABLE_GC == 0 | #if WASM_ENABLE_GC == 0 | ||||||
|                         fill_val = POP_I32(); |                         fill_val = POP_I32(); | ||||||
| #else | #else | ||||||
|                         fill_val = POP_REF(); |                         fill_val = POP_REF(); | ||||||
| #endif | #endif | ||||||
|                         i = POP_I32(); |                         elem_idx = POP_TBL_ELEM_IDX(); | ||||||
| 
 | 
 | ||||||
|                         if (offset_len_out_of_bounds(i, n, |                         if ( | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                             n > UINT32_MAX || elem_idx > UINT32_MAX || | ||||||
|  | #endif | ||||||
|  |                             offset_len_out_of_bounds((uint32)elem_idx, | ||||||
|  |                                                      (uint32)n, | ||||||
|                                                      tbl_inst->cur_size)) { |                                                      tbl_inst->cur_size)) { | ||||||
|                             wasm_set_exception(module, |                             wasm_set_exception(module, | ||||||
|                                                "out of bounds table access"); |                                                "out of bounds table access"); | ||||||
|                             goto got_exception; |                             goto got_exception; | ||||||
|                         } |                         } | ||||||
| 
 | 
 | ||||||
|                         for (; n != 0; i++, n--) { |                         for (; n != 0; elem_idx++, n--) { | ||||||
|                             tbl_inst->elems[i] = fill_val; |                             tbl_inst->elems[elem_idx] = fill_val; | ||||||
|                         } |                         } | ||||||
|                         break; |                         break; | ||||||
|                     } |                     } | ||||||
|  | @ -6555,7 +6727,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|     || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 \ |     || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 \ | ||||||
|     || WASM_ENABLE_BULK_MEMORY != 0 |     || WASM_ENABLE_BULK_MEMORY != 0 | ||||||
|             if (memory) |             if (memory) | ||||||
|                 linear_mem_size = get_linear_mem_size(); |                 linear_mem_size = GET_LINEAR_MEMORY_SIZE(memory); | ||||||
| #endif | #endif | ||||||
|             if (wasm_copy_exception(module, NULL)) { |             if (wasm_copy_exception(module, NULL)) { | ||||||
| #if WASM_ENABLE_EXCE_HANDLING != 0 | #if WASM_ENABLE_EXCE_HANDLING != 0 | ||||||
|  |  | ||||||
|  | @ -37,11 +37,28 @@ typedef float64 CellType_F64; | ||||||
| #define get_linear_mem_size() GET_LINEAR_MEMORY_SIZE(memory) | #define get_linear_mem_size() GET_LINEAR_MEMORY_SIZE(memory) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  | #define app_addr_in_shared_heap(app_addr, bytes)        \ | ||||||
|  |     (shared_heap && (app_addr) >= shared_heap_start_off \ | ||||||
|  |      && (app_addr) <= shared_heap_end_off - bytes + 1) | ||||||
|  | 
 | ||||||
|  | #define shared_heap_addr_app_to_native(app_addr, native_addr) \ | ||||||
|  |     native_addr = shared_heap_base_addr + ((app_addr)-shared_heap_start_off) | ||||||
|  | 
 | ||||||
|  | #define CHECK_SHARED_HEAP_OVERFLOW(app_addr, bytes, native_addr) \ | ||||||
|  |     if (app_addr_in_shared_heap(app_addr, bytes))                \ | ||||||
|  |         shared_heap_addr_app_to_native(app_addr, native_addr);   \ | ||||||
|  |     else | ||||||
|  | #else | ||||||
|  | #define CHECK_SHARED_HEAP_OVERFLOW(app_addr, bytes, native_addr) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ | #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ | ||||||
|     || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 |     || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 | ||||||
| #define CHECK_MEMORY_OVERFLOW(bytes)                                           \ | #define CHECK_MEMORY_OVERFLOW(bytes)                                           \ | ||||||
|     do {                                                                       \ |     do {                                                                       \ | ||||||
|         uint64 offset1 = (uint64)offset + (uint64)addr;                        \ |         uint64 offset1 = (uint64)offset + (uint64)addr;                        \ | ||||||
|  |         CHECK_SHARED_HEAP_OVERFLOW(offset1, bytes, maddr)                      \ | ||||||
|         if (disable_bounds_checks || offset1 + bytes <= get_linear_mem_size()) \ |         if (disable_bounds_checks || offset1 + bytes <= get_linear_mem_size()) \ | ||||||
|             /* If offset1 is in valid range, maddr must also                   \
 |             /* If offset1 is in valid range, maddr must also                   \
 | ||||||
|                 be in valid range, no need to check it again. */               \ |                 be in valid range, no need to check it again. */               \ | ||||||
|  | @ -53,6 +70,7 @@ typedef float64 CellType_F64; | ||||||
| #define CHECK_BULK_MEMORY_OVERFLOW(start, bytes, maddr)                        \ | #define CHECK_BULK_MEMORY_OVERFLOW(start, bytes, maddr)                        \ | ||||||
|     do {                                                                       \ |     do {                                                                       \ | ||||||
|         uint64 offset1 = (uint32)(start);                                      \ |         uint64 offset1 = (uint32)(start);                                      \ | ||||||
|  |         CHECK_SHARED_HEAP_OVERFLOW(offset1, bytes, maddr)                      \ | ||||||
|         if (disable_bounds_checks || offset1 + bytes <= get_linear_mem_size()) \ |         if (disable_bounds_checks || offset1 + bytes <= get_linear_mem_size()) \ | ||||||
|             /* App heap space is not valid space for                           \
 |             /* App heap space is not valid space for                           \
 | ||||||
|                bulk memory operation */                                        \ |                bulk memory operation */                                        \ | ||||||
|  | @ -64,12 +82,15 @@ typedef float64 CellType_F64; | ||||||
| #define CHECK_MEMORY_OVERFLOW(bytes)                      \ | #define CHECK_MEMORY_OVERFLOW(bytes)                      \ | ||||||
|     do {                                                  \ |     do {                                                  \ | ||||||
|         uint64 offset1 = (uint64)offset + (uint64)addr;   \ |         uint64 offset1 = (uint64)offset + (uint64)addr;   \ | ||||||
|  |         CHECK_SHARED_HEAP_OVERFLOW(offset1, bytes, maddr) \ | ||||||
|         maddr = memory->memory_data + offset1;            \ |         maddr = memory->memory_data + offset1;            \ | ||||||
|     } while (0) |     } while (0) | ||||||
| 
 | 
 | ||||||
| #define CHECK_BULK_MEMORY_OVERFLOW(start, bytes, maddr)   \ | #define CHECK_BULK_MEMORY_OVERFLOW(start, bytes, maddr)   \ | ||||||
|     do {                                                  \ |     do {                                                  \ | ||||||
|         maddr = memory->memory_data + (uint32)(start);  \ |         uint64 offset1 = (uint32)(start);                 \ | ||||||
|  |         CHECK_SHARED_HEAP_OVERFLOW(offset1, bytes, maddr) \ | ||||||
|  |         maddr = memory->memory_data + offset1;            \ | ||||||
|     } while (0) |     } while (0) | ||||||
| #endif /* !defined(OS_ENABLE_HW_BOUND_CHECK) \ | #endif /* !defined(OS_ENABLE_HW_BOUND_CHECK) \ | ||||||
|           || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 */ |           || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 */ | ||||||
|  | @ -1516,6 +1537,24 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
| #if WASM_ENABLE_TAIL_CALL != 0 || WASM_ENABLE_GC != 0 | #if WASM_ENABLE_TAIL_CALL != 0 || WASM_ENABLE_GC != 0 | ||||||
|     bool is_return_call = false; |     bool is_return_call = false; | ||||||
| #endif | #endif | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     WASMSharedHeap *shared_heap = module->e ? module->e->shared_heap : NULL; | ||||||
|  |     uint8 *shared_heap_base_addr = shared_heap ? shared_heap->base_addr : NULL; | ||||||
|  |     /*
 | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |     uint64 shared_heap_start_off = | ||||||
|  |         shared_heap ? (is_memory64 ? shared_heap->start_off_mem64 | ||||||
|  |                                    : shared_heap->start_off_mem32) | ||||||
|  |                     : 0; | ||||||
|  |     uint64 shared_heap_end_off = | ||||||
|  |         shared_heap ? (is_memory64 ? UINT64_MAX : UINT32_MAX) : 0; | ||||||
|  | #else | ||||||
|  |     */ /* TODO: uncomment the code when memory64 is enabled for fast-interp */ | ||||||
|  |     uint64 shared_heap_start_off = | ||||||
|  |         shared_heap ? shared_heap->start_off_mem32 : 0; | ||||||
|  |     uint64 shared_heap_end_off = shared_heap ? UINT32_MAX : 0; | ||||||
|  | /* #endif */ | ||||||
|  | #endif /* end of WASM_ENABLE_SHARED_HEAP != 0 */ | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_LABELS_AS_VALUES != 0 | #if WASM_ENABLE_LABELS_AS_VALUES != 0 | ||||||
| #define HANDLE_OPCODE(op) &&HANDLE_##op | #define HANDLE_OPCODE(op) &&HANDLE_##op | ||||||
|  | @ -2831,8 +2870,15 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|                         str_obj = (WASMString)wasm_stringref_obj_get_value( |                         str_obj = (WASMString)wasm_stringref_obj_get_value( | ||||||
|                             stringref_obj); |                             stringref_obj); | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |                         if (app_addr_in_shared_heap((uint64)addr, 1)) | ||||||
|  |                             shared_heap_addr_app_to_native((uint64)addr, maddr); | ||||||
|  |                         else | ||||||
|  | #endif | ||||||
|  |                         { | ||||||
|                             memory_inst = module->memories[mem_idx]; |                             memory_inst = module->memories[mem_idx]; | ||||||
|                             maddr = memory_inst->memory_data + addr; |                             maddr = memory_inst->memory_data + addr; | ||||||
|  |                         } | ||||||
| 
 | 
 | ||||||
|                         if (opcode == WASM_OP_STRING_ENCODE_WTF16) { |                         if (opcode == WASM_OP_STRING_ENCODE_WTF16) { | ||||||
|                             flag = WTF16; |                             flag = WTF16; | ||||||
|  | @ -2999,8 +3045,15 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|                         addr = POP_I32(); |                         addr = POP_I32(); | ||||||
|                         stringview_wtf8_obj = POP_REF(); |                         stringview_wtf8_obj = POP_REF(); | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |                         if (app_addr_in_shared_heap((uint64)addr, 1)) | ||||||
|  |                             shared_heap_addr_app_to_native((uint64)addr, maddr); | ||||||
|  |                         else | ||||||
|  | #endif | ||||||
|  |                         { | ||||||
|                             memory_inst = module->memories[mem_idx]; |                             memory_inst = module->memories[mem_idx]; | ||||||
|                             maddr = memory_inst->memory_data + addr; |                             maddr = memory_inst->memory_data + addr; | ||||||
|  |                         } | ||||||
| 
 | 
 | ||||||
|                         bytes_written = wasm_string_encode( |                         bytes_written = wasm_string_encode( | ||||||
|                             (WASMString)wasm_stringview_wtf8_obj_get_value( |                             (WASMString)wasm_stringview_wtf8_obj_get_value( | ||||||
|  | @ -4985,9 +5038,18 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
| #ifndef OS_ENABLE_HW_BOUND_CHECK | #ifndef OS_ENABLE_HW_BOUND_CHECK | ||||||
|                         CHECK_BULK_MEMORY_OVERFLOW(addr, bytes, maddr); |                         CHECK_BULK_MEMORY_OVERFLOW(addr, bytes, maddr); | ||||||
| #else | #else | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |                         if (app_addr_in_shared_heap((uint64)(uint32)addr, | ||||||
|  |                                                     bytes)) | ||||||
|  |                             shared_heap_addr_app_to_native((uint64)(uint32)addr, | ||||||
|  |                                                            maddr); | ||||||
|  |                         else | ||||||
|  | #endif | ||||||
|  |                         { | ||||||
|                             if ((uint64)(uint32)addr + bytes > linear_mem_size) |                             if ((uint64)(uint32)addr + bytes > linear_mem_size) | ||||||
|                                 goto out_of_bounds; |                                 goto out_of_bounds; | ||||||
|                             maddr = memory->memory_data + (uint32)addr; |                             maddr = memory->memory_data + (uint32)addr; | ||||||
|  |                         } | ||||||
| #endif | #endif | ||||||
|                         if (bh_bitmap_get_bit(module->e->common.data_dropped, |                         if (bh_bitmap_get_bit(module->e->common.data_dropped, | ||||||
|                                               segment)) { |                                               segment)) { | ||||||
|  | @ -5020,6 +5082,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|                     { |                     { | ||||||
|                         uint32 dst, src, len; |                         uint32 dst, src, len; | ||||||
|                         uint8 *mdst, *msrc; |                         uint8 *mdst, *msrc; | ||||||
|  |                         uint64 dlen; | ||||||
| 
 | 
 | ||||||
|                         len = POP_I32(); |                         len = POP_I32(); | ||||||
|                         src = POP_I32(); |                         src = POP_I32(); | ||||||
|  | @ -5029,22 +5092,43 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|                         linear_mem_size = get_linear_mem_size(); |                         linear_mem_size = get_linear_mem_size(); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  |                         dlen = linear_mem_size - dst; | ||||||
|  | 
 | ||||||
| #ifndef OS_ENABLE_HW_BOUND_CHECK | #ifndef OS_ENABLE_HW_BOUND_CHECK | ||||||
|                         CHECK_BULK_MEMORY_OVERFLOW(src, len, msrc); |                         CHECK_BULK_MEMORY_OVERFLOW(src, len, msrc); | ||||||
|                         CHECK_BULK_MEMORY_OVERFLOW(dst, len, mdst); |                         CHECK_BULK_MEMORY_OVERFLOW(dst, len, mdst); | ||||||
| #else | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |                         if (app_addr_in_shared_heap((uint64)dst, len)) | ||||||
|  |                             dlen = shared_heap_end_off - dst + 1; | ||||||
|  | #endif | ||||||
|  | #else /* else of OS_ENABLE_HW_BOUND_CHECK */ | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |                         if (app_addr_in_shared_heap((uint64)src, len)) | ||||||
|  |                             shared_heap_addr_app_to_native((uint64)src, msrc); | ||||||
|  |                         else | ||||||
|  | #endif | ||||||
|  |                         { | ||||||
|                             if ((uint64)(uint32)src + len > linear_mem_size) |                             if ((uint64)(uint32)src + len > linear_mem_size) | ||||||
|                                 goto out_of_bounds; |                                 goto out_of_bounds; | ||||||
|                             msrc = memory->memory_data + (uint32)src; |                             msrc = memory->memory_data + (uint32)src; | ||||||
|  |                         } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |                         if (app_addr_in_shared_heap((uint64)dst, len)) { | ||||||
|  |                             shared_heap_addr_app_to_native((uint64)dst, mdst); | ||||||
|  |                             dlen = shared_heap_end_off - dst + 1; | ||||||
|  |                         } | ||||||
|  |                         else | ||||||
|  | #endif | ||||||
|  |                         { | ||||||
|                             if ((uint64)(uint32)dst + len > linear_mem_size) |                             if ((uint64)(uint32)dst + len > linear_mem_size) | ||||||
|                                 goto out_of_bounds; |                                 goto out_of_bounds; | ||||||
|                             mdst = memory->memory_data + (uint32)dst; |                             mdst = memory->memory_data + (uint32)dst; | ||||||
| #endif |                         } | ||||||
|  | #endif /* end of OS_ENABLE_HW_BOUND_CHECK */ | ||||||
| 
 | 
 | ||||||
|                         /* allowing the destination and source to overlap */ |                         /* allowing the destination and source to overlap */ | ||||||
|                         bh_memmove_s(mdst, (uint32)(linear_mem_size - dst), |                         bh_memmove_s(mdst, (uint32)dlen, msrc, len); | ||||||
|                                      msrc, len); |  | ||||||
|                         break; |                         break; | ||||||
|                     } |                     } | ||||||
|                     case WASM_OP_MEMORY_FILL: |                     case WASM_OP_MEMORY_FILL: | ||||||
|  | @ -5063,9 +5147,17 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
| #ifndef OS_ENABLE_HW_BOUND_CHECK | #ifndef OS_ENABLE_HW_BOUND_CHECK | ||||||
|                         CHECK_BULK_MEMORY_OVERFLOW(dst, len, mdst); |                         CHECK_BULK_MEMORY_OVERFLOW(dst, len, mdst); | ||||||
| #else | #else | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |                         if (app_addr_in_shared_heap((uint64)(uint32)dst, len)) | ||||||
|  |                             shared_heap_addr_app_to_native((uint64)(uint32)dst, | ||||||
|  |                                                            mdst); | ||||||
|  |                         else | ||||||
|  | #endif | ||||||
|  |                         { | ||||||
|                             if ((uint64)(uint32)dst + len > linear_mem_size) |                             if ((uint64)(uint32)dst + len > linear_mem_size) | ||||||
|                                 goto out_of_bounds; |                                 goto out_of_bounds; | ||||||
|                             mdst = memory->memory_data + (uint32)dst; |                             mdst = memory->memory_data + (uint32)dst; | ||||||
|  |                         } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|                         memset(mdst, fill_val, len); |                         memset(mdst, fill_val, len); | ||||||
|  | @ -5902,7 +5994,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, | ||||||
|     || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 \ |     || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 \ | ||||||
|     || WASM_ENABLE_BULK_MEMORY != 0 |     || WASM_ENABLE_BULK_MEMORY != 0 | ||||||
|             if (memory) |             if (memory) | ||||||
|                 linear_mem_size = get_linear_mem_size(); |                 linear_mem_size = GET_LINEAR_MEMORY_SIZE(memory); | ||||||
| #endif | #endif | ||||||
|             if (wasm_copy_exception(module, NULL)) |             if (wasm_copy_exception(module, NULL)) | ||||||
|                 goto got_exception; |                 goto got_exception; | ||||||
|  |  | ||||||
|  | @ -4,8 +4,7 @@ | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include "wasm_loader.h" | #include "wasm_loader.h" | ||||||
| #include "bh_common.h" | #include "bh_platform.h" | ||||||
| #include "bh_log.h" |  | ||||||
| #include "wasm.h" | #include "wasm.h" | ||||||
| #include "wasm_opcode.h" | #include "wasm_opcode.h" | ||||||
| #include "wasm_runtime.h" | #include "wasm_runtime.h" | ||||||
|  | @ -54,6 +53,18 @@ has_module_memory64(WASMModule *module) | ||||||
| 
 | 
 | ||||||
|     return false; |     return false; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | static bool | ||||||
|  | is_table_64bit(WASMModule *module, uint32 table_idx) | ||||||
|  | { | ||||||
|  |     if (table_idx < module->import_table_count) | ||||||
|  |         return !!(module->import_tables[table_idx].u.table.table_type.flags | ||||||
|  |                   & TABLE64_FLAG); | ||||||
|  |     else | ||||||
|  |         return !!(module->tables[table_idx].table_type.flags & TABLE64_FLAG); | ||||||
|  | 
 | ||||||
|  |     return false; | ||||||
|  | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
|  | @ -2204,10 +2215,14 @@ fail: | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| adjust_table_max_size(uint32 init_size, uint32 max_size_flag, uint32 *max_size) | adjust_table_max_size(bool is_table64, uint32 init_size, uint32 max_size_flag, | ||||||
|  |                       uint32 *max_size) | ||||||
| { | { | ||||||
|     uint32 default_max_size; |     uint32 default_max_size; | ||||||
| 
 | 
 | ||||||
|  |     /* TODO: current still use UINT32_MAX as upper limit for table size to keep
 | ||||||
|  |      * ABI unchanged */ | ||||||
|  |     (void)is_table64; | ||||||
|     if (UINT32_MAX / 2 > init_size) |     if (UINT32_MAX / 2 > init_size) | ||||||
|         default_max_size = init_size * 2; |         default_max_size = init_size * 2; | ||||||
|     else |     else | ||||||
|  | @ -2249,60 +2264,6 @@ wasm_loader_find_export(const WASMModule *module, const char *module_name, | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_MULTI_MODULE != 0 | #if WASM_ENABLE_MULTI_MODULE != 0 | ||||||
| static WASMFunction * |  | ||||||
| wasm_loader_resolve_function(const char *module_name, const char *function_name, |  | ||||||
|                              const WASMFuncType *expected_function_type, |  | ||||||
|                              char *error_buf, uint32 error_buf_size) |  | ||||||
| { |  | ||||||
|     WASMModuleCommon *module_reg; |  | ||||||
|     WASMFunction *function = NULL; |  | ||||||
|     WASMExport *export = NULL; |  | ||||||
|     WASMModule *module = NULL; |  | ||||||
|     WASMFuncType *target_function_type = NULL; |  | ||||||
| 
 |  | ||||||
|     module_reg = wasm_runtime_find_module_registered(module_name); |  | ||||||
|     if (!module_reg || module_reg->module_type != Wasm_Module_Bytecode) { |  | ||||||
|         LOG_DEBUG("can not find a module named %s for function %s", module_name, |  | ||||||
|                   function_name); |  | ||||||
|         set_error_buf(error_buf, error_buf_size, "unknown import"); |  | ||||||
|         return NULL; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     module = (WASMModule *)module_reg; |  | ||||||
|     export = |  | ||||||
|         wasm_loader_find_export(module, module_name, function_name, |  | ||||||
|                                 EXPORT_KIND_FUNC, error_buf, error_buf_size); |  | ||||||
|     if (!export) { |  | ||||||
|         return NULL; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /* resolve function type and function */ |  | ||||||
|     if (export->index < module->import_function_count) { |  | ||||||
|         target_function_type = |  | ||||||
|             module->import_functions[export->index].u.function.func_type; |  | ||||||
|         function = module->import_functions[export->index] |  | ||||||
|                        .u.function.import_func_linked; |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         target_function_type = |  | ||||||
|             module->functions[export->index - module->import_function_count] |  | ||||||
|                 ->func_type; |  | ||||||
|         function = |  | ||||||
|             module->functions[export->index - module->import_function_count]; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /* check function type */ |  | ||||||
|     if (!wasm_type_equal((WASMType *)expected_function_type, |  | ||||||
|                          (WASMType *)target_function_type, module->types, |  | ||||||
|                          module->type_count)) { |  | ||||||
|         LOG_DEBUG("%s.%s failed the type check", module_name, function_name); |  | ||||||
|         set_error_buf(error_buf, error_buf_size, "incompatible import type"); |  | ||||||
|         return NULL; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return function; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static WASMTable * | static WASMTable * | ||||||
| wasm_loader_resolve_table(const char *module_name, const char *table_name, | wasm_loader_resolve_table(const char *module_name, const char *table_name, | ||||||
|                           uint32 init_size, uint32 max_size, char *error_buf, |                           uint32 init_size, uint32 max_size, char *error_buf, | ||||||
|  | @ -2497,21 +2458,11 @@ static bool | ||||||
| load_function_import(const uint8 **p_buf, const uint8 *buf_end, | load_function_import(const uint8 **p_buf, const uint8 *buf_end, | ||||||
|                      const WASMModule *parent_module, |                      const WASMModule *parent_module, | ||||||
|                      const char *sub_module_name, const char *function_name, |                      const char *sub_module_name, const char *function_name, | ||||||
|                      WASMFunctionImport *function, char *error_buf, |                      WASMFunctionImport *function, bool no_resolve, | ||||||
|                      uint32 error_buf_size) |                      char *error_buf, uint32 error_buf_size) | ||||||
| { | { | ||||||
|     const uint8 *p = *p_buf, *p_end = buf_end; |     const uint8 *p = *p_buf, *p_end = buf_end; | ||||||
|     uint32 declare_type_index = 0; |     uint32 declare_type_index = 0; | ||||||
|     WASMFuncType *declare_func_type = NULL; |  | ||||||
|     WASMFunction *linked_func = NULL; |  | ||||||
| #if WASM_ENABLE_MULTI_MODULE != 0 |  | ||||||
|     WASMModule *sub_module = NULL; |  | ||||||
|     bool is_built_in_module = false; |  | ||||||
| #endif |  | ||||||
|     const char *linked_signature = NULL; |  | ||||||
|     void *linked_attachment = NULL; |  | ||||||
|     bool linked_call_conv_raw = false; |  | ||||||
|     bool is_native_symbol = false; |  | ||||||
| 
 | 
 | ||||||
|     read_leb_uint32(p, p_end, declare_type_index); |     read_leb_uint32(p, p_end, declare_type_index); | ||||||
|     *p_buf = p; |     *p_buf = p; | ||||||
|  | @ -2530,43 +2481,19 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, | ||||||
|         parent_module->types, parent_module->type_count, declare_type_index); |         parent_module->types, parent_module->type_count, declare_type_index); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|     declare_func_type = |     function->func_type = | ||||||
|         (WASMFuncType *)parent_module->types[declare_type_index]; |         (WASMFuncType *)parent_module->types[declare_type_index]; | ||||||
| 
 | 
 | ||||||
|     /* lookup registered native symbols first */ |  | ||||||
|     linked_func = wasm_native_resolve_symbol( |  | ||||||
|         sub_module_name, function_name, declare_func_type, &linked_signature, |  | ||||||
|         &linked_attachment, &linked_call_conv_raw); |  | ||||||
|     if (linked_func) { |  | ||||||
|         is_native_symbol = true; |  | ||||||
|     } |  | ||||||
| #if WASM_ENABLE_MULTI_MODULE != 0 |  | ||||||
|     else { |  | ||||||
|         if (!(is_built_in_module = |  | ||||||
|                   wasm_runtime_is_built_in_module(sub_module_name))) { |  | ||||||
|             sub_module = (WASMModule *)wasm_runtime_load_depended_module( |  | ||||||
|                 (WASMModuleCommon *)parent_module, sub_module_name, error_buf, |  | ||||||
|                 error_buf_size); |  | ||||||
|         } |  | ||||||
|         if (is_built_in_module || sub_module) |  | ||||||
|             linked_func = wasm_loader_resolve_function( |  | ||||||
|                 sub_module_name, function_name, declare_func_type, error_buf, |  | ||||||
|                 error_buf_size); |  | ||||||
|     } |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
|     function->module_name = (char *)sub_module_name; |     function->module_name = (char *)sub_module_name; | ||||||
|     function->field_name = (char *)function_name; |     function->field_name = (char *)function_name; | ||||||
|     function->func_type = declare_func_type; |     function->attachment = NULL; | ||||||
|     /* func_ptr_linked is for native registered symbol */ |     function->signature = NULL; | ||||||
|     function->func_ptr_linked = is_native_symbol ? linked_func : NULL; |     function->call_conv_raw = false; | ||||||
|     function->signature = linked_signature; | 
 | ||||||
|     function->attachment = linked_attachment; |     /* lookup registered native symbols first */ | ||||||
|     function->call_conv_raw = linked_call_conv_raw; |     if (!no_resolve) { | ||||||
| #if WASM_ENABLE_MULTI_MODULE != 0 |         wasm_resolve_import_func(parent_module, function); | ||||||
|     function->import_module = is_native_symbol ? NULL : sub_module; |     } | ||||||
|     function->import_func_linked = is_native_symbol ? NULL : linked_func; |  | ||||||
| #endif |  | ||||||
|     return true; |     return true; | ||||||
| fail: | fail: | ||||||
|     return false; |     return false; | ||||||
|  | @ -2590,9 +2517,9 @@ load_table_import(const uint8 **p_buf, const uint8 *buf_end, | ||||||
|                   const char *table_name, WASMTableImport *table, |                   const char *table_name, WASMTableImport *table, | ||||||
|                   char *error_buf, uint32 error_buf_size) |                   char *error_buf, uint32 error_buf_size) | ||||||
| { | { | ||||||
|     const uint8 *p = *p_buf, *p_end = buf_end; |     const uint8 *p = *p_buf, *p_end = buf_end, *p_org; | ||||||
|     uint32 declare_elem_type = 0, declare_max_size_flag = 0, |     uint32 declare_elem_type = 0, table_flag = 0, declare_init_size = 0, | ||||||
|            declare_init_size = 0, declare_max_size = 0; |            declare_max_size = 0; | ||||||
| #if WASM_ENABLE_MULTI_MODULE != 0 | #if WASM_ENABLE_MULTI_MODULE != 0 | ||||||
|     WASMModule *sub_module = NULL; |     WASMModule *sub_module = NULL; | ||||||
|     WASMTable *linked_table = NULL; |     WASMTable *linked_table = NULL; | ||||||
|  | @ -2601,6 +2528,7 @@ load_table_import(const uint8 **p_buf, const uint8 *buf_end, | ||||||
|     WASMRefType ref_type; |     WASMRefType ref_type; | ||||||
|     bool need_ref_type_map; |     bool need_ref_type_map; | ||||||
| #endif | #endif | ||||||
|  |     bool is_table64 = false; | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_GC == 0 | #if WASM_ENABLE_GC == 0 | ||||||
|     CHECK_BUF(p, p_end, 1); |     CHECK_BUF(p, p_end, 1); | ||||||
|  | @ -2639,23 +2567,29 @@ load_table_import(const uint8 **p_buf, const uint8 *buf_end, | ||||||
| #endif | #endif | ||||||
| #endif /* end of WASM_ENABLE_GC == 0 */ | #endif /* end of WASM_ENABLE_GC == 0 */ | ||||||
| 
 | 
 | ||||||
|     read_leb_uint32(p, p_end, declare_max_size_flag); |     p_org = p; | ||||||
|     if (declare_max_size_flag > 1) { |     read_leb_uint32(p, p_end, table_flag); | ||||||
|         set_error_buf(error_buf, error_buf_size, "integer too large"); |     is_table64 = table_flag & TABLE64_FLAG; | ||||||
|  |     if (p - p_org > 1) { | ||||||
|  |         LOG_VERBOSE("integer representation too long(import table)"); | ||||||
|  |         set_error_buf(error_buf, error_buf_size, "invalid limits flags"); | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (!wasm_table_check_flags(table_flag, error_buf, error_buf_size, false)) { | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     read_leb_uint32(p, p_end, declare_init_size); |     read_leb_uint32(p, p_end, declare_init_size); | ||||||
| 
 |     if (table_flag & MAX_TABLE_SIZE_FLAG) { | ||||||
|     if (declare_max_size_flag) { |  | ||||||
|         read_leb_uint32(p, p_end, declare_max_size); |         read_leb_uint32(p, p_end, declare_max_size); | ||||||
|         if (!check_table_max_size(declare_init_size, declare_max_size, |         if (!check_table_max_size(declare_init_size, declare_max_size, | ||||||
|                                   error_buf, error_buf_size)) |                                   error_buf, error_buf_size)) | ||||||
|             return false; |             return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     adjust_table_max_size(declare_init_size, declare_max_size_flag, |     adjust_table_max_size(is_table64, declare_init_size, | ||||||
|                           &declare_max_size); |                           table_flag & MAX_TABLE_SIZE_FLAG, &declare_max_size); | ||||||
| 
 | 
 | ||||||
|     *p_buf = p; |     *p_buf = p; | ||||||
| 
 | 
 | ||||||
|  | @ -2673,7 +2607,7 @@ load_table_import(const uint8 **p_buf, const uint8 *buf_end, | ||||||
|                 declare_elem_type = linked_table->table_type.elem_type; |                 declare_elem_type = linked_table->table_type.elem_type; | ||||||
|                 declare_init_size = linked_table->table_type.init_size; |                 declare_init_size = linked_table->table_type.init_size; | ||||||
|                 declare_max_size = linked_table->table_type.max_size; |                 declare_max_size = linked_table->table_type.max_size; | ||||||
|                 declare_max_size_flag = linked_table->table_type.flags; |                 table_flag = linked_table->table_type.flags; | ||||||
|                 table->import_table_linked = linked_table; |                 table->import_table_linked = linked_table; | ||||||
|                 table->import_module = sub_module; |                 table->import_module = sub_module; | ||||||
|             } |             } | ||||||
|  | @ -2682,12 +2616,17 @@ load_table_import(const uint8 **p_buf, const uint8 *buf_end, | ||||||
| #endif /* WASM_ENABLE_MULTI_MODULE != 0 */ | #endif /* WASM_ENABLE_MULTI_MODULE != 0 */ | ||||||
| 
 | 
 | ||||||
|     /* (table (export "table") 10 20 funcref) */ |     /* (table (export "table") 10 20 funcref) */ | ||||||
|  |     /* (table (export "table64") 10 20 funcref) */ | ||||||
|     /* we need this section working in wamrc */ |     /* we need this section working in wamrc */ | ||||||
|     if (!strcmp("spectest", sub_module_name)) { |     if (!strcmp("spectest", sub_module_name)) { | ||||||
|         const uint32 spectest_table_init_size = 10; |         const uint32 spectest_table_init_size = 10; | ||||||
|         const uint32 spectest_table_max_size = 20; |         const uint32 spectest_table_max_size = 20; | ||||||
| 
 | 
 | ||||||
|         if (strcmp("table", table_name)) { |         if (strcmp("table", table_name) | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |             && strcmp("table64", table_name) | ||||||
|  | #endif | ||||||
|  |         ) { | ||||||
|             set_error_buf(error_buf, error_buf_size, |             set_error_buf(error_buf, error_buf_size, | ||||||
|                           "incompatible import type or unknown import"); |                           "incompatible import type or unknown import"); | ||||||
|             return false; |             return false; | ||||||
|  | @ -2707,7 +2646,7 @@ load_table_import(const uint8 **p_buf, const uint8 *buf_end, | ||||||
|     /* now we believe all declaration are ok */ |     /* now we believe all declaration are ok */ | ||||||
|     table->table_type.elem_type = declare_elem_type; |     table->table_type.elem_type = declare_elem_type; | ||||||
|     table->table_type.init_size = declare_init_size; |     table->table_type.init_size = declare_init_size; | ||||||
|     table->table_type.flags = declare_max_size_flag; |     table->table_type.flags = table_flag; | ||||||
|     table->table_type.max_size = declare_max_size; |     table->table_type.max_size = declare_max_size; | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_WAMR_COMPILER != 0 | #if WASM_ENABLE_WAMR_COMPILER != 0 | ||||||
|  | @ -2800,7 +2739,7 @@ load_memory_import(const uint8 **p_buf, const uint8 *buf_end, | ||||||
|     read_leb_uint32(p, p_end, mem_flag); |     read_leb_uint32(p, p_end, mem_flag); | ||||||
|     is_memory64 = mem_flag & MEMORY64_FLAG; |     is_memory64 = mem_flag & MEMORY64_FLAG; | ||||||
|     if (p - p_org > 1) { |     if (p - p_org > 1) { | ||||||
|         LOG_VERBOSE("integer representation too long"); |         LOG_VERBOSE("integer representation too long(import memory)"); | ||||||
|         set_error_buf(error_buf, error_buf_size, "invalid limits flags"); |         set_error_buf(error_buf, error_buf_size, "invalid limits flags"); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  | @ -3115,6 +3054,7 @@ load_table(const uint8 **p_buf, const uint8 *buf_end, WASMModule *module, | ||||||
|     WASMRefType ref_type; |     WASMRefType ref_type; | ||||||
|     bool need_ref_type_map; |     bool need_ref_type_map; | ||||||
| #endif | #endif | ||||||
|  |     bool is_table64 = false; | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_GC == 0 | #if WASM_ENABLE_GC == 0 | ||||||
|     CHECK_BUF(p, p_end, 1); |     CHECK_BUF(p, p_end, 1); | ||||||
|  | @ -3152,34 +3092,20 @@ load_table(const uint8 **p_buf, const uint8 *buf_end, WASMModule *module, | ||||||
| 
 | 
 | ||||||
|     p_org = p; |     p_org = p; | ||||||
|     read_leb_uint32(p, p_end, table->table_type.flags); |     read_leb_uint32(p, p_end, table->table_type.flags); | ||||||
| #if WASM_ENABLE_SHARED_MEMORY == 0 |     is_table64 = table->table_type.flags & TABLE64_FLAG; | ||||||
|     if (p - p_org > 1) { |  | ||||||
|         set_error_buf(error_buf, error_buf_size, |  | ||||||
|                       "integer representation too long"); |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
|     if (table->table_type.flags > 1) { |  | ||||||
|         set_error_buf(error_buf, error_buf_size, "integer too large"); |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| #else |  | ||||||
|     if (p - p_org > 1) { |     if (p - p_org > 1) { | ||||||
|  |         LOG_VERBOSE("integer representation too long(table)"); | ||||||
|         set_error_buf(error_buf, error_buf_size, "invalid limits flags"); |         set_error_buf(error_buf, error_buf_size, "invalid limits flags"); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|     if (table->table_type.flags == 2) { | 
 | ||||||
|         set_error_buf(error_buf, error_buf_size, "tables cannot be shared"); |     if (!wasm_table_check_flags(table->table_type.flags, error_buf, | ||||||
|  |                                 error_buf_size, false)) { | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|     if (table->table_type.flags > 1) { |  | ||||||
|         set_error_buf(error_buf, error_buf_size, "invalid limits flags"); |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| #endif |  | ||||||
| 
 | 
 | ||||||
|     read_leb_uint32(p, p_end, table->table_type.init_size); |     read_leb_uint32(p, p_end, table->table_type.init_size); | ||||||
| 
 |     if (table->table_type.flags & MAX_TABLE_SIZE_FLAG) { | ||||||
|     if (table->table_type.flags) { |  | ||||||
|         read_leb_uint32(p, p_end, table->table_type.max_size); |         read_leb_uint32(p, p_end, table->table_type.max_size); | ||||||
|         if (!check_table_max_size(table->table_type.init_size, |         if (!check_table_max_size(table->table_type.init_size, | ||||||
|                                   table->table_type.max_size, error_buf, |                                   table->table_type.max_size, error_buf, | ||||||
|  | @ -3187,7 +3113,8 @@ load_table(const uint8 **p_buf, const uint8 *buf_end, WASMModule *module, | ||||||
|             return false; |             return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     adjust_table_max_size(table->table_type.init_size, table->table_type.flags, |     adjust_table_max_size(is_table64, table->table_type.init_size, | ||||||
|  |                           table->table_type.flags & MAX_TABLE_SIZE_FLAG, | ||||||
|                           &table->table_type.max_size); |                           &table->table_type.max_size); | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_WAMR_COMPILER != 0 | #if WASM_ENABLE_WAMR_COMPILER != 0 | ||||||
|  | @ -3219,7 +3146,7 @@ load_memory(const uint8 **p_buf, const uint8 *buf_end, WASMMemory *memory, | ||||||
|     read_leb_uint32(p, p_end, memory->flags); |     read_leb_uint32(p, p_end, memory->flags); | ||||||
|     is_memory64 = memory->flags & MEMORY64_FLAG; |     is_memory64 = memory->flags & MEMORY64_FLAG; | ||||||
|     if (p - p_org > 1) { |     if (p - p_org > 1) { | ||||||
|         LOG_VERBOSE("integer representation too long"); |         LOG_VERBOSE("integer representation too long(memory)"); | ||||||
|         set_error_buf(error_buf, error_buf_size, "invalid limits flags"); |         set_error_buf(error_buf, error_buf_size, "invalid limits flags"); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  | @ -3259,10 +3186,16 @@ fail: | ||||||
|     return false; |     return false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int | ||||||
|  | cmp_export_name(const void *a, const void *b) | ||||||
|  | { | ||||||
|  |     return strcmp(*(char **)a, *(char **)b); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static bool | static bool | ||||||
| load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module, | load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module, | ||||||
|                     bool is_load_from_file_buf, char *error_buf, |                     bool is_load_from_file_buf, bool no_resolve, | ||||||
|                     uint32 error_buf_size) |                     char *error_buf, uint32 error_buf_size) | ||||||
| { | { | ||||||
|     const uint8 *p = buf, *p_end = buf_end, *p_old; |     const uint8 *p = buf, *p_end = buf_end, *p_old; | ||||||
|     uint32 import_count, name_len, type_index, i, u32, flags; |     uint32 import_count, name_len, type_index, i, u32, flags; | ||||||
|  | @ -3445,9 +3378,10 @@ load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module, | ||||||
|                 case IMPORT_KIND_FUNC: /* import function */ |                 case IMPORT_KIND_FUNC: /* import function */ | ||||||
|                     bh_assert(import_functions); |                     bh_assert(import_functions); | ||||||
|                     import = import_functions++; |                     import = import_functions++; | ||||||
|                     if (!load_function_import( |                     if (!load_function_import(&p, p_end, module, | ||||||
|                             &p, p_end, module, sub_module_name, field_name, |                                               sub_module_name, field_name, | ||||||
|                             &import->u.function, error_buf, error_buf_size)) { |                                               &import->u.function, no_resolve, | ||||||
|  |                                               error_buf, error_buf_size)) { | ||||||
|                         return false; |                         return false; | ||||||
|                     } |                     } | ||||||
|                     break; |                     break; | ||||||
|  | @ -4128,17 +4062,53 @@ fail: | ||||||
|     return false; |     return false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static bool | ||||||
|  | check_duplicate_exports(WASMModule *module, char *error_buf, | ||||||
|  |                         uint32 error_buf_size) | ||||||
|  | { | ||||||
|  |     uint32 i; | ||||||
|  |     bool result = false; | ||||||
|  |     char *names_buf[32], **names = names_buf; | ||||||
|  | 
 | ||||||
|  |     if (module->export_count > 32) { | ||||||
|  |         names = loader_malloc(module->export_count * sizeof(char *), error_buf, | ||||||
|  |                               error_buf_size); | ||||||
|  |         if (!names) { | ||||||
|  |             return result; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     for (i = 0; i < module->export_count; i++) { | ||||||
|  |         names[i] = module->exports[i].name; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     qsort(names, module->export_count, sizeof(char *), cmp_export_name); | ||||||
|  | 
 | ||||||
|  |     for (i = 1; i < module->export_count; i++) { | ||||||
|  |         if (!strcmp(names[i], names[i - 1])) { | ||||||
|  |             set_error_buf(error_buf, error_buf_size, "duplicate export name"); | ||||||
|  |             goto cleanup; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     result = true; | ||||||
|  | cleanup: | ||||||
|  |     if (module->export_count > 32) { | ||||||
|  |         wasm_runtime_free(names); | ||||||
|  |     } | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static bool | static bool | ||||||
| load_export_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module, | load_export_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module, | ||||||
|                     bool is_load_from_file_buf, char *error_buf, |                     bool is_load_from_file_buf, char *error_buf, | ||||||
|                     uint32 error_buf_size) |                     uint32 error_buf_size) | ||||||
| { | { | ||||||
|     const uint8 *p = buf, *p_end = buf_end; |     const uint8 *p = buf, *p_end = buf_end; | ||||||
|     uint32 export_count, i, j, index; |     uint32 export_count, i, index; | ||||||
|     uint64 total_size; |     uint64 total_size; | ||||||
|     uint32 str_len; |     uint32 str_len; | ||||||
|     WASMExport *export; |     WASMExport *export; | ||||||
|     const char *name; |  | ||||||
| 
 | 
 | ||||||
|     read_leb_uint32(p, p_end, export_count); |     read_leb_uint32(p, p_end, export_count); | ||||||
| 
 | 
 | ||||||
|  | @ -4164,15 +4134,6 @@ load_export_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module, | ||||||
|             read_leb_uint32(p, p_end, str_len); |             read_leb_uint32(p, p_end, str_len); | ||||||
|             CHECK_BUF(p, p_end, str_len); |             CHECK_BUF(p, p_end, str_len); | ||||||
| 
 | 
 | ||||||
|             for (j = 0; j < i; j++) { |  | ||||||
|                 name = module->exports[j].name; |  | ||||||
|                 if (strlen(name) == str_len && memcmp(name, p, str_len) == 0) { |  | ||||||
|                     set_error_buf(error_buf, error_buf_size, |  | ||||||
|                                   "duplicate export name"); |  | ||||||
|                     return false; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             if (!(export->name = wasm_const_str_list_insert( |             if (!(export->name = wasm_const_str_list_insert( | ||||||
|                       p, str_len, module, is_load_from_file_buf, error_buf, |                       p, str_len, module, is_load_from_file_buf, error_buf, | ||||||
|                       error_buf_size))) { |                       error_buf_size))) { | ||||||
|  | @ -4245,6 +4206,10 @@ load_export_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module, | ||||||
|                     return false; |                     return false; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         if (!check_duplicate_exports(module, error_buf, error_buf_size)) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (p != p_end) { |     if (p != p_end) { | ||||||
|  | @ -4492,6 +4457,7 @@ load_table_segment_section(const uint8 *buf, const uint8 *buf_end, | ||||||
|                            uint32 error_buf_size) |                            uint32 error_buf_size) | ||||||
| { | { | ||||||
|     const uint8 *p = buf, *p_end = buf_end; |     const uint8 *p = buf, *p_end = buf_end; | ||||||
|  |     uint8 table_elem_idx_type; | ||||||
|     uint32 table_segment_count, i; |     uint32 table_segment_count, i; | ||||||
|     uint64 total_size; |     uint64 total_size; | ||||||
|     WASMTableSeg *table_segment; |     WASMTableSeg *table_segment; | ||||||
|  | @ -4514,6 +4480,7 @@ load_table_segment_section(const uint8 *buf, const uint8 *buf_end, | ||||||
|                               "invalid elements segment kind"); |                               "invalid elements segment kind"); | ||||||
|                 return false; |                 return false; | ||||||
|             } |             } | ||||||
|  |             table_elem_idx_type = VALUE_TYPE_I32; | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 | #if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 | ||||||
|             read_leb_uint32(p, p_end, table_segment->mode); |             read_leb_uint32(p, p_end, table_segment->mode); | ||||||
|  | @ -4549,9 +4516,17 @@ load_table_segment_section(const uint8 *buf, const uint8 *buf_end, | ||||||
|                     if (!check_table_index(module, table_segment->table_index, |                     if (!check_table_index(module, table_segment->table_index, | ||||||
|                                            error_buf, error_buf_size)) |                                            error_buf, error_buf_size)) | ||||||
|                         return false; |                         return false; | ||||||
|                     if (!load_init_expr( | 
 | ||||||
|                             module, &p, p_end, &table_segment->base_offset, | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|                             VALUE_TYPE_I32, NULL, error_buf, error_buf_size)) |                     table_elem_idx_type = | ||||||
|  |                         is_table_64bit(module, table_segment->table_index) | ||||||
|  |                             ? VALUE_TYPE_I64 | ||||||
|  |                             : VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|  |                     if (!load_init_expr(module, &p, p_end, | ||||||
|  |                                         &table_segment->base_offset, | ||||||
|  |                                         table_elem_idx_type, NULL, error_buf, | ||||||
|  |                                         error_buf_size)) | ||||||
|                         return false; |                         return false; | ||||||
| 
 | 
 | ||||||
|                     if (table_segment->mode == 0) { |                     if (table_segment->mode == 0) { | ||||||
|  | @ -4599,9 +4574,16 @@ load_table_segment_section(const uint8 *buf, const uint8 *buf_end, | ||||||
|                                           &table_segment->table_index, |                                           &table_segment->table_index, | ||||||
|                                           error_buf, error_buf_size)) |                                           error_buf, error_buf_size)) | ||||||
|                         return false; |                         return false; | ||||||
|                     if (!load_init_expr( | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|                             module, &p, p_end, &table_segment->base_offset, |                     table_elem_idx_type = | ||||||
|                             VALUE_TYPE_I32, NULL, error_buf, error_buf_size)) |                         is_table_64bit(module, table_segment->table_index) | ||||||
|  |                             ? VALUE_TYPE_I64 | ||||||
|  |                             : VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|  |                     if (!load_init_expr(module, &p, p_end, | ||||||
|  |                                         &table_segment->base_offset, | ||||||
|  |                                         table_elem_idx_type, NULL, error_buf, | ||||||
|  |                                         error_buf_size)) | ||||||
|                         return false; |                         return false; | ||||||
|                     if (!load_elem_type(module, &p, p_end, |                     if (!load_elem_type(module, &p, p_end, | ||||||
|                                         &table_segment->elem_type, |                                         &table_segment->elem_type, | ||||||
|  | @ -4662,8 +4644,14 @@ load_table_segment_section(const uint8 *buf, const uint8 *buf_end, | ||||||
|                                   &table_segment->table_index, error_buf, |                                   &table_segment->table_index, error_buf, | ||||||
|                                   error_buf_size)) |                                   error_buf_size)) | ||||||
|                 return false; |                 return false; | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |             table_elem_idx_type = | ||||||
|  |                 is_table_64bit(module, table_segment->table_index) | ||||||
|  |                     ? VALUE_TYPE_I64 | ||||||
|  |                     : VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|             if (!load_init_expr(module, &p, p_end, &table_segment->base_offset, |             if (!load_init_expr(module, &p, p_end, &table_segment->base_offset, | ||||||
|                                 VALUE_TYPE_I32, NULL, error_buf, |                                 table_elem_idx_type, NULL, error_buf, | ||||||
|                                 error_buf_size)) |                                 error_buf_size)) | ||||||
|                 return false; |                 return false; | ||||||
|             if (!load_func_index_vec(&p, p_end, module, table_segment, |             if (!load_func_index_vec(&p, p_end, module, table_segment, | ||||||
|  | @ -4678,6 +4666,16 @@ load_table_segment_section(const uint8 *buf, const uint8 *buf_end, | ||||||
|                 return false; |                 return false; | ||||||
| #endif /* end of WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 */ | #endif /* end of WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 */ | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |             if (table_elem_idx_type == VALUE_TYPE_I64 | ||||||
|  |                 && table_segment->base_offset.u.u64 > UINT32_MAX) { | ||||||
|  |                 set_error_buf(error_buf, error_buf_size, | ||||||
|  |                               "In table64, table base offset can't be " | ||||||
|  |                               "larger than UINT32_MAX"); | ||||||
|  |                 return false; | ||||||
|  |             } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #if WASM_ENABLE_WAMR_COMPILER != 0 | #if WASM_ENABLE_WAMR_COMPILER != 0 | ||||||
|             if (table_segment->elem_type == VALUE_TYPE_EXTERNREF) |             if (table_segment->elem_type == VALUE_TYPE_EXTERNREF) | ||||||
|                 module->is_ref_types_used = true; |                 module->is_ref_types_used = true; | ||||||
|  | @ -5428,6 +5426,9 @@ init_llvm_jit_functions_stage1(WASMModule *module, char *error_buf, | ||||||
|     option.enable_memory_profiling = true; |     option.enable_memory_profiling = true; | ||||||
|     option.enable_stack_estimation = true; |     option.enable_stack_estimation = true; | ||||||
| #endif | #endif | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     option.enable_shared_heap = true; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
|     module->comp_ctx = aot_create_comp_context(module->comp_data, &option); |     module->comp_ctx = aot_create_comp_context(module->comp_data, &option); | ||||||
|     if (!module->comp_ctx) { |     if (!module->comp_ctx) { | ||||||
|  | @ -5771,7 +5772,7 @@ static void **handle_table; | ||||||
| static bool | static bool | ||||||
| load_from_sections(WASMModule *module, WASMSection *sections, | load_from_sections(WASMModule *module, WASMSection *sections, | ||||||
|                    bool is_load_from_file_buf, bool wasm_binary_freeable, |                    bool is_load_from_file_buf, bool wasm_binary_freeable, | ||||||
|                    char *error_buf, uint32 error_buf_size) |                    bool no_resolve, char *error_buf, uint32 error_buf_size) | ||||||
| { | { | ||||||
|     WASMExport *export; |     WASMExport *export; | ||||||
|     WASMSection *section = sections; |     WASMSection *section = sections; | ||||||
|  | @ -5828,8 +5829,8 @@ load_from_sections(WASMModule *module, WASMSection *sections, | ||||||
|                 break; |                 break; | ||||||
|             case SECTION_TYPE_IMPORT: |             case SECTION_TYPE_IMPORT: | ||||||
|                 if (!load_import_section(buf, buf_end, module, |                 if (!load_import_section(buf, buf_end, module, | ||||||
|                                          reuse_const_strings, error_buf, |                                          reuse_const_strings, no_resolve, | ||||||
|                                          error_buf_size)) |                                          error_buf, error_buf_size)) | ||||||
|                     return false; |                     return false; | ||||||
|                 break; |                 break; | ||||||
|             case SECTION_TYPE_FUNC: |             case SECTION_TYPE_FUNC: | ||||||
|  | @ -6208,6 +6209,12 @@ load_from_sections(WASMModule *module, WASMSection *sections, | ||||||
| #endif | #endif | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |     if (!check_memory64_flags_consistency(module, error_buf, error_buf_size, | ||||||
|  |                                           false)) | ||||||
|  |         return false; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     calculate_global_data_offset(module); |     calculate_global_data_offset(module); | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_FAST_JIT != 0 | #if WASM_ENABLE_FAST_JIT != 0 | ||||||
|  | @ -6354,7 +6361,7 @@ wasm_loader_load_from_sections(WASMSection *section_list, char *error_buf, | ||||||
|     if (!module) |     if (!module) | ||||||
|         return NULL; |         return NULL; | ||||||
| 
 | 
 | ||||||
|     if (!load_from_sections(module, section_list, false, true, error_buf, |     if (!load_from_sections(module, section_list, false, true, false, error_buf, | ||||||
|                             error_buf_size)) { |                             error_buf_size)) { | ||||||
|         wasm_loader_unload(module); |         wasm_loader_unload(module); | ||||||
|         return NULL; |         return NULL; | ||||||
|  | @ -6499,7 +6506,8 @@ static union { | ||||||
| 
 | 
 | ||||||
| static bool | static bool | ||||||
| load(const uint8 *buf, uint32 size, WASMModule *module, | load(const uint8 *buf, uint32 size, WASMModule *module, | ||||||
|      bool wasm_binary_freeable, char *error_buf, uint32 error_buf_size) |      bool wasm_binary_freeable, bool no_resolve, char *error_buf, | ||||||
|  |      uint32 error_buf_size) | ||||||
| { | { | ||||||
|     const uint8 *buf_end = buf + size; |     const uint8 *buf_end = buf + size; | ||||||
|     const uint8 *p = buf, *p_end = buf_end; |     const uint8 *p = buf, *p_end = buf_end; | ||||||
|  | @ -6530,7 +6538,7 @@ load(const uint8 *buf, uint32 size, WASMModule *module, | ||||||
| 
 | 
 | ||||||
|     if (!create_sections(buf, size, §ion_list, error_buf, error_buf_size) |     if (!create_sections(buf, size, §ion_list, error_buf, error_buf_size) | ||||||
|         || !load_from_sections(module, section_list, true, wasm_binary_freeable, |         || !load_from_sections(module, section_list, true, wasm_binary_freeable, | ||||||
|                                error_buf, error_buf_size)) { |                                no_resolve, error_buf, error_buf_size)) { | ||||||
|         destroy_sections(section_list); |         destroy_sections(section_list); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  | @ -6706,8 +6714,8 @@ wasm_loader_load(uint8 *buf, uint32 size, | ||||||
|     module->load_size = size; |     module->load_size = size; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|     if (!load(buf, size, module, args->wasm_binary_freeable, error_buf, |     if (!load(buf, size, module, args->wasm_binary_freeable, args->no_resolve, | ||||||
|               error_buf_size)) { |               error_buf, error_buf_size)) { | ||||||
|         goto fail; |         goto fail; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -9709,6 +9717,7 @@ fail: | ||||||
| #define POP_REF(Type) TEMPLATE_POP_REF(Type) | #define POP_REF(Type) TEMPLATE_POP_REF(Type) | ||||||
| #define PUSH_MEM_OFFSET() TEMPLATE_PUSH_REF(mem_offset_type) | #define PUSH_MEM_OFFSET() TEMPLATE_PUSH_REF(mem_offset_type) | ||||||
| #define PUSH_PAGE_COUNT() PUSH_MEM_OFFSET() | #define PUSH_PAGE_COUNT() PUSH_MEM_OFFSET() | ||||||
|  | #define PUSH_TBL_ELEM_IDX() TEMPLATE_PUSH_REF(table_elem_idx_type) | ||||||
| 
 | 
 | ||||||
| #define POP_I32() TEMPLATE_POP(I32) | #define POP_I32() TEMPLATE_POP(I32) | ||||||
| #define POP_F32() TEMPLATE_POP(F32) | #define POP_F32() TEMPLATE_POP(F32) | ||||||
|  | @ -9719,6 +9728,7 @@ fail: | ||||||
| #define POP_EXTERNREF() TEMPLATE_POP(EXTERNREF) | #define POP_EXTERNREF() TEMPLATE_POP(EXTERNREF) | ||||||
| #define POP_STRINGREF() TEMPLATE_POP(STRINGREF) | #define POP_STRINGREF() TEMPLATE_POP(STRINGREF) | ||||||
| #define POP_MEM_OFFSET() TEMPLATE_POP_REF(mem_offset_type) | #define POP_MEM_OFFSET() TEMPLATE_POP_REF(mem_offset_type) | ||||||
|  | #define POP_TBL_ELEM_IDX() TEMPLATE_POP_REF(table_elem_idx_type) | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_FAST_INTERP != 0 | #if WASM_ENABLE_FAST_INTERP != 0 | ||||||
| 
 | 
 | ||||||
|  | @ -10904,7 +10914,8 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, | ||||||
| { | { | ||||||
|     uint8 *p = func->code, *p_end = func->code + func->code_size, *p_org; |     uint8 *p = func->code, *p_end = func->code + func->code_size, *p_org; | ||||||
|     uint32 param_count, local_count, global_count; |     uint32 param_count, local_count, global_count; | ||||||
|     uint8 *param_types, *local_types, local_type, global_type, mem_offset_type; |     uint8 *param_types, *local_types, local_type, global_type, mem_offset_type, | ||||||
|  |         table_elem_idx_type; | ||||||
|     BlockType func_block_type; |     BlockType func_block_type; | ||||||
|     uint16 *local_offsets, local_offset; |     uint16 *local_offsets, local_offset; | ||||||
|     uint32 type_idx, func_idx, local_idx, global_idx, table_idx; |     uint32 type_idx, func_idx, local_idx, global_idx, table_idx; | ||||||
|  | @ -10939,6 +10950,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, | ||||||
|     mem_offset_type = is_memory64 ? VALUE_TYPE_I64 : VALUE_TYPE_I32; |     mem_offset_type = is_memory64 ? VALUE_TYPE_I64 : VALUE_TYPE_I32; | ||||||
| #else | #else | ||||||
|     mem_offset_type = VALUE_TYPE_I32; |     mem_offset_type = VALUE_TYPE_I32; | ||||||
|  |     table_elem_idx_type = VALUE_TYPE_I32; | ||||||
| #endif | #endif | ||||||
|     uint32 memidx; |     uint32 memidx; | ||||||
| 
 | 
 | ||||||
|  | @ -12098,8 +12110,13 @@ re_scan: | ||||||
|                 emit_uint32(loader_ctx, table_idx); |                 emit_uint32(loader_ctx, table_idx); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                 table_elem_idx_type = is_table_64bit(module, table_idx) | ||||||
|  |                                           ? VALUE_TYPE_I64 | ||||||
|  |                                           : VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|                 /* skip elem idx */ |                 /* skip elem idx */ | ||||||
|                 POP_I32(); |                 POP_TBL_ELEM_IDX(); | ||||||
| 
 | 
 | ||||||
|                 if (type_idx >= module->type_count) { |                 if (type_idx >= module->type_count) { | ||||||
|                     set_error_buf(error_buf, error_buf_size, "unknown type"); |                     set_error_buf(error_buf, error_buf_size, "unknown type"); | ||||||
|  | @ -12476,8 +12493,8 @@ re_scan: | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             /* table.get x. tables[x]. [i32] -> [t] */ |             /* table.get x. tables[x]. [it] -> [t] */ | ||||||
|             /* table.set x. tables[x]. [i32 t] -> [] */ |             /* table.set x. tables[x]. [it t] -> [] */ | ||||||
|             case WASM_OP_TABLE_GET: |             case WASM_OP_TABLE_GET: | ||||||
|             case WASM_OP_TABLE_SET: |             case WASM_OP_TABLE_SET: | ||||||
|             { |             { | ||||||
|  | @ -12508,8 +12525,13 @@ re_scan: | ||||||
|                 emit_uint32(loader_ctx, table_idx); |                 emit_uint32(loader_ctx, table_idx); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                 table_elem_idx_type = is_table_64bit(module, table_idx) | ||||||
|  |                                           ? VALUE_TYPE_I64 | ||||||
|  |                                           : VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|                 if (opcode == WASM_OP_TABLE_GET) { |                 if (opcode == WASM_OP_TABLE_GET) { | ||||||
|                     POP_I32(); |                     POP_TBL_ELEM_IDX(); | ||||||
| #if WASM_ENABLE_FAST_INTERP != 0 | #if WASM_ENABLE_FAST_INTERP != 0 | ||||||
|                     PUSH_OFFSET_TYPE(decl_ref_type); |                     PUSH_OFFSET_TYPE(decl_ref_type); | ||||||
| #endif | #endif | ||||||
|  | @ -12520,7 +12542,7 @@ re_scan: | ||||||
|                     POP_OFFSET_TYPE(decl_ref_type); |                     POP_OFFSET_TYPE(decl_ref_type); | ||||||
| #endif | #endif | ||||||
|                     POP_TYPE(decl_ref_type); |                     POP_TYPE(decl_ref_type); | ||||||
|                     POP_I32(); |                     POP_TBL_ELEM_IDX(); | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_WAMR_COMPILER != 0 | #if WASM_ENABLE_WAMR_COMPILER != 0 | ||||||
|  | @ -14803,7 +14825,12 @@ re_scan: | ||||||
| #endif | #endif | ||||||
|                         POP_I32(); |                         POP_I32(); | ||||||
|                         POP_I32(); |                         POP_I32(); | ||||||
|                         POP_I32(); | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                         table_elem_idx_type = is_table_64bit(module, table_idx) | ||||||
|  |                                                   ? VALUE_TYPE_I64 | ||||||
|  |                                                   : VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|  |                         POP_TBL_ELEM_IDX(); | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_WAMR_COMPILER != 0 | #if WASM_ENABLE_WAMR_COMPILER != 0 | ||||||
|                         module->is_ref_types_used = true; |                         module->is_ref_types_used = true; | ||||||
|  | @ -14828,7 +14855,8 @@ re_scan: | ||||||
|                     } |                     } | ||||||
|                     case WASM_OP_TABLE_COPY: |                     case WASM_OP_TABLE_COPY: | ||||||
|                     { |                     { | ||||||
|                         uint8 src_type, dst_type; |                         uint8 src_type, dst_type, src_tbl_idx_type, | ||||||
|  |                             dst_tbl_idx_type, min_tbl_idx_type; | ||||||
| #if WASM_ENABLE_GC != 0 | #if WASM_ENABLE_GC != 0 | ||||||
|                         WASMRefType *src_ref_type = NULL, *dst_ref_type = NULL; |                         WASMRefType *src_ref_type = NULL, *dst_ref_type = NULL; | ||||||
| #endif | #endif | ||||||
|  | @ -14874,9 +14902,31 @@ re_scan: | ||||||
|                         emit_uint32(loader_ctx, dst_tbl_idx); |                         emit_uint32(loader_ctx, dst_tbl_idx); | ||||||
|                         emit_uint32(loader_ctx, src_tbl_idx); |                         emit_uint32(loader_ctx, src_tbl_idx); | ||||||
| #endif | #endif | ||||||
|                         POP_I32(); | 
 | ||||||
|                         POP_I32(); | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|                         POP_I32(); |                         src_tbl_idx_type = is_table_64bit(module, src_tbl_idx) | ||||||
|  |                                                ? VALUE_TYPE_I64 | ||||||
|  |                                                : VALUE_TYPE_I32; | ||||||
|  |                         dst_tbl_idx_type = is_table_64bit(module, dst_tbl_idx) | ||||||
|  |                                                ? VALUE_TYPE_I64 | ||||||
|  |                                                : VALUE_TYPE_I32; | ||||||
|  |                         min_tbl_idx_type = | ||||||
|  |                             (src_tbl_idx_type == VALUE_TYPE_I32 | ||||||
|  |                              || dst_tbl_idx_type == VALUE_TYPE_I32) | ||||||
|  |                                 ? VALUE_TYPE_I32 | ||||||
|  |                                 : VALUE_TYPE_I64; | ||||||
|  | #else | ||||||
|  |                         src_tbl_idx_type = VALUE_TYPE_I32; | ||||||
|  |                         dst_tbl_idx_type = VALUE_TYPE_I32; | ||||||
|  |                         min_tbl_idx_type = VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |                         table_elem_idx_type = min_tbl_idx_type; | ||||||
|  |                         POP_TBL_ELEM_IDX(); | ||||||
|  |                         table_elem_idx_type = src_tbl_idx_type; | ||||||
|  |                         POP_TBL_ELEM_IDX(); | ||||||
|  |                         table_elem_idx_type = dst_tbl_idx_type; | ||||||
|  |                         POP_TBL_ELEM_IDX(); | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_WAMR_COMPILER != 0 | #if WASM_ENABLE_WAMR_COMPILER != 0 | ||||||
|                         module->is_ref_types_used = true; |                         module->is_ref_types_used = true; | ||||||
|  | @ -14896,7 +14946,12 @@ re_scan: | ||||||
|                         emit_uint32(loader_ctx, table_idx); |                         emit_uint32(loader_ctx, table_idx); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|                         PUSH_I32(); | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                         table_elem_idx_type = is_table_64bit(module, table_idx) | ||||||
|  |                                                   ? VALUE_TYPE_I64 | ||||||
|  |                                                   : VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|  |                         PUSH_TBL_ELEM_IDX(); | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_WAMR_COMPILER != 0 | #if WASM_ENABLE_WAMR_COMPILER != 0 | ||||||
|                         module->is_ref_types_used = true; |                         module->is_ref_types_used = true; | ||||||
|  | @ -14945,15 +15000,20 @@ re_scan: | ||||||
|                         emit_uint32(loader_ctx, table_idx); |                         emit_uint32(loader_ctx, table_idx); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|                         POP_I32(); | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                         table_elem_idx_type = is_table_64bit(module, table_idx) | ||||||
|  |                                                   ? VALUE_TYPE_I64 | ||||||
|  |                                                   : VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|  |                         POP_TBL_ELEM_IDX(); | ||||||
| #if WASM_ENABLE_FAST_INTERP != 0 | #if WASM_ENABLE_FAST_INTERP != 0 | ||||||
|                         POP_OFFSET_TYPE(decl_type); |                         POP_OFFSET_TYPE(decl_type); | ||||||
| #endif | #endif | ||||||
|                         POP_TYPE(decl_type); |                         POP_TYPE(decl_type); | ||||||
|                         if (opcode1 == WASM_OP_TABLE_GROW) |                         if (opcode1 == WASM_OP_TABLE_GROW) | ||||||
|                             PUSH_I32(); |                             PUSH_TBL_ELEM_IDX(); | ||||||
|                         else |                         else | ||||||
|                             POP_I32(); |                             POP_TBL_ELEM_IDX(); | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_WAMR_COMPILER != 0 | #if WASM_ENABLE_WAMR_COMPILER != 0 | ||||||
|                         module->is_ref_types_used = true; |                         module->is_ref_types_used = true; | ||||||
|  |  | ||||||
|  | @ -36,12 +36,25 @@ has_module_memory64(WASMModule *module) | ||||||
|     /* TODO: multi-memories for now assuming the memory idx type is consistent
 |     /* TODO: multi-memories for now assuming the memory idx type is consistent
 | ||||||
|      * across multi-memories */ |      * across multi-memories */ | ||||||
|     if (module->import_memory_count > 0) |     if (module->import_memory_count > 0) | ||||||
|         return !!(module->import_memories[0].u.mem_type.flags & MEMORY64_FLAG); |         return !!(module->import_memories[0].u.memory.mem_type.flags | ||||||
|  |                   & MEMORY64_FLAG); | ||||||
|     else if (module->memory_count > 0) |     else if (module->memory_count > 0) | ||||||
|         return !!(module->memories[0].flags & MEMORY64_FLAG); |         return !!(module->memories[0].flags & MEMORY64_FLAG); | ||||||
| 
 | 
 | ||||||
|     return false; |     return false; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | static bool | ||||||
|  | is_table_64bit(WASMModule *module, uint32 table_idx) | ||||||
|  | { | ||||||
|  |     if (table_idx < module->import_table_count) | ||||||
|  |         return !!(module->import_tables[table_idx].u.table.table_type.flags | ||||||
|  |                   & TABLE64_FLAG); | ||||||
|  |     else | ||||||
|  |         return !!(module->tables[table_idx].table_type.flags & TABLE64_FLAG); | ||||||
|  | 
 | ||||||
|  |     return false; | ||||||
|  | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
|  | @ -580,11 +593,15 @@ load_type_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| adjust_table_max_size(uint32 init_size, uint32 max_size_flag, uint32 *max_size) | adjust_table_max_size(bool is_table64, uint32 init_size, uint32 max_size_flag, | ||||||
|  |                       uint32 *max_size) | ||||||
| { | { | ||||||
|     uint32 default_max_size = init_size * 2 > WASM_TABLE_MAX_SIZE |     uint32 default_max_size = init_size * 2 > WASM_TABLE_MAX_SIZE | ||||||
|                                   ? init_size * 2 |                                   ? init_size * 2 | ||||||
|                                   : WASM_TABLE_MAX_SIZE; |                                   : WASM_TABLE_MAX_SIZE; | ||||||
|  |     /* TODO: current still use UINT32_MAX as upper limit for table size to keep
 | ||||||
|  |      * ABI unchanged */ | ||||||
|  |     (void)is_table64; | ||||||
| 
 | 
 | ||||||
|     if (max_size_flag) { |     if (max_size_flag) { | ||||||
|         /* module defines the table limitation */ |         /* module defines the table limitation */ | ||||||
|  | @ -645,8 +662,8 @@ load_table_import(const uint8 **p_buf, const uint8 *buf_end, | ||||||
|                   char *error_buf, uint32 error_buf_size) |                   char *error_buf, uint32 error_buf_size) | ||||||
| { | { | ||||||
|     const uint8 *p = *p_buf, *p_end = buf_end; |     const uint8 *p = *p_buf, *p_end = buf_end; | ||||||
|     uint32 declare_elem_type = 0, declare_max_size_flag = 0, |     uint32 declare_elem_type = 0, table_flag = 0, declare_init_size = 0, | ||||||
|            declare_init_size = 0, declare_max_size = 0; |            declare_max_size = 0; | ||||||
| 
 | 
 | ||||||
|     CHECK_BUF(p, p_end, 1); |     CHECK_BUF(p, p_end, 1); | ||||||
|     /* 0x70 or 0x6F */ |     /* 0x70 or 0x6F */ | ||||||
|  | @ -657,24 +674,29 @@ load_table_import(const uint8 **p_buf, const uint8 *buf_end, | ||||||
| #endif | #endif | ||||||
|     ); |     ); | ||||||
| 
 | 
 | ||||||
|     read_leb_uint32(p, p_end, declare_max_size_flag); |     read_leb_uint32(p, p_end, table_flag); | ||||||
|  | 
 | ||||||
|  |     if (!wasm_table_check_flags(table_flag, error_buf, error_buf_size, false)) { | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     read_leb_uint32(p, p_end, declare_init_size); |     read_leb_uint32(p, p_end, declare_init_size); | ||||||
|     if (declare_max_size_flag & 1) { |     if (table_flag & MAX_TABLE_SIZE_FLAG) { | ||||||
|         read_leb_uint32(p, p_end, declare_max_size); |         read_leb_uint32(p, p_end, declare_max_size); | ||||||
|         bh_assert(table->table_type.init_size <= table->table_type.max_size); |         bh_assert(table->table_type.init_size <= table->table_type.max_size); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     adjust_table_max_size(declare_init_size, declare_max_size_flag, |     adjust_table_max_size(table_flag & TABLE64_FLAG, declare_init_size, | ||||||
|                           &declare_max_size); |                           table_flag & MAX_TABLE_SIZE_FLAG, &declare_max_size); | ||||||
|     *p_buf = p; |     *p_buf = p; | ||||||
| 
 | 
 | ||||||
|     bh_assert( |     bh_assert(!((table_flag & MAX_TABLE_SIZE_FLAG) | ||||||
|         !((declare_max_size_flag & 1) && declare_init_size > declare_max_size)); |                 && declare_init_size > declare_max_size)); | ||||||
| 
 | 
 | ||||||
|     /* now we believe all declaration are ok */ |     /* now we believe all declaration are ok */ | ||||||
|     table->table_type.elem_type = declare_elem_type; |     table->table_type.elem_type = declare_elem_type; | ||||||
|     table->table_type.init_size = declare_init_size; |     table->table_type.init_size = declare_init_size; | ||||||
|     table->table_type.flags = declare_max_size_flag; |     table->table_type.flags = table_flag; | ||||||
|     table->table_type.max_size = declare_max_size; |     table->table_type.max_size = declare_max_size; | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|  | @ -792,16 +814,22 @@ load_table(const uint8 **p_buf, const uint8 *buf_end, WASMTable *table, | ||||||
|     p_org = p; |     p_org = p; | ||||||
|     read_leb_uint32(p, p_end, table->table_type.flags); |     read_leb_uint32(p, p_end, table->table_type.flags); | ||||||
|     bh_assert(p - p_org <= 1); |     bh_assert(p - p_org <= 1); | ||||||
|     bh_assert(table->table_type.flags <= 1); |  | ||||||
|     (void)p_org; |     (void)p_org; | ||||||
| 
 | 
 | ||||||
|  |     if (!wasm_table_check_flags(table->table_type.flags, error_buf, | ||||||
|  |                                 error_buf_size, false)) { | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     read_leb_uint32(p, p_end, table->table_type.init_size); |     read_leb_uint32(p, p_end, table->table_type.init_size); | ||||||
|     if (table->table_type.flags == 1) { |     if (table->table_type.flags == MAX_TABLE_SIZE_FLAG) { | ||||||
|         read_leb_uint32(p, p_end, table->table_type.max_size); |         read_leb_uint32(p, p_end, table->table_type.max_size); | ||||||
|         bh_assert(table->table_type.init_size <= table->table_type.max_size); |         bh_assert(table->table_type.init_size <= table->table_type.max_size); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     adjust_table_max_size(table->table_type.init_size, table->table_type.flags, |     adjust_table_max_size(table->table_type.flags & TABLE64_FLAG, | ||||||
|  |                           table->table_type.init_size, | ||||||
|  |                           table->table_type.flags & MAX_TABLE_SIZE_FLAG, | ||||||
|                           &table->table_type.max_size); |                           &table->table_type.max_size); | ||||||
| 
 | 
 | ||||||
|     *p_buf = p; |     *p_buf = p; | ||||||
|  | @ -1578,6 +1606,7 @@ load_table_segment_section(const uint8 *buf, const uint8 *buf_end, | ||||||
|                            uint32 error_buf_size) |                            uint32 error_buf_size) | ||||||
| { | { | ||||||
|     const uint8 *p = buf, *p_end = buf_end; |     const uint8 *p = buf, *p_end = buf_end; | ||||||
|  |     uint8 table_elem_idx_type; | ||||||
|     uint32 table_segment_count, i, table_index, function_count; |     uint32 table_segment_count, i, table_index, function_count; | ||||||
|     uint64 total_size; |     uint64 total_size; | ||||||
|     WASMTableSeg *table_segment; |     WASMTableSeg *table_segment; | ||||||
|  | @ -1595,6 +1624,7 @@ load_table_segment_section(const uint8 *buf, const uint8 *buf_end, | ||||||
|         table_segment = module->table_segments; |         table_segment = module->table_segments; | ||||||
|         for (i = 0; i < table_segment_count; i++, table_segment++) { |         for (i = 0; i < table_segment_count; i++, table_segment++) { | ||||||
|             bh_assert(p < p_end); |             bh_assert(p < p_end); | ||||||
|  |             table_elem_idx_type = VALUE_TYPE_I32; | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_REF_TYPES != 0 | #if WASM_ENABLE_REF_TYPES != 0 | ||||||
|             read_leb_uint32(p, p_end, table_segment->mode); |             read_leb_uint32(p, p_end, table_segment->mode); | ||||||
|  | @ -1611,9 +1641,15 @@ load_table_segment_section(const uint8 *buf, const uint8 *buf_end, | ||||||
|                                            error_buf, error_buf_size)) |                                            error_buf, error_buf_size)) | ||||||
|                         return false; |                         return false; | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                     table_elem_idx_type = | ||||||
|  |                         is_table_64bit(module, table_segment->table_index) | ||||||
|  |                             ? VALUE_TYPE_I64 | ||||||
|  |                             : VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|                     if (!load_init_expr( |                     if (!load_init_expr( | ||||||
|                             module, &p, p_end, &table_segment->base_offset, |                             module, &p, p_end, &table_segment->base_offset, | ||||||
|                             VALUE_TYPE_I32, error_buf, error_buf_size)) |                             table_elem_idx_type, error_buf, error_buf_size)) | ||||||
|                         return false; |                         return false; | ||||||
| 
 | 
 | ||||||
|                     if (table_segment->mode == 0) { |                     if (table_segment->mode == 0) { | ||||||
|  | @ -1649,9 +1685,15 @@ load_table_segment_section(const uint8 *buf, const uint8 *buf_end, | ||||||
|                                           &table_segment->table_index, |                                           &table_segment->table_index, | ||||||
|                                           error_buf, error_buf_size)) |                                           error_buf, error_buf_size)) | ||||||
|                         return false; |                         return false; | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                     table_elem_idx_type = | ||||||
|  |                         is_table_64bit(module, table_segment->table_index) | ||||||
|  |                             ? VALUE_TYPE_I64 | ||||||
|  |                             : VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|                     if (!load_init_expr( |                     if (!load_init_expr( | ||||||
|                             module, &p, p_end, &table_segment->base_offset, |                             module, &p, p_end, &table_segment->base_offset, | ||||||
|                             VALUE_TYPE_I32, error_buf, error_buf_size)) |                             table_elem_idx_type, error_buf, error_buf_size)) | ||||||
|                         return false; |                         return false; | ||||||
|                     if (!load_elem_type(&p, p_end, &table_segment->elem_type, |                     if (!load_elem_type(&p, p_end, &table_segment->elem_type, | ||||||
|                                         table_segment->mode == 2 ? true : false, |                                         table_segment->mode == 2 ? true : false, | ||||||
|  | @ -1694,13 +1736,29 @@ load_table_segment_section(const uint8 *buf, const uint8 *buf_end, | ||||||
|                                   &table_segment->table_index, error_buf, |                                   &table_segment->table_index, error_buf, | ||||||
|                                   error_buf_size)) |                                   error_buf_size)) | ||||||
|                 return false; |                 return false; | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |             table_elem_idx_type = | ||||||
|  |                 is_table_64bit(module, table_segment->table_index) | ||||||
|  |                     ? VALUE_TYPE_I64 | ||||||
|  |                     : VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|             if (!load_init_expr(module, &p, p_end, &table_segment->base_offset, |             if (!load_init_expr(module, &p, p_end, &table_segment->base_offset, | ||||||
|                                 VALUE_TYPE_I32, error_buf, error_buf_size)) |                                 table_elem_idx_type, error_buf, error_buf_size)) | ||||||
|                 return false; |                 return false; | ||||||
|             if (!load_func_index_vec(&p, p_end, module, table_segment, |             if (!load_func_index_vec(&p, p_end, module, table_segment, | ||||||
|                                      error_buf, error_buf_size)) |                                      error_buf, error_buf_size)) | ||||||
|                 return false; |                 return false; | ||||||
| #endif /* WASM_ENABLE_REF_TYPES != 0 */ | #endif /* WASM_ENABLE_REF_TYPES != 0 */ | ||||||
|  | 
 | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |             if (table_elem_idx_type == VALUE_TYPE_I64 | ||||||
|  |                 && table_segment->base_offset.u.u64 > UINT32_MAX) { | ||||||
|  |                 set_error_buf(error_buf, error_buf_size, | ||||||
|  |                               "In table64, table base offset can't be " | ||||||
|  |                               "larger than UINT32_MAX"); | ||||||
|  |                 return false; | ||||||
|  |             } | ||||||
|  | #endif | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -1784,8 +1842,8 @@ load_data_segment_section(const uint8 *buf, const uint8 *buf_end, | ||||||
|                 /* This memory_flag is from memory instead of data segment */ |                 /* This memory_flag is from memory instead of data segment */ | ||||||
|                 uint8 memory_flag; |                 uint8 memory_flag; | ||||||
|                 if (module->import_memory_count > 0) { |                 if (module->import_memory_count > 0) { | ||||||
|                     memory_flag = |                     memory_flag = module->import_memories[mem_index] | ||||||
|                         module->import_memories[mem_index].u.mem_type.flags; |                                       .u.memory.mem_type.flags; | ||||||
|                 } |                 } | ||||||
|                 else { |                 else { | ||||||
|                     memory_flag = |                     memory_flag = | ||||||
|  | @ -2170,6 +2228,9 @@ init_llvm_jit_functions_stage1(WASMModule *module, char *error_buf, | ||||||
|     option.enable_memory_profiling = true; |     option.enable_memory_profiling = true; | ||||||
|     option.enable_stack_estimation = true; |     option.enable_stack_estimation = true; | ||||||
| #endif | #endif | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     option.enable_shared_heap = true; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
|     module->comp_ctx = aot_create_comp_context(module->comp_data, &option); |     module->comp_ctx = aot_create_comp_context(module->comp_data, &option); | ||||||
|     if (!module->comp_ctx) { |     if (!module->comp_ctx) { | ||||||
|  | @ -2960,6 +3021,12 @@ load_from_sections(WASMModule *module, WASMSection *sections, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |     if (!check_memory64_flags_consistency(module, error_buf, error_buf_size, | ||||||
|  |                                           false)) | ||||||
|  |         return false; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|     calculate_global_data_offset(module); |     calculate_global_data_offset(module); | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_FAST_JIT != 0 | #if WASM_ENABLE_FAST_JIT != 0 | ||||||
|  | @ -5230,6 +5297,13 @@ fail: | ||||||
|     } while (0) |     } while (0) | ||||||
| #define PUSH_PAGE_COUNT() PUSH_MEM_OFFSET() | #define PUSH_PAGE_COUNT() PUSH_MEM_OFFSET() | ||||||
| 
 | 
 | ||||||
|  | #define PUSH_TBL_ELEM_IDX()                                               \ | ||||||
|  |     do {                                                                  \ | ||||||
|  |         if (!(wasm_loader_push_frame_ref(loader_ctx, table_elem_idx_type, \ | ||||||
|  |                                          error_buf, error_buf_size)))     \ | ||||||
|  |             goto fail;                                                    \ | ||||||
|  |     } while (0) | ||||||
|  | 
 | ||||||
| #define POP_MEM_OFFSET()                                                   \ | #define POP_MEM_OFFSET()                                                   \ | ||||||
|     do {                                                                   \ |     do {                                                                   \ | ||||||
|         if (!wasm_loader_pop_frame_ref_offset(loader_ctx, mem_offset_type, \ |         if (!wasm_loader_pop_frame_ref_offset(loader_ctx, mem_offset_type, \ | ||||||
|  | @ -5237,6 +5311,13 @@ fail: | ||||||
|             goto fail;                                                     \ |             goto fail;                                                     \ | ||||||
|     } while (0) |     } while (0) | ||||||
| 
 | 
 | ||||||
|  | #define POP_TBL_ELEM_IDX()                                               \ | ||||||
|  |     do {                                                                 \ | ||||||
|  |         if (!(wasm_loader_pop_frame_ref(loader_ctx, table_elem_idx_type, \ | ||||||
|  |                                         error_buf, error_buf_size)))     \ | ||||||
|  |             goto fail;                                                   \ | ||||||
|  |     } while (0) | ||||||
|  | 
 | ||||||
| #define POP_AND_PUSH(type_pop, type_push)                         \ | #define POP_AND_PUSH(type_pop, type_push)                         \ | ||||||
|     do {                                                          \ |     do {                                                          \ | ||||||
|         if (!(wasm_loader_push_pop_frame_ref_offset(              \ |         if (!(wasm_loader_push_pop_frame_ref_offset(              \ | ||||||
|  | @ -5300,6 +5381,13 @@ fail: | ||||||
| 
 | 
 | ||||||
| #define PUSH_PAGE_COUNT() PUSH_MEM_OFFSET() | #define PUSH_PAGE_COUNT() PUSH_MEM_OFFSET() | ||||||
| 
 | 
 | ||||||
|  | #define PUSH_TBL_ELEM_IDX()                                               \ | ||||||
|  |     do {                                                                  \ | ||||||
|  |         if (!(wasm_loader_push_frame_ref(loader_ctx, table_elem_idx_type, \ | ||||||
|  |                                          error_buf, error_buf_size)))     \ | ||||||
|  |             goto fail;                                                    \ | ||||||
|  |     } while (0) | ||||||
|  | 
 | ||||||
| #define POP_I32()                                                              \ | #define POP_I32()                                                              \ | ||||||
|     do {                                                                       \ |     do {                                                                       \ | ||||||
|         if (!(wasm_loader_pop_frame_ref(loader_ctx, VALUE_TYPE_I32, error_buf, \ |         if (!(wasm_loader_pop_frame_ref(loader_ctx, VALUE_TYPE_I32, error_buf, \ | ||||||
|  | @ -5342,6 +5430,13 @@ fail: | ||||||
|             goto fail;                                               \ |             goto fail;                                               \ | ||||||
|     } while (0) |     } while (0) | ||||||
| 
 | 
 | ||||||
|  | #define POP_TBL_ELEM_IDX()                                               \ | ||||||
|  |     do {                                                                 \ | ||||||
|  |         if (!(wasm_loader_pop_frame_ref(loader_ctx, table_elem_idx_type, \ | ||||||
|  |                                         error_buf, error_buf_size)))     \ | ||||||
|  |             goto fail;                                                   \ | ||||||
|  |     } while (0) | ||||||
|  | 
 | ||||||
| #define POP_AND_PUSH(type_pop, type_push)                              \ | #define POP_AND_PUSH(type_pop, type_push)                              \ | ||||||
|     do {                                                               \ |     do {                                                               \ | ||||||
|         if (!(wasm_loader_push_pop_frame_ref(loader_ctx, 1, type_push, \ |         if (!(wasm_loader_push_pop_frame_ref(loader_ctx, 1, type_push, \ | ||||||
|  | @ -5961,7 +6056,8 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, | ||||||
| { | { | ||||||
|     uint8 *p = func->code, *p_end = func->code + func->code_size, *p_org; |     uint8 *p = func->code, *p_end = func->code + func->code_size, *p_org; | ||||||
|     uint32 param_count, local_count, global_count; |     uint32 param_count, local_count, global_count; | ||||||
|     uint8 *param_types, *local_types, local_type, global_type, mem_offset_type; |     uint8 *param_types, *local_types, local_type, global_type, mem_offset_type, | ||||||
|  |         table_elem_idx_type; | ||||||
|     BlockType func_block_type; |     BlockType func_block_type; | ||||||
|     uint16 *local_offsets, local_offset; |     uint16 *local_offsets, local_offset; | ||||||
|     uint32 count, local_idx, global_idx, u32, align, i, memidx; |     uint32 count, local_idx, global_idx, u32, align, i, memidx; | ||||||
|  | @ -5992,6 +6088,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, | ||||||
|     mem_offset_type = is_memory64 ? VALUE_TYPE_I64 : VALUE_TYPE_I32; |     mem_offset_type = is_memory64 ? VALUE_TYPE_I64 : VALUE_TYPE_I32; | ||||||
| #else | #else | ||||||
|     mem_offset_type = VALUE_TYPE_I32; |     mem_offset_type = VALUE_TYPE_I32; | ||||||
|  |     table_elem_idx_type = VALUE_TYPE_I32; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|     global_count = module->import_global_count + module->global_count; |     global_count = module->import_global_count + module->global_count; | ||||||
|  | @ -6604,8 +6701,13 @@ re_scan: | ||||||
|                 emit_uint32(loader_ctx, table_idx); |                 emit_uint32(loader_ctx, table_idx); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                 table_elem_idx_type = is_table_64bit(module, table_idx) | ||||||
|  |                                           ? VALUE_TYPE_I64 | ||||||
|  |                                           : VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|                 /* skip elem idx */ |                 /* skip elem idx */ | ||||||
|                 POP_I32(); |                 POP_TBL_ELEM_IDX(); | ||||||
| 
 | 
 | ||||||
|                 bh_assert(type_idx < module->type_count); |                 bh_assert(type_idx < module->type_count); | ||||||
| 
 | 
 | ||||||
|  | @ -6881,8 +6983,8 @@ re_scan: | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             /* table.get x. tables[x]. [i32] -> [t] */ |             /* table.get x. tables[x]. [it] -> [t] */ | ||||||
|             /* table.set x. tables[x]. [i32 t] -> [] */ |             /* table.set x. tables[x]. [it t] -> [] */ | ||||||
|             case WASM_OP_TABLE_GET: |             case WASM_OP_TABLE_GET: | ||||||
|             case WASM_OP_TABLE_SET: |             case WASM_OP_TABLE_SET: | ||||||
|             { |             { | ||||||
|  | @ -6898,8 +7000,13 @@ re_scan: | ||||||
|                 emit_uint32(loader_ctx, table_idx); |                 emit_uint32(loader_ctx, table_idx); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                 table_elem_idx_type = is_table_64bit(module, table_idx) | ||||||
|  |                                           ? VALUE_TYPE_I64 | ||||||
|  |                                           : VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|                 if (opcode == WASM_OP_TABLE_GET) { |                 if (opcode == WASM_OP_TABLE_GET) { | ||||||
|                     POP_I32(); |                     POP_TBL_ELEM_IDX(); | ||||||
| #if WASM_ENABLE_FAST_INTERP != 0 | #if WASM_ENABLE_FAST_INTERP != 0 | ||||||
|                     PUSH_OFFSET_TYPE(decl_ref_type); |                     PUSH_OFFSET_TYPE(decl_ref_type); | ||||||
| #endif | #endif | ||||||
|  | @ -6910,7 +7017,7 @@ re_scan: | ||||||
|                     POP_OFFSET_TYPE(decl_ref_type); |                     POP_OFFSET_TYPE(decl_ref_type); | ||||||
| #endif | #endif | ||||||
|                     POP_TYPE(decl_ref_type); |                     POP_TYPE(decl_ref_type); | ||||||
|                     POP_I32(); |                     POP_TBL_ELEM_IDX(); | ||||||
|                 } |                 } | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|  | @ -7835,7 +7942,12 @@ re_scan: | ||||||
| #endif | #endif | ||||||
|                         POP_I32(); |                         POP_I32(); | ||||||
|                         POP_I32(); |                         POP_I32(); | ||||||
|                         POP_I32(); | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                         table_elem_idx_type = is_table_64bit(module, table_idx) | ||||||
|  |                                                   ? VALUE_TYPE_I64 | ||||||
|  |                                                   : VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|  |                         POP_TBL_ELEM_IDX(); | ||||||
|                         break; |                         break; | ||||||
|                     } |                     } | ||||||
|                     case WASM_OP_ELEM_DROP: |                     case WASM_OP_ELEM_DROP: | ||||||
|  | @ -7854,7 +7966,8 @@ re_scan: | ||||||
|                     case WASM_OP_TABLE_COPY: |                     case WASM_OP_TABLE_COPY: | ||||||
|                     { |                     { | ||||||
|                         uint8 src_ref_type, dst_ref_type; |                         uint8 src_ref_type, dst_ref_type; | ||||||
|                         uint32 src_tbl_idx, dst_tbl_idx; |                         uint32 src_tbl_idx, dst_tbl_idx, src_tbl_idx_type, | ||||||
|  |                             dst_tbl_idx_type, min_tbl_idx_type; | ||||||
| 
 | 
 | ||||||
|                         read_leb_uint32(p, p_end, src_tbl_idx); |                         read_leb_uint32(p, p_end, src_tbl_idx); | ||||||
|                         if (!get_table_elem_type(module, src_tbl_idx, |                         if (!get_table_elem_type(module, src_tbl_idx, | ||||||
|  | @ -7878,9 +7991,31 @@ re_scan: | ||||||
|                         emit_uint32(loader_ctx, src_tbl_idx); |                         emit_uint32(loader_ctx, src_tbl_idx); | ||||||
|                         emit_uint32(loader_ctx, dst_tbl_idx); |                         emit_uint32(loader_ctx, dst_tbl_idx); | ||||||
| #endif | #endif | ||||||
|                         POP_I32(); | 
 | ||||||
|                         POP_I32(); | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|                         POP_I32(); |                         src_tbl_idx_type = is_table_64bit(module, src_tbl_idx) | ||||||
|  |                                                ? VALUE_TYPE_I64 | ||||||
|  |                                                : VALUE_TYPE_I32; | ||||||
|  |                         dst_tbl_idx_type = is_table_64bit(module, dst_tbl_idx) | ||||||
|  |                                                ? VALUE_TYPE_I64 | ||||||
|  |                                                : VALUE_TYPE_I32; | ||||||
|  |                         min_tbl_idx_type = | ||||||
|  |                             (src_tbl_idx_type == VALUE_TYPE_I32 | ||||||
|  |                              || dst_tbl_idx_type == VALUE_TYPE_I32) | ||||||
|  |                                 ? VALUE_TYPE_I32 | ||||||
|  |                                 : VALUE_TYPE_I64; | ||||||
|  | #else | ||||||
|  |                         src_tbl_idx_type = VALUE_TYPE_I32; | ||||||
|  |                         dst_tbl_idx_type = VALUE_TYPE_I32; | ||||||
|  |                         min_tbl_idx_type = VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |                         table_elem_idx_type = min_tbl_idx_type; | ||||||
|  |                         POP_TBL_ELEM_IDX(); | ||||||
|  |                         table_elem_idx_type = src_tbl_idx_type; | ||||||
|  |                         POP_TBL_ELEM_IDX(); | ||||||
|  |                         table_elem_idx_type = dst_tbl_idx_type; | ||||||
|  |                         POP_TBL_ELEM_IDX(); | ||||||
|                         break; |                         break; | ||||||
|                     } |                     } | ||||||
|                     case WASM_OP_TABLE_SIZE: |                     case WASM_OP_TABLE_SIZE: | ||||||
|  | @ -7898,7 +8033,12 @@ re_scan: | ||||||
|                         emit_uint32(loader_ctx, table_idx); |                         emit_uint32(loader_ctx, table_idx); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|                         PUSH_I32(); | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                         table_elem_idx_type = is_table_64bit(module, table_idx) | ||||||
|  |                                                   ? VALUE_TYPE_I64 | ||||||
|  |                                                   : VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|  |                         PUSH_TBL_ELEM_IDX(); | ||||||
|                         break; |                         break; | ||||||
|                     } |                     } | ||||||
|                     case WASM_OP_TABLE_GROW: |                     case WASM_OP_TABLE_GROW: | ||||||
|  | @ -7930,15 +8070,20 @@ re_scan: | ||||||
|                         emit_uint32(loader_ctx, table_idx); |                         emit_uint32(loader_ctx, table_idx); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|                         POP_I32(); | #if WASM_ENABLE_MEMORY64 != 0 | ||||||
|  |                         table_elem_idx_type = is_table_64bit(module, table_idx) | ||||||
|  |                                                   ? VALUE_TYPE_I64 | ||||||
|  |                                                   : VALUE_TYPE_I32; | ||||||
|  | #endif | ||||||
|  |                         POP_TBL_ELEM_IDX(); | ||||||
| #if WASM_ENABLE_FAST_INTERP != 0 | #if WASM_ENABLE_FAST_INTERP != 0 | ||||||
|                         POP_OFFSET_TYPE(decl_ref_type); |                         POP_OFFSET_TYPE(decl_ref_type); | ||||||
| #endif | #endif | ||||||
|                         POP_TYPE(decl_ref_type); |                         POP_TYPE(decl_ref_type); | ||||||
|                         if (opcode1 == WASM_OP_TABLE_GROW) |                         if (opcode1 == WASM_OP_TABLE_GROW) | ||||||
|                             PUSH_I32(); |                             PUSH_TBL_ELEM_IDX(); | ||||||
|                         else |                         else | ||||||
|                             POP_I32(); |                             PUSH_TBL_ELEM_IDX(); | ||||||
|                         break; |                         break; | ||||||
|                     } |                     } | ||||||
| #endif /* WASM_ENABLE_REF_TYPES */ | #endif /* WASM_ENABLE_REF_TYPES */ | ||||||
|  |  | ||||||
|  | @ -83,6 +83,124 @@ wasm_unload(WASMModule *module) | ||||||
|     wasm_loader_unload(module); |     wasm_loader_unload(module); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | bool | ||||||
|  | wasm_resolve_symbols(WASMModule *module) | ||||||
|  | { | ||||||
|  |     bool ret = true; | ||||||
|  |     uint32 idx; | ||||||
|  |     for (idx = 0; idx < module->import_function_count; ++idx) { | ||||||
|  |         WASMFunctionImport *import = &module->import_functions[idx].u.function; | ||||||
|  |         bool linked = import->func_ptr_linked; | ||||||
|  | #if WASM_ENABLE_MULTI_MODULE != 0 | ||||||
|  |         if (import->import_func_linked) { | ||||||
|  |             linked = true; | ||||||
|  |         } | ||||||
|  | #endif | ||||||
|  |         if (!linked && !wasm_resolve_import_func(module, import)) { | ||||||
|  |             ret = false; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #if WASM_ENABLE_MULTI_MODULE != 0 | ||||||
|  | static WASMFunction * | ||||||
|  | wasm_resolve_function(const char *module_name, const char *function_name, | ||||||
|  |                       const WASMFuncType *expected_function_type, | ||||||
|  |                       char *error_buf, uint32 error_buf_size) | ||||||
|  | { | ||||||
|  |     WASMModuleCommon *module_reg; | ||||||
|  |     WASMFunction *function = NULL; | ||||||
|  |     WASMExport *export = NULL; | ||||||
|  |     WASMModule *module = NULL; | ||||||
|  |     WASMFuncType *target_function_type = NULL; | ||||||
|  | 
 | ||||||
|  |     module_reg = wasm_runtime_find_module_registered(module_name); | ||||||
|  |     if (!module_reg || module_reg->module_type != Wasm_Module_Bytecode) { | ||||||
|  |         LOG_DEBUG("can not find a module named %s for function %s", module_name, | ||||||
|  |                   function_name); | ||||||
|  |         set_error_buf(error_buf, error_buf_size, "unknown import"); | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     module = (WASMModule *)module_reg; | ||||||
|  |     export = loader_find_export((WASMModuleCommon *)module, module_name, | ||||||
|  |                                 function_name, EXPORT_KIND_FUNC, error_buf, | ||||||
|  |                                 error_buf_size); | ||||||
|  |     if (!export) { | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* resolve function type and function */ | ||||||
|  |     if (export->index < module->import_function_count) { | ||||||
|  |         target_function_type = | ||||||
|  |             module->import_functions[export->index].u.function.func_type; | ||||||
|  |         function = module->import_functions[export->index] | ||||||
|  |                        .u.function.import_func_linked; | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         target_function_type = | ||||||
|  |             module->functions[export->index - module->import_function_count] | ||||||
|  |                 ->func_type; | ||||||
|  |         function = | ||||||
|  |             module->functions[export->index - module->import_function_count]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* check function type */ | ||||||
|  |     if (!wasm_type_equal((WASMType *)expected_function_type, | ||||||
|  |                          (WASMType *)target_function_type, module->types, | ||||||
|  |                          module->type_count)) { | ||||||
|  |         LOG_DEBUG("%s.%s failed the type check", module_name, function_name); | ||||||
|  |         set_error_buf(error_buf, error_buf_size, "incompatible import type"); | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return function; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | bool | ||||||
|  | wasm_resolve_import_func(const WASMModule *module, WASMFunctionImport *function) | ||||||
|  | { | ||||||
|  | #if WASM_ENABLE_MULTI_MODULE != 0 | ||||||
|  |     char error_buf[128]; | ||||||
|  |     WASMModule *sub_module = NULL; | ||||||
|  | #endif | ||||||
|  |     function->func_ptr_linked = wasm_native_resolve_symbol( | ||||||
|  |         function->module_name, function->field_name, function->func_type, | ||||||
|  |         &function->signature, &function->attachment, &function->call_conv_raw); | ||||||
|  | 
 | ||||||
|  |     if (function->func_ptr_linked) { | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | #if WASM_ENABLE_MULTI_MODULE != 0 | ||||||
|  |     if (!wasm_runtime_is_built_in_module(function->module_name)) { | ||||||
|  |         sub_module = (WASMModule *)wasm_runtime_load_depended_module( | ||||||
|  |             (WASMModuleCommon *)module, function->module_name, error_buf, | ||||||
|  |             sizeof(error_buf)); | ||||||
|  |         if (!sub_module) { | ||||||
|  |             LOG_WARNING("failed to load sub module: %s", error_buf); | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     function->import_func_linked = wasm_resolve_function( | ||||||
|  |         function->module_name, function->field_name, function->func_type, | ||||||
|  |         error_buf, sizeof(error_buf)); | ||||||
|  | 
 | ||||||
|  |     if (function->import_func_linked) { | ||||||
|  |         function->import_module = sub_module; | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         LOG_WARNING("failed to link function (%s, %s): %s", | ||||||
|  |                     function->module_name, function->field_name, error_buf); | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void * | static void * | ||||||
| runtime_malloc(uint64 size, char *error_buf, uint32 error_buf_size) | runtime_malloc(uint64 size, char *error_buf, uint32 error_buf_size) | ||||||
| { | { | ||||||
|  | @ -560,6 +678,8 @@ tables_instantiate(const WASMModule *module, WASMModuleInstance *module_inst, | ||||||
|            uninitialized elements */ |            uninitialized elements */ | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  |         table->is_table64 = import->u.table.table_type.flags & TABLE64_FLAG; | ||||||
|  | 
 | ||||||
| #if WASM_ENABLE_MULTI_MODULE != 0 | #if WASM_ENABLE_MULTI_MODULE != 0 | ||||||
|         *table_linked = table_inst_linked; |         *table_linked = table_inst_linked; | ||||||
|         if (table_inst_linked != NULL) { |         if (table_inst_linked != NULL) { | ||||||
|  | @ -618,6 +738,7 @@ tables_instantiate(const WASMModule *module, WASMModuleInstance *module_inst, | ||||||
|         /* For GC, all elements have already been set to NULL_REF (0) as
 |         /* For GC, all elements have already been set to NULL_REF (0) as
 | ||||||
|            uninitialized elements */ |            uninitialized elements */ | ||||||
| #endif | #endif | ||||||
|  |         table->is_table64 = module->tables[i].table_type.flags & TABLE64_FLAG; | ||||||
|         table->elem_type = module->tables[i].table_type.elem_type; |         table->elem_type = module->tables[i].table_type.elem_type; | ||||||
| #if WASM_ENABLE_GC != 0 | #if WASM_ENABLE_GC != 0 | ||||||
|         table->elem_ref_type.elem_ref_type = |         table->elem_ref_type.elem_ref_type = | ||||||
|  | @ -1246,6 +1367,17 @@ export_functions_deinstantiate(WASMExportFuncInstance *functions) | ||||||
|         wasm_runtime_free(functions); |         wasm_runtime_free(functions); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int | ||||||
|  | cmp_export_func_inst(const void *a, const void *b) | ||||||
|  | { | ||||||
|  |     const WASMExportFuncInstance *export_func1 = | ||||||
|  |         (const WASMExportFuncInstance *)a; | ||||||
|  |     const WASMExportFuncInstance *export_func2 = | ||||||
|  |         (const WASMExportFuncInstance *)b; | ||||||
|  | 
 | ||||||
|  |     return strcmp(export_func1->name, export_func2->name); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Instantiate export functions in a module. |  * Instantiate export functions in a module. | ||||||
|  */ |  */ | ||||||
|  | @ -1274,6 +1406,9 @@ export_functions_instantiate(const WASMModule *module, | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|     bh_assert((uint32)(export_func - export_funcs) == export_func_count); |     bh_assert((uint32)(export_func - export_funcs) == export_func_count); | ||||||
|  | 
 | ||||||
|  |     qsort(export_funcs, export_func_count, sizeof(WASMExportFuncInstance), | ||||||
|  |           cmp_export_func_inst); | ||||||
|     return export_funcs; |     return export_funcs; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1323,42 +1458,6 @@ export_tags_instantiate(const WASMModule *module, | ||||||
| } | } | ||||||
| #endif /* end of WASM_ENABLE_TAGS != 0 */ | #endif /* end of WASM_ENABLE_TAGS != 0 */ | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_MULTI_MODULE != 0 |  | ||||||
| static void |  | ||||||
| export_globals_deinstantiate(WASMExportGlobInstance *globals) |  | ||||||
| { |  | ||||||
|     if (globals) |  | ||||||
|         wasm_runtime_free(globals); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static WASMExportGlobInstance * |  | ||||||
| export_globals_instantiate(const WASMModule *module, |  | ||||||
|                            WASMModuleInstance *module_inst, |  | ||||||
|                            uint32 export_glob_count, char *error_buf, |  | ||||||
|                            uint32 error_buf_size) |  | ||||||
| { |  | ||||||
|     WASMExportGlobInstance *export_globals, *export_global; |  | ||||||
|     WASMExport *export = module->exports; |  | ||||||
|     uint32 i; |  | ||||||
|     uint64 total_size = |  | ||||||
|         sizeof(WASMExportGlobInstance) * (uint64)export_glob_count; |  | ||||||
| 
 |  | ||||||
|     if (!(export_global = export_globals = |  | ||||||
|               runtime_malloc(total_size, error_buf, error_buf_size))) { |  | ||||||
|         return NULL; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     for (i = 0; i < module->export_count; i++, export ++) |  | ||||||
|         if (export->kind == EXPORT_KIND_GLOBAL) { |  | ||||||
|             export_global->name = export->name; |  | ||||||
|             export_global->global = &module_inst->e->globals[export->index]; |  | ||||||
|             export_global++; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|     bh_assert((uint32)(export_global - export_globals) == export_glob_count); |  | ||||||
|     return export_globals; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #if WASM_ENABLE_MULTI_MEMORY != 0 | #if WASM_ENABLE_MULTI_MEMORY != 0 | ||||||
| static void | static void | ||||||
| export_memories_deinstantiate(WASMExportMemInstance *memories) | export_memories_deinstantiate(WASMExportMemInstance *memories) | ||||||
|  | @ -1396,6 +1495,42 @@ export_memories_instantiate(const WASMModule *module, | ||||||
| } | } | ||||||
| #endif /* end of if WASM_ENABLE_MULTI_MEMORY != 0 */ | #endif /* end of if WASM_ENABLE_MULTI_MEMORY != 0 */ | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_MULTI_MODULE != 0 | ||||||
|  | static void | ||||||
|  | export_globals_deinstantiate(WASMExportGlobInstance *globals) | ||||||
|  | { | ||||||
|  |     if (globals) | ||||||
|  |         wasm_runtime_free(globals); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static WASMExportGlobInstance * | ||||||
|  | export_globals_instantiate(const WASMModule *module, | ||||||
|  |                            WASMModuleInstance *module_inst, | ||||||
|  |                            uint32 export_glob_count, char *error_buf, | ||||||
|  |                            uint32 error_buf_size) | ||||||
|  | { | ||||||
|  |     WASMExportGlobInstance *export_globals, *export_global; | ||||||
|  |     WASMExport *export = module->exports; | ||||||
|  |     uint32 i; | ||||||
|  |     uint64 total_size = | ||||||
|  |         sizeof(WASMExportGlobInstance) * (uint64)export_glob_count; | ||||||
|  | 
 | ||||||
|  |     if (!(export_global = export_globals = | ||||||
|  |               runtime_malloc(total_size, error_buf, error_buf_size))) { | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     for (i = 0; i < module->export_count; i++, export ++) | ||||||
|  |         if (export->kind == EXPORT_KIND_GLOBAL) { | ||||||
|  |             export_global->name = export->name; | ||||||
|  |             export_global->global = &module_inst->e->globals[export->index]; | ||||||
|  |             export_global++; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     bh_assert((uint32)(export_global - export_globals) == export_glob_count); | ||||||
|  |     return export_globals; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #endif /* end of if WASM_ENABLE_MULTI_MODULE != 0 */ | #endif /* end of if WASM_ENABLE_MULTI_MODULE != 0 */ | ||||||
| 
 | 
 | ||||||
| static WASMFunctionInstance * | static WASMFunctionInstance * | ||||||
|  | @ -1476,8 +1611,12 @@ execute_post_instantiate_functions(WASMModuleInstance *module_inst, | ||||||
|     if (is_sub_inst) { |     if (is_sub_inst) { | ||||||
|         bh_assert(exec_env_main); |         bh_assert(exec_env_main); | ||||||
| #ifdef OS_ENABLE_HW_BOUND_CHECK | #ifdef OS_ENABLE_HW_BOUND_CHECK | ||||||
|  |         /* May come from pthread_create_wrapper, thread_spawn_wrapper and
 | ||||||
|  |            wasm_cluster_spawn_exec_env. If it comes from the former two, | ||||||
|  |            the exec_env_tls must be not NULL and equal to exec_env_main, | ||||||
|  |            else if it comes from the last one, it may be NULL. */ | ||||||
|  |         if (exec_env_tls) | ||||||
|             bh_assert(exec_env_tls == exec_env_main); |             bh_assert(exec_env_tls == exec_env_main); | ||||||
|         (void)exec_env_tls; |  | ||||||
| #endif | #endif | ||||||
|         exec_env = exec_env_main; |         exec_env = exec_env_main; | ||||||
| 
 | 
 | ||||||
|  | @ -2388,11 +2527,13 @@ wasm_instantiate(WASMModule *module, WASMModuleInstance *parent, | ||||||
| 
 | 
 | ||||||
|     /* export */ |     /* export */ | ||||||
|     module_inst->export_func_count = get_export_count(module, EXPORT_KIND_FUNC); |     module_inst->export_func_count = get_export_count(module, EXPORT_KIND_FUNC); | ||||||
|  | #if WASM_ENABLE_MULTI_MEMORY != 0 | ||||||
|  |     module_inst->export_memory_count = | ||||||
|  |         get_export_count(module, EXPORT_KIND_MEMORY); | ||||||
|  | #endif | ||||||
| #if WASM_ENABLE_MULTI_MODULE != 0 | #if WASM_ENABLE_MULTI_MODULE != 0 | ||||||
|     module_inst->export_table_count = |     module_inst->export_table_count = | ||||||
|         get_export_count(module, EXPORT_KIND_TABLE); |         get_export_count(module, EXPORT_KIND_TABLE); | ||||||
|     module_inst->export_memory_count = |  | ||||||
|         get_export_count(module, EXPORT_KIND_MEMORY); |  | ||||||
| #if WASM_ENABLE_TAGS != 0 | #if WASM_ENABLE_TAGS != 0 | ||||||
|     module_inst->e->export_tag_count = |     module_inst->e->export_tag_count = | ||||||
|         get_export_count(module, EXPORT_KIND_TAG); |         get_export_count(module, EXPORT_KIND_TAG); | ||||||
|  | @ -2432,7 +2573,7 @@ wasm_instantiate(WASMModule *module, WASMModuleInstance *parent, | ||||||
|                      module, module_inst, module_inst->export_global_count, |                      module, module_inst, module_inst->export_global_count, | ||||||
|                      error_buf, error_buf_size))) |                      error_buf, error_buf_size))) | ||||||
| #endif | #endif | ||||||
| #if WASM_ENABLE_MULTI_MODULE != 0 && WASM_ENABLE_MULTI_MEMORY != 0 | #if WASM_ENABLE_MULTI_MEMORY != 0 | ||||||
|         || (module_inst->export_memory_count > 0 |         || (module_inst->export_memory_count > 0 | ||||||
|             && !(module_inst->export_memories = export_memories_instantiate( |             && !(module_inst->export_memories = export_memories_instantiate( | ||||||
|                      module, module_inst, module_inst->export_memory_count, |                      module, module_inst, module_inst->export_memory_count, | ||||||
|  | @ -2671,6 +2812,14 @@ wasm_instantiate(WASMModule *module, WASMModuleInstance *parent, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_JIT != 0 && WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  | #if UINTPTR_MAX == UINT64_MAX | ||||||
|  |     module_inst->e->shared_heap_start_off.u64 = UINT64_MAX; | ||||||
|  | #else | ||||||
|  |     module_inst->e->shared_heap_start_off.u32[0] = UINT32_MAX; | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #if WASM_ENABLE_GC != 0 | #if WASM_ENABLE_GC != 0 | ||||||
|     /* Initialize the table data with init expr */ |     /* Initialize the table data with init expr */ | ||||||
|     for (i = 0; i < module->table_count; i++) { |     for (i = 0; i < module->table_count; i++) { | ||||||
|  | @ -3240,7 +3389,7 @@ wasm_deinstantiate(WASMModuleInstance *module_inst, bool is_sub_inst) | ||||||
|     export_globals_deinstantiate(module_inst->export_globals); |     export_globals_deinstantiate(module_inst->export_globals); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_MULTI_MODULE != 0 && WASM_ENABLE_MULTI_MEMORY != 0 | #if WASM_ENABLE_MULTI_MEMORY != 0 | ||||||
|     export_memories_deinstantiate(module_inst->export_memories); |     export_memories_deinstantiate(module_inst->export_memories); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | @ -3285,22 +3434,20 @@ wasm_deinstantiate(WASMModuleInstance *module_inst, bool is_sub_inst) | ||||||
| WASMFunctionInstance * | WASMFunctionInstance * | ||||||
| wasm_lookup_function(const WASMModuleInstance *module_inst, const char *name) | wasm_lookup_function(const WASMModuleInstance *module_inst, const char *name) | ||||||
| { | { | ||||||
|     uint32 i; |     WASMExportFuncInstance key = { .name = (char *)name }; | ||||||
|     for (i = 0; i < module_inst->export_func_count; i++) |     WASMExportFuncInstance *export_func_inst; | ||||||
|         if (!strcmp(module_inst->export_functions[i].name, name)) |  | ||||||
|             return module_inst->export_functions[i].function; |  | ||||||
|     return NULL; |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| #if WASM_ENABLE_MULTI_MODULE != 0 |     if (!module_inst->export_functions) | ||||||
| WASMGlobalInstance * |  | ||||||
| wasm_lookup_global(const WASMModuleInstance *module_inst, const char *name) |  | ||||||
| { |  | ||||||
|     uint32 i; |  | ||||||
|     for (i = 0; i < module_inst->export_global_count; i++) |  | ||||||
|         if (!strcmp(module_inst->export_globals[i].name, name)) |  | ||||||
|             return module_inst->export_globals[i].global; |  | ||||||
|         return NULL; |         return NULL; | ||||||
|  | 
 | ||||||
|  |     export_func_inst = bsearch( | ||||||
|  |         &key, module_inst->export_functions, module_inst->export_func_count, | ||||||
|  |         sizeof(WASMExportFuncInstance), cmp_export_func_inst); | ||||||
|  | 
 | ||||||
|  |     if (!export_func_inst) | ||||||
|  |         return NULL; | ||||||
|  | 
 | ||||||
|  |     return export_func_inst->function; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| WASMMemoryInstance * | WASMMemoryInstance * | ||||||
|  | @ -3314,10 +3461,23 @@ wasm_lookup_memory(const WASMModuleInstance *module_inst, const char *name) | ||||||
|     return NULL; |     return NULL; | ||||||
| #else | #else | ||||||
|     (void)module_inst->export_memories; |     (void)module_inst->export_memories; | ||||||
|  |     if (!module_inst->memories) | ||||||
|  |         return NULL; | ||||||
|     return module_inst->memories[0]; |     return module_inst->memories[0]; | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_MULTI_MODULE != 0 | ||||||
|  | WASMGlobalInstance * | ||||||
|  | wasm_lookup_global(const WASMModuleInstance *module_inst, const char *name) | ||||||
|  | { | ||||||
|  |     uint32 i; | ||||||
|  |     for (i = 0; i < module_inst->export_global_count; i++) | ||||||
|  |         if (!strcmp(module_inst->export_globals[i].name, name)) | ||||||
|  |             return module_inst->export_globals[i].global; | ||||||
|  |     return NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| WASMTableInstance * | WASMTableInstance * | ||||||
| wasm_lookup_table(const WASMModuleInstance *module_inst, const char *name) | wasm_lookup_table(const WASMModuleInstance *module_inst, const char *name) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -92,6 +92,15 @@ typedef union { | ||||||
|     uint32 u32[2]; |     uint32 u32[2]; | ||||||
| } MemBound; | } MemBound; | ||||||
| 
 | 
 | ||||||
|  | typedef struct WASMSharedHeap { | ||||||
|  |     struct WASMSharedHeap *next; | ||||||
|  |     void *heap_handle; | ||||||
|  |     uint8 *base_addr; | ||||||
|  |     uint64 size; | ||||||
|  |     uint64 start_off_mem64; | ||||||
|  |     uint64 start_off_mem32; | ||||||
|  | } WASMSharedHeap; | ||||||
|  | 
 | ||||||
| struct WASMMemoryInstance { | struct WASMMemoryInstance { | ||||||
|     /* Module type */ |     /* Module type */ | ||||||
|     uint32 module_type; |     uint32 module_type; | ||||||
|  | @ -157,7 +166,8 @@ struct WASMMemoryInstance { | ||||||
| struct WASMTableInstance { | struct WASMTableInstance { | ||||||
|     /* The element type */ |     /* The element type */ | ||||||
|     uint8 elem_type; |     uint8 elem_type; | ||||||
|     uint8 __padding__[7]; |     uint8 is_table64; | ||||||
|  |     uint8 __padding__[6]; | ||||||
|     union { |     union { | ||||||
| #if WASM_ENABLE_GC != 0 | #if WASM_ENABLE_GC != 0 | ||||||
|         WASMRefType *elem_ref_type; |         WASMRefType *elem_ref_type; | ||||||
|  | @ -353,6 +363,19 @@ typedef struct WASMModuleInstanceExtra { | ||||||
|     uint32 max_aux_stack_used; |     uint32 max_aux_stack_used; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  |     WASMSharedHeap *shared_heap; | ||||||
|  | #if WASM_ENABLE_JIT != 0 | ||||||
|  |     /*
 | ||||||
|  |      * Adjusted shared heap based addr to simple the calculation | ||||||
|  |      * in the aot code. The value is: | ||||||
|  |      *   shared_heap->base_addr - shared_heap->start_off | ||||||
|  |      */ | ||||||
|  |     uint8 *shared_heap_base_addr_adj; | ||||||
|  |     MemBound shared_heap_start_off; | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #if WASM_ENABLE_DEBUG_INTERP != 0                         \ | #if WASM_ENABLE_DEBUG_INTERP != 0                         \ | ||||||
|     || (WASM_ENABLE_FAST_JIT != 0 && WASM_ENABLE_JIT != 0 \ |     || (WASM_ENABLE_FAST_JIT != 0 && WASM_ENABLE_JIT != 0 \ | ||||||
|         && WASM_ENABLE_LAZY_JIT != 0) |         && WASM_ENABLE_LAZY_JIT != 0) | ||||||
|  | @ -513,6 +536,13 @@ wasm_load_from_sections(WASMSection *section_list, char *error_buf, | ||||||
| void | void | ||||||
| wasm_unload(WASMModule *module); | wasm_unload(WASMModule *module); | ||||||
| 
 | 
 | ||||||
|  | bool | ||||||
|  | wasm_resolve_symbols(WASMModule *module); | ||||||
|  | 
 | ||||||
|  | bool | ||||||
|  | wasm_resolve_import_func(const WASMModule *module, | ||||||
|  |                          WASMFunctionImport *function); | ||||||
|  | 
 | ||||||
| WASMModuleInstance * | WASMModuleInstance * | ||||||
| wasm_instantiate(WASMModule *module, WASMModuleInstance *parent, | wasm_instantiate(WASMModule *module, WASMModuleInstance *parent, | ||||||
|                  WASMExecEnv *exec_env_main, uint32 stack_size, |                  WASMExecEnv *exec_env_main, uint32 stack_size, | ||||||
|  | @ -539,13 +569,13 @@ wasm_set_running_mode(WASMModuleInstance *module_inst, | ||||||
| WASMFunctionInstance * | WASMFunctionInstance * | ||||||
| wasm_lookup_function(const WASMModuleInstance *module_inst, const char *name); | wasm_lookup_function(const WASMModuleInstance *module_inst, const char *name); | ||||||
| 
 | 
 | ||||||
|  | WASMMemoryInstance * | ||||||
|  | wasm_lookup_memory(const WASMModuleInstance *module_inst, const char *name); | ||||||
|  | 
 | ||||||
| #if WASM_ENABLE_MULTI_MODULE != 0 | #if WASM_ENABLE_MULTI_MODULE != 0 | ||||||
| WASMGlobalInstance * | WASMGlobalInstance * | ||||||
| wasm_lookup_global(const WASMModuleInstance *module_inst, const char *name); | wasm_lookup_global(const WASMModuleInstance *module_inst, const char *name); | ||||||
| 
 | 
 | ||||||
| WASMMemoryInstance * |  | ||||||
| wasm_lookup_memory(const WASMModuleInstance *module_inst, const char *name); |  | ||||||
| 
 |  | ||||||
| WASMTableInstance * | WASMTableInstance * | ||||||
| wasm_lookup_table(const WASMModuleInstance *module_inst, const char *name); | wasm_lookup_table(const WASMModuleInstance *module_inst, const char *name); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -6,7 +6,7 @@ set (LIB_PTHREAD_DIR ${CMAKE_CURRENT_LIST_DIR}) | ||||||
| add_definitions (-DWASM_ENABLE_LIB_PTHREAD=1) | add_definitions (-DWASM_ENABLE_LIB_PTHREAD=1) | ||||||
| 
 | 
 | ||||||
| if (WAMR_BUILD_LIB_PTHREAD_SEMAPHORE EQUAL 1) | if (WAMR_BUILD_LIB_PTHREAD_SEMAPHORE EQUAL 1) | ||||||
| add_definitions (-DWASM_ENABLE_LIB_PTHREAD_SEMAPHORE=1) |     add_definitions (-DWASM_ENABLE_LIB_PTHREAD_SEMAPHORE=1) | ||||||
| endif() | endif() | ||||||
| 
 | 
 | ||||||
| include_directories(${LIB_PTHREAD_DIR}) | include_directories(${LIB_PTHREAD_DIR}) | ||||||
|  |  | ||||||
|  | @ -7,8 +7,13 @@ | ||||||
| #include "bh_log.h" | #include "bh_log.h" | ||||||
| #include "wasm_export.h" | #include "wasm_export.h" | ||||||
| #include "../interpreter/wasm.h" | #include "../interpreter/wasm.h" | ||||||
| #if !defined(_DEFAULT_SOURCE) && !defined(BH_PLATFORM_LINUX_SGX) | 
 | ||||||
| #include "sys/syscall.h" | #if defined(__linux__) | ||||||
|  | #include <linux/version.h> | ||||||
|  | #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0) | ||||||
|  | #define HAVE_SYSCALL_GETRANDOM | ||||||
|  | #include <sys/syscall.h> | ||||||
|  | #endif | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /* clang-format off */ | /* clang-format off */ | ||||||
|  | @ -168,12 +173,21 @@ statbuf_native2app(const struct stat *statbuf_native, | ||||||
|     statbuf_app->st_blksize = (unsigned)statbuf_native->st_blksize; |     statbuf_app->st_blksize = (unsigned)statbuf_native->st_blksize; | ||||||
|     statbuf_app->st_blocks = (unsigned)statbuf_native->st_blocks; |     statbuf_app->st_blocks = (unsigned)statbuf_native->st_blocks; | ||||||
|     statbuf_app->st_ino = (int64)statbuf_native->st_ino; |     statbuf_app->st_ino = (int64)statbuf_native->st_ino; | ||||||
|  | #if defined(__APPLE__) | ||||||
|  |     statbuf_app->st_atim.tv_sec = (int)statbuf_native->st_atimespec.tv_sec; | ||||||
|  |     statbuf_app->st_atim.tv_nsec = (int)statbuf_native->st_atimespec.tv_nsec; | ||||||
|  |     statbuf_app->st_mtim.tv_sec = (int)statbuf_native->st_mtimespec.tv_sec; | ||||||
|  |     statbuf_app->st_mtim.tv_nsec = (int)statbuf_native->st_mtimespec.tv_nsec; | ||||||
|  |     statbuf_app->st_ctim.tv_sec = (int)statbuf_native->st_ctimespec.tv_sec; | ||||||
|  |     statbuf_app->st_ctim.tv_nsec = (int)statbuf_native->st_ctimespec.tv_nsec; | ||||||
|  | #else | ||||||
|     statbuf_app->st_atim.tv_sec = (int)statbuf_native->st_atim.tv_sec; |     statbuf_app->st_atim.tv_sec = (int)statbuf_native->st_atim.tv_sec; | ||||||
|     statbuf_app->st_atim.tv_nsec = (int)statbuf_native->st_atim.tv_nsec; |     statbuf_app->st_atim.tv_nsec = (int)statbuf_native->st_atim.tv_nsec; | ||||||
|     statbuf_app->st_mtim.tv_sec = (int)statbuf_native->st_mtim.tv_sec; |     statbuf_app->st_mtim.tv_sec = (int)statbuf_native->st_mtim.tv_sec; | ||||||
|     statbuf_app->st_mtim.tv_nsec = (int)statbuf_native->st_mtim.tv_nsec; |     statbuf_app->st_mtim.tv_nsec = (int)statbuf_native->st_mtim.tv_nsec; | ||||||
|     statbuf_app->st_ctim.tv_sec = (int)statbuf_native->st_ctim.tv_sec; |     statbuf_app->st_ctim.tv_sec = (int)statbuf_native->st_ctim.tv_sec; | ||||||
|     statbuf_app->st_ctim.tv_nsec = (int)statbuf_native->st_ctim.tv_nsec; |     statbuf_app->st_ctim.tv_nsec = (int)statbuf_native->st_ctim.tv_nsec; | ||||||
|  | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int | static int | ||||||
|  | @ -261,10 +275,10 @@ getentropy_wrapper(wasm_exec_env_t exec_env, void *buffer, uint32 length) | ||||||
| { | { | ||||||
|     if (buffer == NULL) |     if (buffer == NULL) | ||||||
|         return -1; |         return -1; | ||||||
| #if defined(_DEFAULT_SOURCE) || defined(BH_PLATFORM_LINUX_SGX) | #if defined(HAVE_SYSCALL_GETRANDOM) | ||||||
|     return getentropy(buffer, length); |  | ||||||
| #else |  | ||||||
|     return syscall(SYS_getrandom, buffer, length, 0); |     return syscall(SYS_getrandom, buffer, length, 0); | ||||||
|  | #else | ||||||
|  |     return getentropy(buffer, length); | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1022,8 +1022,8 @@ execute_interruptible_poll_oneoff( | ||||||
|     uint32 i; |     uint32 i; | ||||||
| 
 | 
 | ||||||
|     const __wasi_timestamp_t timeout = get_timeout_for_poll_oneoff( |     const __wasi_timestamp_t timeout = get_timeout_for_poll_oneoff( | ||||||
|                                  in, nsubscriptions), |                                  in, (uint32)nsubscriptions), | ||||||
|                              time_quant = 1e9; |                              time_quant = (__wasi_timestamp_t)1e9; | ||||||
|     const uint64 size_to_copy = |     const uint64 size_to_copy = | ||||||
|         nsubscriptions * (uint64)sizeof(wasi_subscription_t); |         nsubscriptions * (uint64)sizeof(wasi_subscription_t); | ||||||
|     __wasi_subscription_t *in_copy = NULL; |     __wasi_subscription_t *in_copy = NULL; | ||||||
|  | @ -1034,12 +1034,13 @@ execute_interruptible_poll_oneoff( | ||||||
|         return __WASI_ENOMEM; |         return __WASI_ENOMEM; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     bh_memcpy_s(in_copy, size_to_copy, in, size_to_copy); |     bh_memcpy_s(in_copy, (uint32)size_to_copy, in, (uint32)size_to_copy); | ||||||
| 
 | 
 | ||||||
|     while (timeout == (__wasi_timestamp_t)-1 || elapsed <= timeout) { |     while (timeout == (__wasi_timestamp_t)-1 || elapsed <= timeout) { | ||||||
|         /* update timeout for clock subscription events */ |         /* update timeout for clock subscription events */ | ||||||
|         update_clock_subscription_data( |         update_clock_subscription_data( | ||||||
|             in_copy, nsubscriptions, min_uint64(time_quant, timeout - elapsed)); |             in_copy, (uint32)nsubscriptions, | ||||||
|  |             min_uint64(time_quant, timeout - elapsed)); | ||||||
|         err = wasmtime_ssp_poll_oneoff(exec_env, curfds, in_copy, out, |         err = wasmtime_ssp_poll_oneoff(exec_env, curfds, in_copy, out, | ||||||
|                                        nsubscriptions, nevents); |                                        nsubscriptions, nevents); | ||||||
|         elapsed += time_quant; |         elapsed += time_quant; | ||||||
|  |  | ||||||
|  | @ -3130,7 +3130,7 @@ compare_address(const struct addr_pool *addr_pool_entry, | ||||||
|         } |         } | ||||||
|         addr_size = 16; |         addr_size = 16; | ||||||
|     } |     } | ||||||
|     max_addr_mask = addr_size * 8; |     max_addr_mask = (uint8)(addr_size * 8); | ||||||
| 
 | 
 | ||||||
|     /* IPv4 0.0.0.0 or IPv6 :: means any address */ |     /* IPv4 0.0.0.0 or IPv6 :: means any address */ | ||||||
|     if (basebuf[0] == 0 && !memcmp(basebuf, basebuf + 1, addr_size - 1)) { |     if (basebuf[0] == 0 && !memcmp(basebuf, basebuf + 1, addr_size - 1)) { | ||||||
|  |  | ||||||
|  | @ -132,6 +132,35 @@ refcount_release(struct refcount *r) | ||||||
| #error "Reference counter isn't implemented" | #error "Reference counter isn't implemented" | ||||||
| #endif /* end of __GNUC_PREREQ (4.7) */ | #endif /* end of __GNUC_PREREQ (4.7) */ | ||||||
| 
 | 
 | ||||||
|  | #elif defined(_MSC_VER) | ||||||
|  | 
 | ||||||
|  | /* Simple reference counter. */ | ||||||
|  | struct LOCKABLE refcount { | ||||||
|  |     LONG count; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* Initialize the reference counter. */ | ||||||
|  | static inline void | ||||||
|  | refcount_init(struct refcount *r, unsigned int count) | ||||||
|  | { | ||||||
|  |     InterlockedExchange(&r->count, (LONG)count); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Increment the reference counter. */ | ||||||
|  | static inline void | ||||||
|  | refcount_acquire(struct refcount *r) | ||||||
|  | { | ||||||
|  |     InterlockedIncrement(&r->count); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Decrement the reference counter, returning whether the reference
 | ||||||
|  |    dropped to zero. */ | ||||||
|  | static inline bool | ||||||
|  | refcount_release(struct refcount *r) | ||||||
|  | { | ||||||
|  |     return InterlockedDecrement(&r->count) == 0 ? true : false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #else /* else of CONFIG_HAS_STD_ATOMIC */ | #else /* else of CONFIG_HAS_STD_ATOMIC */ | ||||||
| #error "Reference counter isn't implemented" | #error "Reference counter isn't implemented" | ||||||
| #endif /* end of CONFIG_HAS_STD_ATOMIC */ | #endif /* end of CONFIG_HAS_STD_ATOMIC */ | ||||||
|  |  | ||||||
|  | @ -70,9 +70,11 @@ | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #if !defined(BH_PLATFORM_LINUX_SGX) | #if !defined(BH_PLATFORM_LINUX_SGX) | ||||||
|  | 
 | ||||||
| /* Clang's __GNUC_PREREQ macro has a different meaning than GCC one,
 | /* Clang's __GNUC_PREREQ macro has a different meaning than GCC one,
 | ||||||
| so we have to handle this case specially */ | so we have to handle this case specially */ | ||||||
| #if defined(__clang__) | #if defined(__clang__) | ||||||
|  | 
 | ||||||
| /* Clang provides stdatomic.h since 3.6.0
 | /* Clang provides stdatomic.h since 3.6.0
 | ||||||
| See https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html */
 | See https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html */
 | ||||||
| #if __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 6) | #if __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 6) | ||||||
|  | @ -80,7 +82,9 @@ See https://releases.llvm.org/3.6.0/tools/clang/docs/ReleaseNotes.html */ | ||||||
| #else | #else | ||||||
| #define CONFIG_HAS_STD_ATOMIC 0 | #define CONFIG_HAS_STD_ATOMIC 0 | ||||||
| #endif | #endif | ||||||
|  | 
 | ||||||
| #elif defined(__GNUC_PREREQ) | #elif defined(__GNUC_PREREQ) | ||||||
|  | 
 | ||||||
| /* Even though older versions of GCC support C11, atomics were
 | /* Even though older versions of GCC support C11, atomics were
 | ||||||
| not implemented until 4.9. See | not implemented until 4.9. See | ||||||
| https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58016 */
 | https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58016 */
 | ||||||
|  | @ -89,11 +93,21 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58016 */ | ||||||
| #else /* else of __GNUC_PREREQ(4, 9) */ | #else /* else of __GNUC_PREREQ(4, 9) */ | ||||||
| #define CONFIG_HAS_STD_ATOMIC 0 | #define CONFIG_HAS_STD_ATOMIC 0 | ||||||
| #endif /* end of __GNUC_PREREQ(4, 9) */ | #endif /* end of __GNUC_PREREQ(4, 9) */ | ||||||
| #else  /* else of defined(__GNUC_PREREQ) */ | 
 | ||||||
| #define CONFIG_HAS_STD_ATOMIC 1 | #elif defined(_MSC_VER) | ||||||
| #endif /* end of defined(__GNUC_PREREQ) */ | 
 | ||||||
| #else  /* else of !defined(BH_PLATFORM_LINUX_SGX) */ |  | ||||||
| #define CONFIG_HAS_STD_ATOMIC 0 | #define CONFIG_HAS_STD_ATOMIC 0 | ||||||
|  | 
 | ||||||
|  | #else | ||||||
|  | 
 | ||||||
|  | #define CONFIG_HAS_STD_ATOMIC 1 | ||||||
|  | 
 | ||||||
|  | #endif /* end of defined(__clang__) */ | ||||||
|  | 
 | ||||||
|  | #else /* else of !defined(BH_PLATFORM_LINUX_SGX) */ | ||||||
|  | 
 | ||||||
|  | #define CONFIG_HAS_STD_ATOMIC 0 | ||||||
|  | 
 | ||||||
| #endif /* end of !defined(BH_PLATFORM_LINUX_SGX) */ | #endif /* end of !defined(BH_PLATFORM_LINUX_SGX) */ | ||||||
| 
 | 
 | ||||||
| #endif | #endif /* end of SSP_CONFIG_H */ | ||||||
|  |  | ||||||
							
								
								
									
										8
									
								
								core/iwasm/libraries/shared-heap/shared_heap.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								core/iwasm/libraries/shared-heap/shared_heap.cmake
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,8 @@ | ||||||
|  | # Copyright (C) 2024 Xiaomi Corporation.  All rights reserved. | ||||||
|  | # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||||||
|  | 
 | ||||||
|  | set (LIB_SHARED_HEAP ${CMAKE_CURRENT_LIST_DIR}) | ||||||
|  | add_definitions (-DWASM_ENABLE_SHARED_HEAP=1) | ||||||
|  | include_directories(${LIB_SHARED_HEAP_DIR}) | ||||||
|  | file (GLOB source_all ${LIB_SHARED_HEAP}/*.c) | ||||||
|  | set (LIB_SHARED_HEAP_SOURCE ${source_all}) | ||||||
							
								
								
									
										57
									
								
								core/iwasm/libraries/shared-heap/shared_heap_wrapper.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								core/iwasm/libraries/shared-heap/shared_heap_wrapper.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,57 @@ | ||||||
|  | /*
 | ||||||
|  |  * Copyright (C) 2024 Xiaomi Corporation.  All rights reserved. | ||||||
|  |  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "bh_common.h" | ||||||
|  | #include "bh_log.h" | ||||||
|  | #include "wasm_export.h" | ||||||
|  | #include "../interpreter/wasm.h" | ||||||
|  | #include "../common/wasm_runtime_common.h" | ||||||
|  | /* clang-format off */ | ||||||
|  | #define validate_native_addr(addr, size) \ | ||||||
|  |     wasm_runtime_validate_native_addr(module_inst, addr, size) | ||||||
|  | 
 | ||||||
|  | #define module_shared_malloc(size, p_native_addr) \ | ||||||
|  |     wasm_runtime_shared_heap_malloc(module_inst, size, p_native_addr) | ||||||
|  | 
 | ||||||
|  | #define module_shared_free(offset) \ | ||||||
|  |     wasm_runtime_shared_heap_free(module_inst, offset) | ||||||
|  | /* clang-format on */ | ||||||
|  | 
 | ||||||
|  | static uint32 | ||||||
|  | shared_heap_malloc_wrapper(wasm_exec_env_t exec_env, uint32 size) | ||||||
|  | { | ||||||
|  |     wasm_module_inst_t module_inst = get_module_inst(exec_env); | ||||||
|  |     return (uint32)module_shared_malloc((uint64)size, NULL); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void | ||||||
|  | shared_heap_free_wrapper(wasm_exec_env_t exec_env, void *ptr) | ||||||
|  | { | ||||||
|  |     wasm_module_inst_t module_inst = get_module_inst(exec_env); | ||||||
|  | 
 | ||||||
|  |     if (!validate_native_addr(ptr, (uint64)sizeof(uintptr_t))) { | ||||||
|  |         LOG_WARNING("Invalid app address"); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     module_shared_free(addr_native_to_app(ptr)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* clang-format off */ | ||||||
|  | #define REG_NATIVE_FUNC(func_name, signature) \ | ||||||
|  |     { #func_name, func_name##_wrapper, signature, NULL } | ||||||
|  | /* clang-format on */ | ||||||
|  | 
 | ||||||
|  | static NativeSymbol native_symbols_shared_heap[] = { | ||||||
|  |     REG_NATIVE_FUNC(shared_heap_malloc, "(i)i"), | ||||||
|  |     REG_NATIVE_FUNC(shared_heap_free, "(*)"), | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | uint32 | ||||||
|  | get_lib_shared_heap_export_apis(NativeSymbol **p_shared_heap_apis) | ||||||
|  | { | ||||||
|  |     *p_shared_heap_apis = native_symbols_shared_heap; | ||||||
|  |     return sizeof(native_symbols_shared_heap) / sizeof(NativeSymbol); | ||||||
|  | } | ||||||
|  | @ -1402,6 +1402,82 @@ wasm_cluster_spread_custom_data(WASMModuleInstanceCommon *module_inst, | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  | static void | ||||||
|  | attach_shared_heap_visitor(void *node, void *heap) | ||||||
|  | { | ||||||
|  |     WASMExecEnv *curr_exec_env = (WASMExecEnv *)node; | ||||||
|  |     WASMModuleInstanceCommon *module_inst = get_module_inst(curr_exec_env); | ||||||
|  | 
 | ||||||
|  |     wasm_runtime_attach_shared_heap_internal(module_inst, heap); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void | ||||||
|  | detach_shared_heap_visitor(void *node, void *heap) | ||||||
|  | { | ||||||
|  |     WASMExecEnv *curr_exec_env = (WASMExecEnv *)node; | ||||||
|  |     WASMModuleInstanceCommon *module_inst = get_module_inst(curr_exec_env); | ||||||
|  | 
 | ||||||
|  |     (void)heap; | ||||||
|  |     wasm_runtime_detach_shared_heap_internal(module_inst); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool | ||||||
|  | wasm_cluster_attach_shared_heap(WASMModuleInstanceCommon *module_inst, | ||||||
|  |                                 WASMSharedHeap *heap) | ||||||
|  | { | ||||||
|  |     WASMExecEnv *exec_env = wasm_clusters_search_exec_env(module_inst); | ||||||
|  | 
 | ||||||
|  |     if (exec_env == NULL) { | ||||||
|  |         /* Maybe threads have not been started yet. */ | ||||||
|  |         return wasm_runtime_attach_shared_heap_internal(module_inst, heap); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         WASMCluster *cluster; | ||||||
|  | 
 | ||||||
|  |         cluster = wasm_exec_env_get_cluster(exec_env); | ||||||
|  |         bh_assert(cluster); | ||||||
|  | 
 | ||||||
|  |         os_mutex_lock(&cluster->lock); | ||||||
|  |         /* Try attaching shared heap to this module instance first
 | ||||||
|  |            to ensure that we can attach it to all other instances. */ | ||||||
|  |         if (!wasm_runtime_attach_shared_heap_internal(module_inst, heap)) { | ||||||
|  |             os_mutex_unlock(&cluster->lock); | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         /* Detach the shared heap so it can be attached again. */ | ||||||
|  |         wasm_runtime_detach_shared_heap_internal(module_inst); | ||||||
|  |         traverse_list(&cluster->exec_env_list, attach_shared_heap_visitor, | ||||||
|  |                       heap); | ||||||
|  |         os_mutex_unlock(&cluster->lock); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | wasm_cluster_detach_shared_heap(WASMModuleInstanceCommon *module_inst) | ||||||
|  | { | ||||||
|  |     WASMExecEnv *exec_env = wasm_clusters_search_exec_env(module_inst); | ||||||
|  | 
 | ||||||
|  |     if (exec_env == NULL) { | ||||||
|  |         /* Maybe threads have not been started yet. */ | ||||||
|  |         wasm_runtime_detach_shared_heap_internal(module_inst); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         WASMCluster *cluster; | ||||||
|  | 
 | ||||||
|  |         cluster = wasm_exec_env_get_cluster(exec_env); | ||||||
|  |         bh_assert(cluster); | ||||||
|  | 
 | ||||||
|  |         os_mutex_lock(&cluster->lock); | ||||||
|  |         traverse_list(&cluster->exec_env_list, detach_shared_heap_visitor, | ||||||
|  |                       NULL); | ||||||
|  |         os_mutex_unlock(&cluster->lock); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #if WASM_ENABLE_MODULE_INST_CONTEXT != 0 | #if WASM_ENABLE_MODULE_INST_CONTEXT != 0 | ||||||
| struct inst_set_context_data { | struct inst_set_context_data { | ||||||
|     void *key; |     void *key; | ||||||
|  |  | ||||||
|  | @ -11,6 +11,9 @@ | ||||||
| #include "wasm_export.h" | #include "wasm_export.h" | ||||||
| #include "../interpreter/wasm.h" | #include "../interpreter/wasm.h" | ||||||
| #include "../common/wasm_runtime_common.h" | #include "../common/wasm_runtime_common.h" | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  | #include "../common/wasm_memory.h" | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| extern "C" { | extern "C" { | ||||||
|  | @ -167,6 +170,15 @@ wasm_cluster_set_context(WASMModuleInstanceCommon *module_inst, void *key, | ||||||
| bool | bool | ||||||
| wasm_cluster_is_thread_terminated(WASMExecEnv *exec_env); | wasm_cluster_is_thread_terminated(WASMExecEnv *exec_env); | ||||||
| 
 | 
 | ||||||
|  | #if WASM_ENABLE_SHARED_HEAP != 0 | ||||||
|  | bool | ||||||
|  | wasm_cluster_attach_shared_heap(WASMModuleInstanceCommon *module_inst, | ||||||
|  |                                 WASMSharedHeap *heap); | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | wasm_cluster_detach_shared_heap(WASMModuleInstanceCommon *module_inst); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #if WASM_ENABLE_DEBUG_INTERP != 0 | #if WASM_ENABLE_DEBUG_INTERP != 0 | ||||||
| #define WAMR_SIG_TRAP (5) | #define WAMR_SIG_TRAP (5) | ||||||
| #define WAMR_SIG_STOP (19) | #define WAMR_SIG_STOP (19) | ||||||
|  |  | ||||||
|  | @ -103,7 +103,6 @@ docker run \ | ||||||
|     wasi-nn-cpu \ |     wasi-nn-cpu \ | ||||||
|     --dir=/ \ |     --dir=/ \ | ||||||
|     --env="TARGET=cpu" \ |     --env="TARGET=cpu" \ | ||||||
|     --native-lib=/lib/libwasi-nn-tflite.so \ |  | ||||||
|     /assets/test_tensorflow.wasm |     /assets/test_tensorflow.wasm | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
|  | @ -119,7 +118,6 @@ docker run \ | ||||||
|     wasi-nn-nvidia-gpu \ |     wasi-nn-nvidia-gpu \ | ||||||
|     --dir=/ \ |     --dir=/ \ | ||||||
|     --env="TARGET=gpu" \ |     --env="TARGET=gpu" \ | ||||||
|     --native-lib=/lib/libwasi-nn-tflite.so \ |  | ||||||
|     /assets/test_tensorflow.wasm |     /assets/test_tensorflow.wasm | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
|  | @ -131,7 +129,6 @@ docker run \ | ||||||
|     wasi-nn-vx-delegate \ |     wasi-nn-vx-delegate \ | ||||||
|     --dir=/ \ |     --dir=/ \ | ||||||
|     --env="TARGET=gpu" \ |     --env="TARGET=gpu" \ | ||||||
|     --native-lib=/lib/libwasi-nn-tflite.so \ |  | ||||||
|     /assets/test_tensorflow_quantized.wasm |     /assets/test_tensorflow_quantized.wasm | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
|  | @ -147,7 +144,6 @@ docker run \ | ||||||
|     wasi-nn-tpu \ |     wasi-nn-tpu \ | ||||||
|     --dir=/ \ |     --dir=/ \ | ||||||
|     --env="TARGET=tpu" \ |     --env="TARGET=tpu" \ | ||||||
|     --native-lib=/lib/libwasi-nn-tflite.so \ |  | ||||||
|     /assets/test_tensorflow_quantized.wasm |     /assets/test_tensorflow_quantized.wasm | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
|  | @ -155,8 +151,8 @@ docker run \ | ||||||
| 
 | 
 | ||||||
| Supported: | Supported: | ||||||
| 
 | 
 | ||||||
| - Graph encoding: `tensorflowlite`. | - Graph encoding: `tensorflowlite`, `openvino` and `ggml` | ||||||
| - Execution target: `cpu`, `gpu` and `tpu`. | - Execution target: `cpu` for all. `gpu` and `tpu` for `tensorflowlite`. | ||||||
| - Tensor type: `fp32`. | - Tensor type: `fp32`. | ||||||
| 
 | 
 | ||||||
| ## Smoke test | ## Smoke test | ||||||
|  |  | ||||||
|  | @ -4,13 +4,21 @@ | ||||||
| include(FetchContent) | include(FetchContent) | ||||||
| 
 | 
 | ||||||
| set(CJSON_SOURCE_DIR "${WAMR_ROOT_DIR}/core/deps/cjson") | set(CJSON_SOURCE_DIR "${WAMR_ROOT_DIR}/core/deps/cjson") | ||||||
| 
 | if(EXISTS ${CJSON_SOURCE_DIR}) | ||||||
| FetchContent_Declare( |   message("Use existed source code under ${CJSON_SOURCE_DIR}") | ||||||
|  |   FetchContent_Declare( | ||||||
|  |     cjson | ||||||
|  |     SOURCE_DIR     ${CJSON_SOURCE_DIR} | ||||||
|  |   ) | ||||||
|  | else() | ||||||
|  |   message("download source code and store it at ${CJSON_SOURCE_DIR}") | ||||||
|  |   FetchContent_Declare( | ||||||
|     cjson |     cjson | ||||||
|     GIT_REPOSITORY https://github.com/DaveGamble/cJSON.git |     GIT_REPOSITORY https://github.com/DaveGamble/cJSON.git | ||||||
|     GIT_TAG        v1.7.18 |     GIT_TAG        v1.7.18 | ||||||
|     SOURCE_DIR     ${CJSON_SOURCE_DIR} |     SOURCE_DIR     ${CJSON_SOURCE_DIR} | ||||||
| ) |   ) | ||||||
|  | endif() | ||||||
| 
 | 
 | ||||||
| set(ENABLE_CJSON_TEST OFF CACHE INTERNAL "Turn off tests") | set(ENABLE_CJSON_TEST OFF CACHE INTERNAL "Turn off tests") | ||||||
| set(ENABLE_CJSON_UNINSTALL OFF CACHE INTERNAL "Turn off uninstall to avoid targets conflict") | set(ENABLE_CJSON_UNINSTALL OFF CACHE INTERNAL "Turn off uninstall to avoid targets conflict") | ||||||
|  |  | ||||||
|  | @ -4,13 +4,21 @@ | ||||||
| include(FetchContent) | include(FetchContent) | ||||||
| 
 | 
 | ||||||
| set(LLAMA_SOURCE_DIR "${WAMR_ROOT_DIR}/core/deps/llama.cpp") | set(LLAMA_SOURCE_DIR "${WAMR_ROOT_DIR}/core/deps/llama.cpp") | ||||||
| 
 | if(EXISTS ${LLAMA_SOURCE_DIR}) | ||||||
| FetchContent_Declare( |   message("Use existed source code under ${LLAMA_SOURCE_DIR}") | ||||||
|  |   FetchContent_Declare( | ||||||
|  |     llamacpp | ||||||
|  |     SOURCE_DIR     ${LLAMA_SOURCE_DIR} | ||||||
|  |   ) | ||||||
|  | else() | ||||||
|  |   message("download source code and store it at ${LLAMA_SOURCE_DIR}") | ||||||
|  |   FetchContent_Declare( | ||||||
|     llamacpp |     llamacpp | ||||||
|     GIT_REPOSITORY https://github.com/ggerganov/llama.cpp.git |     GIT_REPOSITORY https://github.com/ggerganov/llama.cpp.git | ||||||
|     GIT_TAG        b3573 |     GIT_TAG        b3573 | ||||||
|     SOURCE_DIR     ${LLAMA_SOURCE_DIR} |     SOURCE_DIR     ${LLAMA_SOURCE_DIR} | ||||||
| ) |   ) | ||||||
|  | endif() | ||||||
| 
 | 
 | ||||||
| set(LLAMA_BUILD_TESTS OFF) | set(LLAMA_BUILD_TESTS OFF) | ||||||
| set(LLAMA_BUILD_EXAMPLES OFF) | set(LLAMA_BUILD_EXAMPLES OFF) | ||||||
|  |  | ||||||
|  | @ -4,8 +4,16 @@ | ||||||
| include(FetchContent) | include(FetchContent) | ||||||
| 
 | 
 | ||||||
| set(TFLITE_SOURCE_DIR "${WAMR_ROOT_DIR}/core/deps/tensorflow-src") | set(TFLITE_SOURCE_DIR "${WAMR_ROOT_DIR}/core/deps/tensorflow-src") | ||||||
| 
 | if(EXISTS ${TFLITE_SOURCE_DIR}) | ||||||
| FetchContent_Declare( |   message("Use existed source code under ${TFLITE_SOURCE_DIR}") | ||||||
|  |   FetchContent_Declare( | ||||||
|  |     tensorflow_lite | ||||||
|  |     SOURCE_DIR     ${TFLITE_SOURCE_DIR} | ||||||
|  |     SOURCE_SUBDIR  tensorflow/lite | ||||||
|  |   ) | ||||||
|  | else() | ||||||
|  |   message("download source code and store it at ${TFLITE_SOURCE_DIR}") | ||||||
|  |   FetchContent_Declare( | ||||||
|     tensorflow_lite |     tensorflow_lite | ||||||
|     GIT_REPOSITORY https://github.com/tensorflow/tensorflow.git |     GIT_REPOSITORY https://github.com/tensorflow/tensorflow.git | ||||||
|     GIT_TAG        v2.12.0 |     GIT_TAG        v2.12.0 | ||||||
|  | @ -13,11 +21,15 @@ FetchContent_Declare( | ||||||
|     GIT_PROGRESS   ON |     GIT_PROGRESS   ON | ||||||
|     SOURCE_DIR     ${TFLITE_SOURCE_DIR} |     SOURCE_DIR     ${TFLITE_SOURCE_DIR} | ||||||
|     SOURCE_SUBDIR  tensorflow/lite |     SOURCE_SUBDIR  tensorflow/lite | ||||||
| ) |     PATCH_COMMAND  git apply ${CMAKE_CURRENT_LIST_DIR}/add_telemetry.patch | ||||||
|  |   ) | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| if(WAMR_BUILD_WASI_NN_ENABLE_GPU EQUAL 1) | if(WAMR_BUILD_WASI_NN_ENABLE_GPU EQUAL 1) | ||||||
|   set(TFLITE_ENABLE_GPU ON) |   set(TFLITE_ENABLE_GPU ON) | ||||||
| endif() | endif() | ||||||
|  | 
 | ||||||
| if (CMAKE_SIZEOF_VOID_P EQUAL 4) | if (CMAKE_SIZEOF_VOID_P EQUAL 4) | ||||||
|   set(TFLITE_ENABLE_XNNPACK OFF) |   set(TFLITE_ENABLE_XNNPACK OFF) | ||||||
| endif() | endif() | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								core/iwasm/libraries/wasi-nn/cmake/add_telemetry.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								core/iwasm/libraries/wasi-nn/cmake/add_telemetry.patch
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | ||||||
|  | diff --git a/tensorflow/lite/CMakeLists.txt b/tensorflow/lite/CMakeLists.txt
 | ||||||
|  | index c71a3925ac..39591a3bd7 100644
 | ||||||
|  | --- a/tensorflow/lite/CMakeLists.txt
 | ||||||
|  | +++ b/tensorflow/lite/CMakeLists.txt
 | ||||||
|  | @@ -493,6 +493,7 @@ set(TFLITE_PROFILER_SRCS
 | ||||||
|  |    ${TFLITE_SOURCE_DIR}/profiling/root_profiler.h | ||||||
|  |    ${TFLITE_SOURCE_DIR}/profiling/root_profiler.cc | ||||||
|  |    ${TFLITE_SOURCE_DIR}/profiling/telemetry/profiler.cc | ||||||
|  | +  ${TFLITE_SOURCE_DIR}/profiling/telemetry/telemetry.cc
 | ||||||
|  |  ) | ||||||
|  |  if(CMAKE_SYSTEM_NAME MATCHES "Android") | ||||||
|  |    list(APPEND TFLITE_PROFILER_SRCS | ||||||
|  | @ -14,19 +14,32 @@ WORKDIR /usr/local/share/ca-certificates/cacert.org | ||||||
| RUN wget -qP /usr/local/share/ca-certificates/cacert.org http://www.cacert.org/certs/root.crt http://www.cacert.org/certs/class3.crt \ | RUN wget -qP /usr/local/share/ca-certificates/cacert.org http://www.cacert.org/certs/root.crt http://www.cacert.org/certs/class3.crt \ | ||||||
|   && update-ca-certificates |   && update-ca-certificates | ||||||
| 
 | 
 | ||||||
|  | # need a newer cmake | ||||||
|  | RUN apt-get purge -y cmake | ||||||
|  | 
 | ||||||
|  | ARG CMAKE_VER=3.27.0 | ||||||
|  | RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VER}/cmake-${CMAKE_VER}-Linux-x86_64.sh \ | ||||||
|  |   -q -O /tmp/cmake-install.sh \ | ||||||
|  |   && chmod u+x /tmp/cmake-install.sh \ | ||||||
|  |   && mkdir /opt/cmake-${CMAKE_VER} \ | ||||||
|  |   && /tmp/cmake-install.sh --skip-license --prefix=/opt/cmake-${CMAKE_VER} \ | ||||||
|  |   && rm /tmp/cmake-install.sh \ | ||||||
|  |   && ln -s /opt/cmake-${CMAKE_VER}/bin/* /usr/local/bin | ||||||
|  | 
 | ||||||
| WORKDIR /home/wamr | WORKDIR /home/wamr | ||||||
| COPY . . | COPY . . | ||||||
| RUN git config --global http.sslCAinfo /etc/ssl/certs/ca-certificates.crt | RUN git config --global http.sslCAinfo /etc/ssl/certs/ca-certificates.crt | ||||||
| 
 | 
 | ||||||
| WORKDIR /home/wamr/product-mini/platforms/linux | WORKDIR /home/wamr/product-mini/platforms/linux | ||||||
| RUN rm -rf build \ | RUN rm -rf build \ | ||||||
|   && cmake -S . -B build -DWAMR_BUILD_WASI_NN=1 \ |   && cmake -S . -B build\ | ||||||
|  |        -DWAMR_BUILD_WASI_NN=1 -DWAMR_BUILD_WASI_NN_TFLITE=1\ | ||||||
|   && cmake --build build -j "$(grep -c ^processor /proc/cpuinfo)" |   && cmake --build build -j "$(grep -c ^processor /proc/cpuinfo)" | ||||||
| 
 | 
 | ||||||
| FROM ubuntu:22.04 | FROM ubuntu:22.04 | ||||||
| 
 | 
 | ||||||
| COPY --from=base /home/wamr/product-mini/platforms/linux/build/iwasm /usr/bin/iwasm | COPY --from=base /home/wamr/product-mini/platforms/linux/build/iwasm /usr/bin | ||||||
| COPY --from=base /home/wamr/product-mini/platforms/linux/build/libiwasm.so /lib/libiwasm.so | COPY --from=base /home/wamr/product-mini/platforms/linux/build/lib*.so /usr/lib | ||||||
| COPY --from=base /home/wamr/product-mini/platforms/linux/build/libwasi-nn-*.so /lib/ | ENV LD_LIBRARY_PATH=/usr/lib | ||||||
| 
 | 
 | ||||||
| ENTRYPOINT [ "iwasm" ] | ENTRYPOINT [ "iwasm" ] | ||||||
|  |  | ||||||
|  | @ -14,14 +14,26 @@ WORKDIR /usr/local/share/ca-certificates/cacert.org | ||||||
| RUN wget -qP /usr/local/share/ca-certificates/cacert.org http://www.cacert.org/certs/root.crt http://www.cacert.org/certs/class3.crt \ | RUN wget -qP /usr/local/share/ca-certificates/cacert.org http://www.cacert.org/certs/root.crt http://www.cacert.org/certs/class3.crt \ | ||||||
|   && update-ca-certificates |   && update-ca-certificates | ||||||
| 
 | 
 | ||||||
|  | # need a newer cmake | ||||||
|  | RUN apt-get purge -y cmake | ||||||
|  | 
 | ||||||
|  | ARG CMAKE_VER=3.27.0 | ||||||
|  | RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VER}/cmake-${CMAKE_VER}-Linux-x86_64.sh \ | ||||||
|  |   -q -O /tmp/cmake-install.sh \ | ||||||
|  |   && chmod u+x /tmp/cmake-install.sh \ | ||||||
|  |   && mkdir /opt/cmake-${CMAKE_VER} \ | ||||||
|  |   && /tmp/cmake-install.sh --skip-license --prefix=/opt/cmake-${CMAKE_VER} \ | ||||||
|  |   && rm /tmp/cmake-install.sh \ | ||||||
|  |   && ln -s /opt/cmake-${CMAKE_VER}/bin/* /usr/local/bin | ||||||
|  | 
 | ||||||
| WORKDIR /home/wamr | WORKDIR /home/wamr | ||||||
| COPY . . | COPY . . | ||||||
| RUN git config --global http.sslCAinfo /etc/ssl/certs/ca-certificates.crt | RUN git config --global http.sslCAinfo /etc/ssl/certs/ca-certificates.crt | ||||||
| 
 | 
 | ||||||
| WORKDIR /home/wamr/product-mini/platforms/linux/build | WORKDIR /home/wamr/product-mini/platforms/linux | ||||||
| RUN rm -rf build \ | RUN rm -rf build \ | ||||||
|   && cmake -S . -B build \ |   && cmake -S . -B build \ | ||||||
|        -DWAMR_BUILD_WASI_NN=1 \ |        -DWAMR_BUILD_WASI_NN=1 -DWAMR_BUILD_WASI_NN_TFLITE=1\ | ||||||
|        -DWAMR_BUILD_WASI_NN_ENABLE_GPU=1 \ |        -DWAMR_BUILD_WASI_NN_ENABLE_GPU=1 \ | ||||||
|   && cmake --build build -j "$(grep -c ^processor /proc/cpuinfo)" |   && cmake --build build -j "$(grep -c ^processor /proc/cpuinfo)" | ||||||
| 
 | 
 | ||||||
|  | @ -40,8 +52,8 @@ RUN mkdir -p /etc/OpenCL/vendors && \ | ||||||
| ENV NVIDIA_VISIBLE_DEVICES=all | ENV NVIDIA_VISIBLE_DEVICES=all | ||||||
| ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility | ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility | ||||||
| 
 | 
 | ||||||
| COPY --from=base /home/wamr/product-mini/platforms/linux/build/iwasm /usr/bin/iwasm | COPY --from=base /home/wamr/product-mini/platforms/linux/build/iwasm /usr/bin | ||||||
| COPY --from=base /home/wamr/product-mini/platforms/linux/build/libiwasm.so /lib/libiwasm.so | COPY --from=base /home/wamr/product-mini/platforms/linux/build/lib*.so /usr/lib | ||||||
| COPY --from=base /home/wamr/product-mini/platforms/linux/build/libwasi-nn-*.so /lib/ | ENV LD_LIBRARY_PATH=/usr/lib | ||||||
| 
 | 
 | ||||||
| ENTRYPOINT [ "iwasm" ] | ENTRYPOINT [ "iwasm" ] | ||||||
|  |  | ||||||
|  | @ -14,22 +14,35 @@ WORKDIR /usr/local/share/ca-certificates/cacert.org | ||||||
| RUN wget -qP /usr/local/share/ca-certificates/cacert.org http://www.cacert.org/certs/root.crt http://www.cacert.org/certs/class3.crt \ | RUN wget -qP /usr/local/share/ca-certificates/cacert.org http://www.cacert.org/certs/root.crt http://www.cacert.org/certs/class3.crt \ | ||||||
|   && update-ca-certificates |   && update-ca-certificates | ||||||
| 
 | 
 | ||||||
|  | # need a newer cmake | ||||||
|  | RUN apt-get purge -y cmake | ||||||
|  | 
 | ||||||
|  | ARG CMAKE_VER=3.27.0 | ||||||
|  | RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VER}/cmake-${CMAKE_VER}-Linux-x86_64.sh \ | ||||||
|  |   -q -O /tmp/cmake-install.sh \ | ||||||
|  |   && chmod u+x /tmp/cmake-install.sh \ | ||||||
|  |   && mkdir /opt/cmake-${CMAKE_VER} \ | ||||||
|  |   && /tmp/cmake-install.sh --skip-license --prefix=/opt/cmake-${CMAKE_VER} \ | ||||||
|  |   && rm /tmp/cmake-install.sh \ | ||||||
|  |   && ln -s /opt/cmake-${CMAKE_VER}/bin/* /usr/local/bin | ||||||
|  | 
 | ||||||
| WORKDIR /home/wamr | WORKDIR /home/wamr | ||||||
| COPY . . | COPY . . | ||||||
| RUN git config --global http.sslCAinfo /etc/ssl/certs/ca-certificates.crt | RUN git config --global http.sslCAinfo /etc/ssl/certs/ca-certificates.crt | ||||||
| 
 | 
 | ||||||
| WORKDIR /home/wamr/product-mini/platforms/linux | WORKDIR /home/wamr/product-mini/platforms/linux | ||||||
| RUN rm -rf build \ | RUN rm -rf build \ | ||||||
|   && cmake -S . -B build -DWAMR_BUILD_WASI_NN=1 \ |   && cmake -S . -B build\ | ||||||
|     -DWAMR_BUILD_WASI_NN=1 \ |     -DWAMR_BUILD_WASI_NN=1\ | ||||||
|  |     -DWAMR_BUILD_WASI_NN_TFLITE=1\ | ||||||
|     -DWAMR_BUILD_WASI_NN_ENABLE_EXTERNAL_DELEGATE=1 \ |     -DWAMR_BUILD_WASI_NN_ENABLE_EXTERNAL_DELEGATE=1 \ | ||||||
|     -DWAMR_BUILD_WASI_NN_EXTERNAL_DELEGATE_PATH="libedgetpu.so.1.0" \ |     -DWAMR_BUILD_WASI_NN_EXTERNAL_DELEGATE_PATH="libedgetpu.so.1.0" \ | ||||||
|     -DWAMR_BUILD_WASI_NN_ENABLE_GPU=1 \ |     -DWAMR_BUILD_WASI_NN_ENABLE_GPU=1 \ | ||||||
|   && cmake --build build -j "$(grep -c ^processor /proc/cpuinfo)" |   && cmake --build build -j "$(grep -c ^processor /proc/cpuinfo)" | ||||||
| 
 | 
 | ||||||
| RUN cp /home/wamr/product-mini/platforms/linux/build/iwasm /usr/bin/iwasm \ | RUN cp /home/wamr/core/iwasm/libraries/wasi-nn/test/build/iwasm /run/iwasm \ | ||||||
|   && cp /home/wamr/product-mini/platforms/linux/build/libiwasm.so /lib/libiwasm.so \ |   && cp /home/wamr/product-mini/platforms/linux/build/lib*.so /usr/lib | ||||||
|   && cp /home/wamr/product-mini/platforms/linux/build/libwasi-nn-*.so /lib/ | ENV LD_LIBRARY_PATH=/usr/lib | ||||||
| 
 | 
 | ||||||
| WORKDIR /assets | WORKDIR /assets | ||||||
| ENTRYPOINT [ "iwasm" ] | ENTRYPOINT [ "iwasm" ] | ||||||
|  |  | ||||||
|  | @ -21,6 +21,18 @@ RUN apt-get update && apt-get install -y wget ca-certificates --no-install-recom | ||||||
|     && update-ca-certificates \ |     && update-ca-certificates \ | ||||||
|     && git config --global http.sslCAinfo /etc/ssl/certs/ca-certificates.crt |     && git config --global http.sslCAinfo /etc/ssl/certs/ca-certificates.crt | ||||||
| 
 | 
 | ||||||
|  | # need a newer cmake | ||||||
|  | RUN apt-get purge -y cmake | ||||||
|  | 
 | ||||||
|  | ARG CMAKE_VER=3.27.0 | ||||||
|  | RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VER}/cmake-${CMAKE_VER}-Linux-x86_64.sh \ | ||||||
|  |   -q -O /tmp/cmake-install.sh \ | ||||||
|  |   && chmod u+x /tmp/cmake-install.sh \ | ||||||
|  |   && mkdir /opt/cmake-${CMAKE_VER} \ | ||||||
|  |   && /tmp/cmake-install.sh --skip-license --prefix=/opt/cmake-${CMAKE_VER} \ | ||||||
|  |   && rm /tmp/cmake-install.sh \ | ||||||
|  |   && ln -s /opt/cmake-${CMAKE_VER}/bin/* /usr/local/bin | ||||||
|  | 
 | ||||||
| # Build TensorFlow Lite VX delegate default built for x86-64 simulator | # Build TensorFlow Lite VX delegate default built for x86-64 simulator | ||||||
| WORKDIR /tmp | WORKDIR /tmp | ||||||
| RUN git clone https://github.com/VeriSilicon/TIM-VX.git tim-vx \ | RUN git clone https://github.com/VeriSilicon/TIM-VX.git tim-vx \ | ||||||
|  | @ -89,7 +101,6 @@ ENV VSIMULATOR_CONFIG=czl | ||||||
| 
 | 
 | ||||||
| ENV LD_LIBRARY_PATH=/tmp/tim-vx/prebuilt-sdk/x86_64_linux/lib:/usr/local/lib:/lib/x86_64-linux-gnu/:/lib64/:/usr/lib:$LD_LIBRARY_PATH  | ENV LD_LIBRARY_PATH=/tmp/tim-vx/prebuilt-sdk/x86_64_linux/lib:/usr/local/lib:/lib/x86_64-linux-gnu/:/lib64/:/usr/lib:$LD_LIBRARY_PATH  | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| # Build WASI-NN | # Build WASI-NN | ||||||
| WORKDIR /home/wamr | WORKDIR /home/wamr | ||||||
| 
 | 
 | ||||||
|  | @ -102,12 +113,14 @@ RUN cmake \ | ||||||
|     -DCMAKE_LIBRARY_PATH=${CMAKE_LIBRARY_PATH}:/usr/local/lib/ \ |     -DCMAKE_LIBRARY_PATH=${CMAKE_LIBRARY_PATH}:/usr/local/lib/ \ | ||||||
|     -DCMAKE_INCLUDE_PATH=${CMAKE_INCLUDE_PATH}:/usr/local/include/ \ |     -DCMAKE_INCLUDE_PATH=${CMAKE_INCLUDE_PATH}:/usr/local/include/ \ | ||||||
|     -DWAMR_BUILD_WASI_NN=1 \ |     -DWAMR_BUILD_WASI_NN=1 \ | ||||||
|  |     -DWAMR_BUILD_WASI_NN_TFLITE=1\ | ||||||
|     -DWAMR_BUILD_WASI_NN_ENABLE_EXT=1 \ |     -DWAMR_BUILD_WASI_NN_ENABLE_EXT=1 \ | ||||||
|     -DWASI_NN_EXT_DELEGATE_PATH="/usr/lib/libvx_delegate.so" \ |     -DWASI_NN_EXT_DELEGATE_PATH="/usr/lib/libvx_delegate.so" \ | ||||||
|     .. |     .. | ||||||
| 
 | 
 | ||||||
| RUN make -j "$(grep -c ^processor /proc/cpuinfo)" | RUN make -j "$(grep -c ^processor /proc/cpuinfo)" | ||||||
| 
 | 
 | ||||||
| RUN cp /home/wamr/core/iwasm/libraries/wasi-nn/test/build/iwasm /run/iwasm | RUN cp /home/wamr/core/iwasm/libraries/wasi-nn/test/build/iwasm /run/iwasm \ | ||||||
|  |   && cp /home/wamr/product-mini/platforms/linux/build/lib*.so /usr/lib | ||||||
| 
 | 
 | ||||||
| ENTRYPOINT [ "/run/iwasm" ] | ENTRYPOINT [ "/run/iwasm" ] | ||||||
|  |  | ||||||
|  | @ -8,9 +8,9 @@ CURR_PATH=$(cd $(dirname $0) && pwd -P) | ||||||
| # WASM application that uses WASI-NN | # WASM application that uses WASI-NN | ||||||
| 
 | 
 | ||||||
| /opt/wasi-sdk/bin/clang \ | /opt/wasi-sdk/bin/clang \ | ||||||
|  |     --target=wasm32-wasi \ | ||||||
|  |     -DNN_LOG_LEVEL=1 \ | ||||||
|     -Wl,--allow-undefined \ |     -Wl,--allow-undefined \ | ||||||
|     -Wl,--strip-all,--no-entry \ |  | ||||||
|     --sysroot=/opt/wasi-sdk/share/wasi-sysroot \ |  | ||||||
|     -I../include -I../src/utils \ |     -I../include -I../src/utils \ | ||||||
|     -o test_tensorflow.wasm \ |     -o test_tensorflow.wasm \ | ||||||
|     test_tensorflow.c utils.c |     test_tensorflow.c utils.c | ||||||
|  | @ -28,9 +28,9 @@ python3 sum.py | ||||||
| 
 | 
 | ||||||
| cd ${CURR_PATH} | cd ${CURR_PATH} | ||||||
| /opt/wasi-sdk/bin/clang \ | /opt/wasi-sdk/bin/clang \ | ||||||
|  |     --target=wasm32-wasi \ | ||||||
|  |     -DNN_LOG_LEVEL=1 \ | ||||||
|     -Wl,--allow-undefined \ |     -Wl,--allow-undefined \ | ||||||
|     -Wl,--strip-all,--no-entry \ |  | ||||||
|     --sysroot=/opt/wasi-sdk/share/wasi-sysroot \ |  | ||||||
|     -I../include -I../src/utils \ |     -I../include -I../src/utils \ | ||||||
|     -o test_tensorflow_quantized.wasm \ |     -o test_tensorflow_quantized.wasm \ | ||||||
|     test_tensorflow_quantized.c utils.c |     test_tensorflow_quantized.c utils.c | ||||||
|  |  | ||||||
|  | @ -1,2 +1,2 @@ | ||||||
| tensorflow==2.12.1 | tensorflow==2.12.1 | ||||||
| numpy==1.26.4 | numpy==1.24.4 | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "utils.h" | #include "utils.h" | ||||||
| #include "logger.h" | #include "logger.h" | ||||||
|  | #include "wasi_nn.h" | ||||||
| 
 | 
 | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  | @ -57,7 +58,7 @@ wasm_load(char *model_name, graph *g, execution_target target) | ||||||
| wasi_nn_error | wasi_nn_error | ||||||
| wasm_load_by_name(const char *model_name, graph *g) | wasm_load_by_name(const char *model_name, graph *g) | ||||||
| { | { | ||||||
|     wasm_nn_error res = load_by_name(model_name, g); |     wasi_nn_error res = load_by_name(model_name, g); | ||||||
|     return res; |     return res; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -992,8 +992,8 @@ gci_dump(gc_heap_t *heap) | ||||||
| 
 | 
 | ||||||
|         os_printf("#%d %08" PRIx32 " %" PRIx32 " %d %d" |         os_printf("#%d %08" PRIx32 " %" PRIx32 " %d %d" | ||||||
|                   " %c %" PRId32 "\n", |                   " %c %" PRId32 "\n", | ||||||
|                   i, (int32)((char *)cur - (char *)heap->base_addr), (int32)ut, |                   i, (uint32)((char *)cur - (char *)heap->base_addr), | ||||||
|                   p, mark, inuse, (int32)hmu_obj_size(size)); |                   (uint32)ut, p, mark, inuse, (int32)hmu_obj_size(size)); | ||||||
| #if BH_ENABLE_GC_VERIFY != 0 | #if BH_ENABLE_GC_VERIFY != 0 | ||||||
|         if (inuse == 'V') { |         if (inuse == 'V') { | ||||||
|             gc_object_prefix_t *prefix = (gc_object_prefix_t *)(cur + 1); |             gc_object_prefix_t *prefix = (gc_object_prefix_t *)(cur + 1); | ||||||
|  |  | ||||||
|  | @ -77,7 +77,7 @@ typedef void *os_dir_stream; | ||||||
| typedef int os_raw_file_handle; | typedef int os_raw_file_handle; | ||||||
| 
 | 
 | ||||||
| static inline os_file_handle | static inline os_file_handle | ||||||
| os_get_invalid_handle() | os_get_invalid_handle(void) | ||||||
| { | { | ||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -151,7 +151,7 @@ typedef DIR *os_dir_stream; | ||||||
| typedef int os_raw_file_handle; | typedef int os_raw_file_handle; | ||||||
| 
 | 
 | ||||||
| static inline os_file_handle | static inline os_file_handle | ||||||
| os_get_invalid_handle() | os_get_invalid_handle(void) | ||||||
| { | { | ||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -69,7 +69,7 @@ typedef DIR *os_dir_stream; | ||||||
| typedef int os_raw_file_handle; | typedef int os_raw_file_handle; | ||||||
| 
 | 
 | ||||||
| static inline os_file_handle | static inline os_file_handle | ||||||
| os_get_invalid_handle() | os_get_invalid_handle(void) | ||||||
| { | { | ||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -114,7 +114,7 @@ typedef DIR *os_dir_stream; | ||||||
| typedef int os_raw_file_handle; | typedef int os_raw_file_handle; | ||||||
| 
 | 
 | ||||||
| static inline os_file_handle | static inline os_file_handle | ||||||
| os_get_invalid_handle() | os_get_invalid_handle(void) | ||||||
| { | { | ||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -145,7 +145,7 @@ typedef DIR *os_dir_stream; | ||||||
| typedef int os_raw_file_handle; | typedef int os_raw_file_handle; | ||||||
| 
 | 
 | ||||||
| static inline os_file_handle | static inline os_file_handle | ||||||
| os_get_invalid_handle() | os_get_invalid_handle(void) | ||||||
| { | { | ||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -115,7 +115,7 @@ os_set_signal_number_for_blocking_op(int signo); | ||||||
| typedef int os_file_handle; | typedef int os_file_handle; | ||||||
| 
 | 
 | ||||||
| static inline os_file_handle | static inline os_file_handle | ||||||
| os_get_invalid_handle() | os_get_invalid_handle(void) | ||||||
| { | { | ||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -74,7 +74,7 @@ typedef DIR *os_dir_stream; | ||||||
| typedef int os_raw_file_handle; | typedef int os_raw_file_handle; | ||||||
| 
 | 
 | ||||||
| static inline os_file_handle | static inline os_file_handle | ||||||
| os_get_invalid_handle() | os_get_invalid_handle(void) | ||||||
| { | { | ||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -127,7 +127,7 @@ typedef DIR *os_dir_stream; | ||||||
| typedef int os_raw_file_handle; | typedef int os_raw_file_handle; | ||||||
| 
 | 
 | ||||||
| static inline os_file_handle | static inline os_file_handle | ||||||
| os_get_invalid_handle() | os_get_invalid_handle(void) | ||||||
| { | { | ||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -89,7 +89,7 @@ int isnan(double x); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| static inline os_file_handle | static inline os_file_handle | ||||||
| os_get_invalid_handle() | os_get_invalid_handle(void) | ||||||
| { | { | ||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -124,7 +124,7 @@ typedef void *os_dir_stream; | ||||||
| typedef int os_raw_file_handle; | typedef int os_raw_file_handle; | ||||||
| 
 | 
 | ||||||
| static inline os_file_handle | static inline os_file_handle | ||||||
| os_get_invalid_handle() | os_get_invalid_handle(void) | ||||||
| { | { | ||||||
|     return -1; |     return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Wenyong Huang
						Wenyong Huang