From 5d541e7acf57e3efbcdca2ac3f592331e8aef612 Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Tue, 10 May 2022 21:28:53 -0700 Subject: [PATCH] [wasm64] update makeDynCall for MEMORY64 Split out from #16922 --- .circleci/config.yml | 2 +- src/library.js | 1 + src/parseTools.js | 43 ++++++++++++++++++++++++++++++++++++------- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f5899e2026f16..6971b25850148 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -381,7 +381,7 @@ jobs: executor: bionic steps: - run-tests-linux: - test_targets: "wasm64.test_hello_world wasm64.test_ccall wasm64l.test_hello_world wasm64l.test_mmap wasm64l.test_unistd_* skip:wasm64l.test_unistd_sysconf wasm64l.test_mmap_file wasm64l.test_ccall" + test_targets: "wasm64.test_hello_world wasm64.test_ccall wasm64l.test_hello_world wasm64l.test_mmap wasm64l.test_unistd_* skip:wasm64l.test_unistd_sysconf wasm64l.test_mmap_file wasm64l.test_ccall wasm64l.test_signals" test-other: executor: bionic steps: diff --git a/src/library.js b/src/library.js index c26d82ac29e1c..5e55dae7aacb0 100644 --- a/src/library.js +++ b/src/library.js @@ -2239,6 +2239,7 @@ LibraryManager.library = { // Helper for raise() to avoid signature mismatch failures: // https://github.com/emscripten-core/posixtestsuite/issues/6 + __call_sighandler__sig: 'vpi', __call_sighandler: function(fp, sig) { {{{ makeDynCall('vi', 'fp') }}}(sig); }, diff --git a/src/parseTools.js b/src/parseTools.js index c36c84e7cc52c..b8651c90ff72e 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -822,6 +822,33 @@ function makeDynCall(sig, funcPtr) { } args = args.join(', '); + const needArgConversion = MEMORY64 && sig.includes('p'); + let callArgs = args; + if (needArgConversion) { + callArgs = []; + for (let i = 1; i < sig.length; ++i) { + if (sig[i] == 'p') { + callArgs.push(`BigInt(a${i})`); + } else { + callArgs.push(`a${i}`); + } + } + callArgs = callArgs.join(', '); + } + + // Normalize any 'p' characters to either 'j' (wasm64) or 'i' (wasm32) + if (sig.includes('p')) { + let normalizedSig = ''; + for (let sigChr of sig) { + if (sigChr == 'p') { + sigChr = MEMORY64 ? 'j' : 'i'; + } + normalizedSig += sigChr; + } + sig = normalizedSig; + } + + if (funcPtr === undefined) { printErr(`warning: ${currentlyParsedFilename}: \ Legacy use of {{{ makeDynCall("${sig}") }}}(funcPtr, arg1, arg2, ...). \ @@ -837,9 +864,9 @@ Please update to new syntax.`); return `(function(${args}) { /* a dynamic function call to signature ${sig}, but there are no exported function pointers with that signature, so this path should never be taken. Build with ASSERTIONS enabled to validate. */ })`; } } - return `(function(cb, ${args}) { ${returnExpr} getDynCaller("${sig}", cb)(${args}) })`; + return `(function(cb, ${args}) { ${returnExpr} getDynCaller("${sig}", cb)(${callArgs}) })`; } else { - return `(function(cb, ${args}) { ${returnExpr} getWasmTableEntry(cb)(${args}) })`; + return `(function(cb, ${args}) { ${returnExpr} getWasmTableEntry(cb)(${callArgs}) })`; } } @@ -854,13 +881,15 @@ Please update to new syntax.`); const dyncall = exportedAsmFunc(`dynCall_${sig}`); if (sig.length > 1) { - return `(function(${args}) { ${returnExpr} ${dyncall}.apply(null, [${funcPtr}, ${args}]); })`; - } else { - return `(function() { ${returnExpr} ${dyncall}.call(null, ${funcPtr}); })`; + return `(function(${args}) { ${returnExpr} ${dyncall}.apply(null, [${funcPtr}, ${callArgs}]); })`; } - } else { - return `getWasmTableEntry(${funcPtr})`; + return `(function() { ${returnExpr} ${dyncall}.call(null, ${funcPtr}); })`; + } + + if (needArgConversion) { + return `(function(${args}) { ${returnExpr} getWasmTableEntry(${funcPtr}).call(null, ${callArgs}) })`; } + return `getWasmTableEntry(${funcPtr})`; } function heapAndOffset(heap, ptr) { // given HEAP8, ptr , we return splitChunk, relptr