Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
1 change: 1 addition & 0 deletions src/library.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
},
Expand Down
43 changes: 36 additions & 7 deletions src/parseTools.js
Original file line number Diff line number Diff line change
Expand Up @@ -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, ...). \
Expand All @@ -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}) })`;
}
}

Expand All @@ -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
Expand Down