1

WebAssembly にコンパイルすると、emscripten は のような関数を生成しますinvoke_vii。彼らの目的は何ですか?

詳細:

C からコンパイルされた WebAssembly モジュールはemcc -s WASM=1 -g、ホスト環境によってさまざまな機能が提供されることを期待しています。

...
(import "env" "abortOnCannotGrowMemory" (func $import$9 (result i32)))
(import "env" "invoke_vii" (func $import$10 (param i32 i32 i32)))
(import "env" "___syscall221" (func $import$11 (param i32 i32) (result i32)))
...

私は C で書かれた WebAssembly インタープリターに取り組んでいます。そのため、これらの関数の提供に対処する必要がありますがinvoke_viiinvoke_iiii、 などの関数に唖然としています。

接尾辞は明らかに呼び出し署名に関連しています。たとえば、viireturnvoidと take some ints を意味します。名前の呼び出しは、関数が何かを呼び出すことになっていることを示唆しています。

これらの関数に関する情報は、emscripten によって生成された Java Script コードでの実装以外には見つかりませんでした。

function invoke_ii(index,a1) {
  # removed error checking for brevity
  return Module["dynCall_ii"](index,a1);
}

dynCall_iiWebAssembly モジュールに存在します。

すべてのinvoke_*関数が行うことは、対応する関数を実行するようにインタープリターに指示することだけのようdynCall_*です。この間接化の目的は何ですか? dynCall_WebAssembly コードが直接呼び出さないのはなぜですか?

4

1 に答える 1

2

これらは、setjmp/longjmp および C++ 例外の処理に使用されます。これらのメカニズムでは、JavaScript は WebAssembly にコールバックし、WebAssembly 間接関数テーブルで関数を呼び出す機能を必要とします。

例外なしで (デフォルトではない) を使用してビルドすると-s SUPPORT_LONGJMP=0、これらの関数はまったく表示されません。

于 2020-09-29T05:16:47.313 に答える