Skip to content

Commit f082df9

Browse files
committed
Move parts of wasm64 export wrapper generation to build time. NFC
Specifically the metadata about which exports to wrap is now stored in the compiler rather than the runtime.
1 parent 34205c2 commit f082df9

5 files changed

+74
-85
lines changed

emscripten.py

+50
Original file line numberDiff line numberDiff line change
@@ -863,6 +863,8 @@ def create_receiving(exports):
863863

864864
def create_module(sending, receiving, invoke_funcs, metadata):
865865
invoke_wrappers = create_invoke_wrappers(invoke_funcs)
866+
if settings.MEMORY64:
867+
wasm64_wrappers = create_wasm64_wrappers(metadata)
866868
receiving += create_named_globals(metadata)
867869
module = []
868870

@@ -875,6 +877,7 @@ def create_module(sending, receiving, invoke_funcs, metadata):
875877

876878
module.append(receiving)
877879
module.append(invoke_wrappers)
880+
module.append(wasm64_wrappers)
878881
return module
879882

880883

@@ -929,6 +932,53 @@ def create_invoke_wrappers(invoke_funcs):
929932
return invoke_wrappers
930933

931934

935+
def create_wasm64_wrappers(metadata):
936+
# TODO(sbc): Move this into somewhere less static. Maybe it can become
937+
# part of library.js file, even though this metadata relates specifically
938+
# to native (non-JS) functions.
939+
mapping = {
940+
'sbrk': 'pP',
941+
'stackAlloc': 'pp',
942+
'emscripten_builtin_malloc': 'pp',
943+
'malloc': 'pp',
944+
'__getTypeName': 'pp',
945+
'setThrew': 'ip',
946+
'free': 'ip',
947+
'stackRestore': 'ip',
948+
'__cxa_is_pointer_type': 'ip',
949+
'stackSave': 'p',
950+
'fflush': 'p',
951+
'emscripten_stack_get_end': 'p',
952+
'emscripten_stack_get_base': 'p',
953+
'pthread_self': 'p',
954+
'emscripten_stack_get_current': 'p',
955+
'__errno_location': 'p',
956+
'emscripten_builtin_memalign': 'ppp',
957+
'main': 'iiPP',
958+
'emscripten_stack_set_limits': 'ipp',
959+
'__set_stack_limits': 'ipp',
960+
'__cxa_can_catch': 'ippp',
961+
}
962+
963+
wasm64_wrappers = '\nfunction instrumentWasmExportsForMemory64(exports) {'
964+
965+
sigs_seen = set()
966+
wrap_functions = []
967+
for exp in metadata['exports']:
968+
sig = mapping.get(exp)
969+
if sig:
970+
if sig not in sigs_seen:
971+
sigs_seen.add(sig)
972+
wasm64_wrappers += js_manipulation.make_wasm64_wrapper(sig)
973+
wrap_functions.append(exp)
974+
975+
for f in wrap_functions:
976+
sig = mapping[f]
977+
wasm64_wrappers += f"\n exports['{f}'] = _wasm64_wrapper_{sig}(exports['{f}']);"
978+
wasm64_wrappers += '\n}'
979+
return wasm64_wrappers
980+
981+
932982
def normalize_line_endings(text):
933983
"""Normalize to UNIX line endings.
934984

src/preamble.js

-4
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,6 @@ if (typeof WebAssembly != 'object') {
5050
#include "runtime_asan.js"
5151
#endif
5252

53-
#if MEMORY64
54-
#include "runtime_wasm64.js"
55-
#endif
56-
5753
// Wasm globals
5854

5955
var wasmMemory;

src/preamble_minimal.js

-4
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@
1212
#include "runtime_asan.js"
1313
#endif
1414

15-
#if MEMORY64
16-
#include "runtime_wasm64.js"
17-
#endif
18-
1915
#if ASSERTIONS || SAFE_HEAP
2016
/** @type {function(*, string=)} */
2117
function assert(condition, text) {

src/runtime_wasm64.js

-77
This file was deleted.

tools/js_manipulation.py

+24
Original file line numberDiff line numberDiff line change
@@ -138,3 +138,27 @@ def make_invoke(sig):
138138
}''' % (sig, ','.join(args), body, exceptional_ret)
139139

140140
return ret
141+
142+
def make_wasm64_wrapper(sig):
143+
assert 'p' in sig.lower()
144+
n_args = len(sig) - 1
145+
args = ['a%d' % i for i in range(n_args)]
146+
args_converted = args.copy()
147+
for i, arg_type in enumerate(sig[1:]):
148+
if arg_type == 'p':
149+
args_converted[i] = f'BigInt({args_converted[i]})'
150+
elif arg_type == 'P':
151+
args_converted[i] = f'BigInt({args_converted[i]} ? {args_converted[i]} : 0)'
152+
153+
args_in = ', '.join(args)
154+
args_out = ', '.join(args_converted)
155+
result = f'f({args_out})'
156+
if sig[0] == 'p':
157+
result = f'Number({result})'
158+
159+
return f'''
160+
function _wasm64_wrapper_{sig}(f) {{
161+
return function({args_in}) {{
162+
return {result};
163+
}};
164+
}}'''

0 commit comments

Comments
 (0)