From fa01e827d5540522a1031d1f658064704a560226 Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Tue, 27 Aug 2024 14:57:29 -0700 Subject: [PATCH] Prefer `calloc` over of malloc+zeroMemory. NFC IIUC, there are cases where the allocator can take advantage of the fact that it knows the memory is fresh and avoid the memset completely. --- src/library_dylink.js | 6 +++--- src/library_pthread.js | 2 +- src/library_sdl.js | 10 ++++------ test/other/codesize/test_codesize_hello_dylink.exports | 2 +- test/other/codesize/test_codesize_hello_dylink.funcs | 2 +- test/other/codesize/test_codesize_hello_dylink.gzsize | 2 +- test/other/codesize/test_codesize_hello_dylink.jssize | 2 +- test/other/codesize/test_codesize_hello_dylink.size | 2 +- test/test_core.py | 4 +--- test/test_other.py | 1 + tools/emscripten.py | 1 + 11 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/library_dylink.js b/src/library_dylink.js index a450db61cc888..f9f088d5e379a 100644 --- a/src/library_dylink.js +++ b/src/library_dylink.js @@ -363,7 +363,7 @@ var LibraryDylink = { // Allocate memory even if malloc isn't ready yet. The allocated memory here // must be zero initialized since its used for all static data, including bss. $getMemory__noleakcheck: true, - $getMemory__deps: ['$GOT', '__heap_base', '$zeroMemory', '$alignMemory', 'malloc'], + $getMemory__deps: ['$GOT', '__heap_base', '$alignMemory', 'calloc'], $getMemory: (size) => { // After the runtime is initialized, we must only use sbrk() normally. #if DYLINK_DEBUG @@ -373,7 +373,7 @@ var LibraryDylink = { // Currently we don't support freeing of static data when modules are // unloaded via dlclose. This function is tagged as `noleakcheck` to // avoid having this reported as leak. - return zeroMemory(_malloc(size), size); + return _calloc(size, 1); } var ret = ___heap_base; // Keep __heap_base stack aligned. @@ -599,7 +599,7 @@ var LibraryDylink = { $loadWebAssemblyModule__deps: [ '$loadDynamicLibrary', '$getMemory', '$relocateExports', '$resolveGlobalSymbol', '$GOTHandler', - '$getDylinkMetadata', '$alignMemory', '$zeroMemory', + '$getDylinkMetadata', '$alignMemory', '$currentModuleWeakSymbols', '$updateTableMap', '$wasmTable', diff --git a/src/library_pthread.js b/src/library_pthread.js index 22d461f8333cc..956413960afb3 100644 --- a/src/library_pthread.js +++ b/src/library_pthread.js @@ -35,7 +35,7 @@ var LibraryPThread = { $PThread__postset: 'PThread.init();', $PThread__deps: ['_emscripten_thread_init', '$terminateWorker', - '$cleanupThread', '$zeroMemory', + '$cleanupThread', #if MAIN_MODULE '$markAsFinished', #endif diff --git a/src/library_sdl.js b/src/library_sdl.js index 160849a38bf17..0d54f422b3ad7 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -1357,7 +1357,7 @@ var LibrarySDL = { return SDL.version; }, - SDL_Init__deps: ['$zeroMemory', 'memcpy'], + SDL_Init__deps: ['calloc', 'memcpy'], SDL_Init__proxy: 'sync', SDL_Init__docs: '/** @param{number} initFlags */', SDL_Init: (initFlags) => { @@ -1376,8 +1376,7 @@ var LibrarySDL = { } window.addEventListener("unload", SDL.receiveEvent); - SDL.keyboardState = _malloc(0x10000); // Our SDL needs 512, but 64K is safe for older SDLs - zeroMemory(SDL.keyboardState, 0x10000); + SDL.keyboardState = _calloc(0x10000, 1); // Our SDL needs 512, but 64K is safe for older SDLs // Initialize this structure carefully for closure SDL.DOMEventToSDLEvent['keydown'] = 0x300 /* SDL_KEYDOWN */; SDL.DOMEventToSDLEvent['keyup'] = 0x301 /* SDL_KEYUP */; @@ -1413,11 +1412,10 @@ var LibrarySDL = { return 1; }, - SDL_GetVideoInfo__deps: ['$zeroMemory'], + SDL_GetVideoInfo__deps: ['calloc'], SDL_GetVideoInfo__proxy: 'sync', SDL_GetVideoInfo: () => { - var ret = _malloc({{{ C_STRUCTS.SDL_VideoInfo.__size__ }}}); - zeroMemory(ret, {{{ C_STRUCTS.SDL_version.__size__ }}}); + var ret = _calloc({{{ C_STRUCTS.SDL_VideoInfo.__size__ }}}, 1); {{{ makeSetValue('ret', C_STRUCTS.SDL_VideoInfo.current_w, 'Module["canvas"].width', 'i32') }}}; {{{ makeSetValue('ret', C_STRUCTS.SDL_VideoInfo.current_h, 'Module["canvas"].height', 'i32') }}}; return ret; diff --git a/test/other/codesize/test_codesize_hello_dylink.exports b/test/other/codesize/test_codesize_hello_dylink.exports index 9aa298858fd18..f1e9af5fcfbf2 100644 --- a/test/other/codesize/test_codesize_hello_dylink.exports +++ b/test/other/codesize/test_codesize_hello_dylink.exports @@ -2,8 +2,8 @@ __wasm_apply_data_relocs __wasm_call_ctors _emscripten_stack_alloc _emscripten_stack_restore +calloc dynCall_jiji emscripten_stack_get_current main -malloc setThrew diff --git a/test/other/codesize/test_codesize_hello_dylink.funcs b/test/other/codesize/test_codesize_hello_dylink.funcs index 4ec6c20d0ee6c..2c23b988a7191 100644 --- a/test/other/codesize/test_codesize_hello_dylink.funcs +++ b/test/other/codesize/test_codesize_hello_dylink.funcs @@ -8,7 +8,7 @@ $__wasm_apply_global_relocs $__wasm_call_ctors $_emscripten_stack_alloc $_emscripten_stack_restore -$dlmalloc +$dlcalloc $emscripten_stack_get_current $legalstub$dynCall_jiji $main diff --git a/test/other/codesize/test_codesize_hello_dylink.gzsize b/test/other/codesize/test_codesize_hello_dylink.gzsize index a38f2dcf3d560..190e05fb52d22 100644 --- a/test/other/codesize/test_codesize_hello_dylink.gzsize +++ b/test/other/codesize/test_codesize_hello_dylink.gzsize @@ -1 +1 @@ -6292 +6285 diff --git a/test/other/codesize/test_codesize_hello_dylink.jssize b/test/other/codesize/test_codesize_hello_dylink.jssize index b252c4d4631e2..61d1af505618a 100644 --- a/test/other/codesize/test_codesize_hello_dylink.jssize +++ b/test/other/codesize/test_codesize_hello_dylink.jssize @@ -1 +1 @@ -13833 +13820 diff --git a/test/other/codesize/test_codesize_hello_dylink.size b/test/other/codesize/test_codesize_hello_dylink.size index 01ddd66476899..1b0fcc83b67b3 100644 --- a/test/other/codesize/test_codesize_hello_dylink.size +++ b/test/other/codesize/test_codesize_hello_dylink.size @@ -1 +1 @@ -9350 +9763 diff --git a/test/test_core.py b/test/test_core.py index f77fb029ee200..3b85cb1901104 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -1943,9 +1943,7 @@ def test_em_asm_side_module(self): def test_em_js(self, args, force_c): if '-sMAIN_MODULE=2' in args: self.check_dylink() - else: - self.emcc_args += ['-sEXPORTED_FUNCTIONS=_main,_malloc'] - self.emcc_args += args + self.emcc_args += ['-sEXPORTED_FUNCTIONS=_main,_malloc'] + args if '-pthread' in args: self.setup_node_pthreads() diff --git a/test/test_other.py b/test/test_other.py index fc472a3d4ac5f..52949f3310184 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -2198,6 +2198,7 @@ def test_dylink_pthread_bigint_em_asm(self): def test_dylink_pthread_bigint_em_js(self): self.set_setting('MAIN_MODULE', 2) self.set_setting('WASM_BIGINT') + self.set_setting('EXPORTED_FUNCTIONS', '_malloc,_main') self.emcc_args += ['-Wno-experimental', '-pthread'] self.do_runf('core/test_em_js.cpp') diff --git a/tools/emscripten.py b/tools/emscripten.py index 8319bd9ac46dd..502cc2dca7d04 100644 --- a/tools/emscripten.py +++ b/tools/emscripten.py @@ -1023,6 +1023,7 @@ def create_pointer_conversion_wrappers(metadata): '_emscripten_stack_alloc': 'pp', 'emscripten_builtin_malloc': 'pp', 'malloc': 'pp', + 'calloc': 'ppp', 'webidl_malloc': 'pp', 'memalign': 'ppp', 'memcmp': '_ppp',