@@ -863,6 +863,8 @@ def create_receiving(exports):
863
863
864
864
def create_module (sending , receiving , invoke_funcs , metadata ):
865
865
invoke_wrappers = create_invoke_wrappers (invoke_funcs )
866
+ if settings .MEMORY64 :
867
+ wasm64_wrappers = create_wasm64_wrappers (metadata )
866
868
receiving += create_named_globals (metadata )
867
869
module = []
868
870
@@ -875,6 +877,7 @@ def create_module(sending, receiving, invoke_funcs, metadata):
875
877
876
878
module .append (receiving )
877
879
module .append (invoke_wrappers )
880
+ module .append (wasm64_wrappers )
878
881
return module
879
882
880
883
@@ -929,6 +932,53 @@ def create_invoke_wrappers(invoke_funcs):
929
932
return invoke_wrappers
930
933
931
934
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 = '\n function 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
+
932
982
def normalize_line_endings (text ):
933
983
"""Normalize to UNIX line endings.
934
984
0 commit comments