Skip to content

Commit 716f0b2

Browse files
authored
Automatically convert return pointers to unsigned in CAN_ADDRESS_GB mode. (#19755)
When we have a signature for native function and we know it returns a pointer we automatically interpret it as unsigned when it arrives in JS.
1 parent cd3596b commit 716f0b2

File tree

7 files changed

+40
-31
lines changed

7 files changed

+40
-31
lines changed

emscripten.py

+23-15
Original file line numberDiff line numberDiff line change
@@ -838,8 +838,8 @@ def create_module(receiving, metadata, library_symbols):
838838
module.append(create_invoke_wrappers(metadata))
839839
else:
840840
assert not metadata.invokeFuncs, "invoke_ functions exported but exceptions and longjmp are both disabled"
841-
if settings.MEMORY64:
842-
module.append(create_wasm64_wrappers(metadata))
841+
if settings.MEMORY64 or settings.CAN_ADDRESS_2GB:
842+
module.append(create_pointer_conversion_wrappers(metadata))
843843
return module
844844

845845

@@ -852,7 +852,7 @@ def create_invoke_wrappers(metadata):
852852
return invoke_wrappers
853853

854854

855-
def create_wasm64_wrappers(metadata):
855+
def create_pointer_conversion_wrappers(metadata):
856856
# TODO(sbc): Move this into somewhere less static. Maybe it can become
857857
# part of library.js file, even though this metadata relates specifically
858858
# to native (non-JS) functions.
@@ -902,26 +902,34 @@ def create_wasm64_wrappers(metadata):
902902
'emscripten_wasm_worker_initialize': '_p_',
903903
}
904904

