我正在用 C 语言开发 WebAssembly 模块,并一直在尝试利用memory.fill
and memory.copy
中定义的指令WebAssembly 规范 https://webassembly.github.io/spec/core/syntax/instructions.html#memory-instructions.
我已经知道 Clang (v11.1.0)支持其他与内存相关的 wasm 内在函数 https://github.com/llvm/llvm-project/blob/a6628e596e70bf5c31058dec582c8a7907928e98/clang/include/clang/Basic/BuiltinsWebAssembly.def#L25 like __builtin_wasm_memory_size
and __builtin_wasm_memory_grow
,但我一直很难弄清楚它是否支持内在函数memory.fill
and memory.copy
.
我不太熟悉 Clang/LLVM 的内部工作原理,但在一些地方似乎暗示了对这些指令的引用[1] https://reviews.llvm.org/D57736#change-nNN3Qfkg9dIt [2] https://reviews.llvm.org/D57791(除非我误解了某些东西)。
我尝试使用__builtin_memcpy
and __builtin_memset
:
__attribute__((export_name("memcpy")))
void memcpy_test(void* mem_dst, void* mem_src) {
__builtin_memcpy(mem_dst, mem_src, 128);
}
__attribute__((export_name("memset")))
void memset_test(void* mem_src) {
__builtin_memset(mem_src, 0, 128);
}
编译,但是调用__builtin_memcpy
and __builtin_memset
替换为程序集中的导入函数:
...
(import "env" "memcpy" (func $memcpy (type $t0)))
(import "env" "memset" (func $memset (type $t0)))
(func $__wasm_call_ctors (type $t1))
(func $memcpy_test (type $t2) (param $p0 i32) (param $p1 i32)
local.get $p0
local.get $p1
i32.const 128
call $memcpy
drop)
(func $memset_test (type $t3) (param $p0 i32)
local.get $p0
i32.const 0
i32.const 128
call $memset
drop)
...
此时我有点卡住了,似乎这些内在函数尚不可用,但我对此并不肯定。
我真的很感激我能得到的任何帮助!
[快速说明:我目前对使用 emscripten 不感兴趣,因为我试图避免它附带的大量粘合代码。]