905-
wasm64_wrappers = '''
906-
function instrumentWasmExportsForMemory64(exports) {
905+
wrappers = '''
906+
function applySignatureConversions(exports) {
907907
// First, make a copy of the incoming exports object
908-
exports = Object.assign({}, exports);'''
908+
exports = Object.assign({}, exports);
909+
'''
909910

910911
sigs_seen = set()
911912
wrap_functions = []
912-
for exp in metadata.exports:
913-
sig = mapping.get(exp)
913+
for symbol in metadata.exports:
914+
sig = mapping.get(symbol)
914915
if sig:
915-
if sig not in sigs_seen:
916-
sigs_seen.add(sig)
917-
wasm64_wrappers += js_manipulation.make_wasm64_wrapper(sig)
918-
wrap_functions.append(exp)
916+
if settings.MEMORY64:
917+
if sig not in sigs_seen:
918+
wrappers += js_manipulation.make_wasm64_wrapper(sig)
919+
sigs_seen.add(sig)
920+
wrap_functions.append(symbol)
921+
elif sig[0] == 'p':
922+
if sig not in sigs_seen:
923+
wrappers += js_manipulation.make_unsign_pointer_wrapper(sig)
924+
sigs_seen.add(sig)
925+
wrap_functions.append(symbol)
919926

920927
for f in wrap_functions:
921928
sig = mapping[f]
922-
wasm64_wrappers += f"\n exports['{f}'] = wasm64Wrapper_{sig}(exports['{f}']);"
923-
wasm64_wrappers += '\n return exports\n}'
924-
return wasm64_wrappers
929+
wrappers += f"\n exports['{f}'] = makeWrapper_{sig}(exports['{f}']);"
930+
wrappers += '\n return exports\n}'
931+
932+
return wrappers
925933

926934

927935
def run(in_wasm, out_wasm, outfile_js, memfile, js_syms):

src/embind/embind.js

-6
Original file line numberDiff line numberDiff line change
@@ -718,9 +718,6 @@ var LibraryEmbind = {
718718
// assumes 4-byte alignment
719719
var base = _malloc({{{ POINTER_SIZE }}} + length + 1);
720720
var ptr = base + {{{ POINTER_SIZE }}};
721-
#if CAN_ADDRESS_2GB
722-
ptr >>>= 0;
723-
#endif
724721
{{{ makeSetValue('base', '0', 'length', SIZE_TYPE) }}};
725722
if (stdStringIsUTF8 && valueIsOfTypeString) {
726723
stringToUTF8(value, ptr, length + 1);
@@ -810,9 +807,6 @@ var LibraryEmbind = {
810807
// assumes 4-byte alignment
811808
var length = lengthBytesUTF(value);
812809
var ptr = _malloc(4 + length + charSize);
813-
#if CAN_ADDRESS_2GB
814-
ptr >>>= 0;
815-
#endif
816810
HEAPU32[ptr >> 2] = length >> shift;
817811

818812
encodeString(value, ptr + 4, length + charSize);

src/library.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ mergeInto(LibraryManager.library, {
200200
emscripten_resize_heap: (requestedSize) => {
201201
var oldSize = HEAPU8.length;
202202
#if MEMORY64 != 1
203-
requestedSize = requestedSize >>> 0;
203+
requestedSize >>>= 0;
204204
#endif
205205
#if ALLOW_MEMORY_GROWTH == 0
206206
#if ABORTING_MALLOC
@@ -3090,7 +3090,7 @@ mergeInto(LibraryManager.library, {
30903090
// Used by wasm-emscripten-finalize to implement STACK_OVERFLOW_CHECK
30913091
__handle_stack_overflow__deps: ['emscripten_stack_get_base', 'emscripten_stack_get_end', '$ptrToString'],
30923092
__handle_stack_overflow: (requested) => {
3093-
requested = requested >>> 0;
3093+
requested >>>= 0;
30943094
var base = _emscripten_stack_get_base();
30953095
var end = _emscripten_stack_get_end();
30963096
abort(`stack overflow (Attempt to set SP to ${ptrToString(requested)}` +

src/library_webgpu.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -1841,7 +1841,7 @@ var LibraryWebGPU = {
18411841

18421842
if (size === 0) warnOnce('getMappedRange size=0 no longer means WGPU_WHOLE_MAP_SIZE');
18431843

1844-
size = size >>> 0;
1844+
size >>>= 0;
18451845
if (size === {{{ gpu.WHOLE_MAP_SIZE }}}) size = undefined;
18461846

18471847
var mapped;
@@ -1875,7 +1875,7 @@ var LibraryWebGPU = {
18751875

18761876
if (size === 0) warnOnce('getMappedRange size=0 no longer means WGPU_WHOLE_MAP_SIZE');
18771877

1878-
size = size >>> 0;
1878+
size >>>= 0;
18791879
if (size === {{{ gpu.WHOLE_MAP_SIZE }}}) size = undefined;
18801880

18811881
if (bufferWrapper.mapMode !== {{{ gpu.MapMode.Write }}}) {
@@ -1916,7 +1916,7 @@ var LibraryWebGPU = {
19161916
bufferWrapper.onUnmap = [];
19171917
var buffer = bufferWrapper.object;
19181918

1919-
size = size >>> 0;
1919+
size >>>= 0;
19201920
if (size === {{{ gpu.WHOLE_MAP_SIZE }}}) size = undefined;
19211921

19221922
// `callback` takes (WGPUBufferMapAsyncStatus status, void * userdata)

src/postamble_minimal.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,8 @@ WebAssembly.instantiate(Module['wasm'], imports).then((output) => {
171171
asm = output.instance.exports;
172172
#endif
173173

174-
#if MEMORY64
175-
asm = instrumentWasmExportsForMemory64(asm);
174+
#if MEMORY64 || CAN_ADDRESS_2GB
175+
asm = applySignatureConversions(asm);
176176
#endif
177177

178178
#if USE_OFFSET_CONVERTER

src/preamble.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -991,8 +991,8 @@ function createWasm() {
991991
reportUndefinedSymbols();
992992
#endif
993993

994-
#if MEMORY64
995-
exports = instrumentWasmExportsForMemory64(exports);
994+
#if MEMORY64 || CAN_ADDRESS_2GB
995+
exports = applySignatureConversions(exports);
996996
#endif
997997

998998
Module['asm'] = exports;

tools/js_manipulation.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -182,4 +182,11 @@ def make_wasm64_wrapper(sig):
182182
# are certain places we need to avoid strict mode still.
183183
# e.g. emscripten_get_callstack (getCallstack) which uses the `arguments`
184184
# global.
185-
return f' var wasm64Wrapper_{sig} = (f) => function ({args_in}) {{ return {result} }};\n'
185+
return f' var makeWrapper_{sig} = (f) => function ({args_in}) {{ return {result} }};\n'
186+
187+
188+
def make_unsign_pointer_wrapper(sig):
189+
assert sig[0] == 'p'
190+
n_args = len(sig) - 1
191+
args = ','.join('a%d' % i for i in range(n_args))
192+
return f' var makeWrapper_{sig} = (f) => ({args}) => f({args}) >>> 0;\n'

0 commit comments

Comments
 (0)