diff --git a/ChangeLog.md b/ChangeLog.md index 3ab78b6f4f5e4..a734b417896ae 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -22,12 +22,22 @@ See docs/process.md for more on how version tagging works. ----------------------- - In `MODULARIZE` mode we no longer export the module ready promise as `ready`. This was previously exposed on the Module for historical reasons even though - in `MODULARIZE` mode the only way to get access to the module is to wait on the - promise returned from the factory function. (#21564) + in `MODULARIZE` mode the only way to get access to the module is to wait on + the promise returned from the factory function. (#21564) - JS library code is now executed in its own context/scope, which limits how much of the compiler internals are accessible. If there are build time JS symbols that you are depending on, but that were not added to this scope, please file a bug and we can add more to this scope. (#21542) +- The JS functions for manipulating the native/shadow stack + (`stackSave`/`stackRestore`/`stackAlloc`) are now just regular JS library + function and as such are only included if you explicitly depend on them. If + you use these functions in your JS code you will need to depend on them via + either: + - The `EM_JS_DEPS` macro for `EM_ASM`/`EM_JS` code. + - The `__deps` attribute for JS library functions + - The `-sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE` flag for `--pre-js`/`--post-js` + code + (#21555) 3.1.56 - 03/14/24 ----------------- diff --git a/src/jsifier.mjs b/src/jsifier.mjs index 3fb3ce923a2d3..9f2d2459286f9 100644 --- a/src/jsifier.mjs +++ b/src/jsifier.mjs @@ -31,6 +31,7 @@ import { printErr, read, warn, + warnOnce, warningOccured, } from './utility.mjs'; import {LibraryManager, librarySymbols} from './modules.mjs'; diff --git a/src/library.js b/src/library.js index 1059c8825c6fd..47f21861139af 100644 --- a/src/library.js +++ b/src/library.js @@ -21,6 +21,20 @@ // new function with an '_', it will not be found. addToLibrary({ + // JS aliases for native stack manipulation functions + $stackSave__deps: ['emscripten_stack_get_current'], + $stackSave: () => _emscripten_stack_get_current(), + $stackRestore__deps: ['_emscripten_stack_restore'], + $stackRestore: (val) => __emscripten_stack_restore(val), + $stackAlloc__deps: ['_emscripten_stack_alloc'], + $stackAlloc: (sz) => __emscripten_stack_alloc(sz), + + // Aliases that allow legacy names (without leading $) for these + // stack functions to continue to work in `__deps` entries. + stackAlloc: '$stackAlloc', + stackSave: '$stackSave', + stackRestore: '$stackSave', + $ptrToString: (ptr) => { #if ASSERTIONS assert(typeof ptr === 'number'); @@ -596,7 +610,7 @@ addToLibrary({ #endif $withStackSave__internal: true, - $withStackSave__deps: ['stackSave', 'stackRestore'], + $withStackSave__deps: ['$stackSave', '$stackRestore'], $withStackSave: (f) => { var stack = stackSave(); var ret = f(); diff --git a/src/library_async.js b/src/library_async.js index 8121a4cc8e732..6494d92bdf8bf 100644 --- a/src/library_async.js +++ b/src/library_async.js @@ -541,7 +541,7 @@ addToLibrary({ }); }, - $Fibers__deps: ['$Asyncify', 'emscripten_stack_set_limits', 'stackRestore'], + $Fibers__deps: ['$Asyncify', 'emscripten_stack_set_limits', '$stackRestore'], $Fibers: { nextFiber: 0, trampolineRunning: false, @@ -601,7 +601,7 @@ addToLibrary({ }, }, - emscripten_fiber_swap__deps: ["$Asyncify", "$Fibers", 'stackSave'], + emscripten_fiber_swap__deps: ["$Asyncify", "$Fibers", '$stackSave'], emscripten_fiber_swap__async: true, emscripten_fiber_swap: (oldFiber, newFiber) => { if (ABORT) return; diff --git a/src/library_ccall.js b/src/library_ccall.js index fe816644b95ce..05313c5630b21 100644 --- a/src/library_ccall.js +++ b/src/library_ccall.js @@ -15,7 +15,7 @@ addToLibrary({ }, // C calling interface. - $ccall__deps: ['$getCFunc', '$writeArrayToMemory', '$stringToUTF8OnStack', 'stackSave', 'stackRestore', 'stackAlloc'], + $ccall__deps: ['$getCFunc', '$writeArrayToMemory', '$stringToUTF8OnStack', '$stackSave', '$stackRestore', '$stackAlloc'], $ccall__docs: ` /** * @param {string|null=} returnType diff --git a/src/library_dylink.js b/src/library_dylink.js index 4c4607254b8f6..bfd0d4fcaa83c 100644 --- a/src/library_dylink.js +++ b/src/library_dylink.js @@ -72,7 +72,7 @@ var LibraryDylink = { // generation time. #if !DISABLE_EXCEPTION_CATCHING || SUPPORT_LONGJMP == 'emscripten' $createInvokeFunction__internal: true, - $createInvokeFunction__deps: ['$dynCall', 'setThrew', 'stackSave', 'stackRestore'], + $createInvokeFunction__deps: ['$dynCall', 'setThrew', '$stackSave', '$stackRestore'], $createInvokeFunction: (sig) => { return function() { var sp = stackSave(); diff --git a/src/library_exceptions.js b/src/library_exceptions.js index 82f4601f54bf7..120edd6521a79 100644 --- a/src/library_exceptions.js +++ b/src/library_exceptions.js @@ -287,7 +287,7 @@ var LibraryExceptions = { #endif #if WASM_EXCEPTIONS || !DISABLE_EXCEPTION_CATCHING - $getExceptionMessageCommon__deps: ['__get_exception_message', 'free', '$withStackSave', 'stackAlloc'], + $getExceptionMessageCommon__deps: ['__get_exception_message', 'free', '$withStackSave', '$stackAlloc'], $getExceptionMessageCommon: (ptr) => withStackSave(() => { var type_addr_addr = stackAlloc({{{ POINTER_SIZE }}}); var message_addr_addr = stackAlloc({{{ POINTER_SIZE }}}); diff --git a/src/library_legacy.js b/src/library_legacy.js index b2814b73c55b4..157a084a0d8b3 100644 --- a/src/library_legacy.js +++ b/src/library_legacy.js @@ -17,7 +17,7 @@ legacyFuncs = { * @param {(Uint8Array|Array)} slab: An array of data. * @param {number=} allocator : How to allocate memory, see ALLOC_* */ - $allocate__deps: ['$ALLOC_NORMAL', '$ALLOC_STACK', 'malloc', 'stackAlloc'], + $allocate__deps: ['$ALLOC_NORMAL', '$ALLOC_STACK', 'malloc', '$stackAlloc'], $allocate: (slab, allocator) => { var ret; #if ASSERTIONS diff --git a/src/library_promise.js b/src/library_promise.js index 169fe7b640aca..d4e899442e18d 100644 --- a/src/library_promise.js +++ b/src/library_promise.js @@ -77,9 +77,9 @@ addToLibrary({ $makePromiseCallback__deps: ['$getPromise', '$POINTER_SIZE', 'emscripten_promise_destroy', - 'stackAlloc', - 'stackRestore', - 'stackSave'], + '$stackAlloc', + '$stackRestore', + '$stackSave'], $makePromiseCallback: (callback, userData) => { return (value) => { #if RUNTIME_DEBUG diff --git a/src/library_pthread.js b/src/library_pthread.js index c57b75148b7dd..2ae0e9fc092c5 100644 --- a/src/library_pthread.js +++ b/src/library_pthread.js @@ -960,7 +960,7 @@ var LibraryPThread = { $proxyToMainThreadPtr: (...args) => BigInt(proxyToMainThread(...args)), #endif - $proxyToMainThread__deps: ['$withStackSave', '_emscripten_run_on_main_thread_js'].concat(i53ConversionDeps), + $proxyToMainThread__deps: ['$withStackSave', '$stackAlloc', '_emscripten_run_on_main_thread_js'].concat(i53ConversionDeps), $proxyToMainThread__docs: '/** @type{function(number, (number|boolean), ...number)} */', $proxyToMainThread: (funcIndex, emAsmAddr, sync, ...callArgs) => { // EM_ASM proxying is done by passing a pointer to the address of the EM_ASM @@ -1065,7 +1065,7 @@ var LibraryPThread = { }, $establishStackSpace__internal: true, - $establishStackSpace__deps: ['stackRestore'], + $establishStackSpace__deps: ['$stackRestore'], $establishStackSpace: () => { var pthread_ptr = _pthread_self(); var stackHigh = {{{ makeGetValue('pthread_ptr', C_STRUCTS.pthread.stack, '*') }}}; diff --git a/src/library_sdl.js b/src/library_sdl.js index 00332dc1144b6..6a6563ecc9ddd 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -2157,7 +2157,7 @@ var LibrarySDL = { // We support JPG, PNG, TIF because browsers do IMG_Init: (flags) => flags, - IMG_Load_RW__deps: ['SDL_LockSurface', 'SDL_FreeRW', '$PATH_FS', '$withStackSave', '$stringToUTF8OnStack', 'stackAlloc'], + IMG_Load_RW__deps: ['SDL_LockSurface', 'SDL_FreeRW', '$PATH_FS', '$withStackSave', '$stringToUTF8OnStack', '$stackAlloc'], IMG_Load_RW__proxy: 'sync', IMG_Load_RW: (rwopsID, freeSrc) => { try { diff --git a/src/library_strings.js b/src/library_strings.js index 72e4f46746485..5c71c02bfecc6 100644 --- a/src/library_strings.js +++ b/src/library_strings.js @@ -484,7 +484,7 @@ addToLibrary({ }, // Allocate stack space for a JS string, and write it there. - $stringToUTF8OnStack__deps: ['$lengthBytesUTF8', '$stringToUTF8'], + $stringToUTF8OnStack__deps: ['$lengthBytesUTF8', '$stringToUTF8', '$stackAlloc'], $stringToUTF8OnStack: (str) => { var size = lengthBytesUTF8(str) + 1; var ret = stackAlloc(size); diff --git a/src/library_webgl.js b/src/library_webgl.js index 326d4e9f373c4..e40d6c0e5bb5e 100644 --- a/src/library_webgl.js +++ b/src/library_webgl.js @@ -3942,6 +3942,7 @@ for (/**@suppress{duplicate}*/var i = 0; i < {{{ GL_POOL_TEMP_BUFFERS_SIZE }}}; #if MEMORY64 // Convert an array of i64 offsets to an array of i32 offsets returning a // pointer to the new (stack allocated) array. + $convertOffsets__deps: ['$stackAlloc'], $convertOffsets__internal: true, $convertOffsets: (offsets, count) => { var offsets32 = stackAlloc(count * 4); @@ -3960,7 +3961,7 @@ for (/**@suppress{duplicate}*/var i = 0; i < {{{ GL_POOL_TEMP_BUFFERS_SIZE }}}; glMultiDrawElements: 'glMultiDrawElementsWEBGL', glMultiDrawElementsANGLE: 'glMultiDrawElementsWEBGL', #if MEMORY64 - glMultiDrawElementsWEBGL__deps: ['$convertOffsets', 'stackSave', 'stackRestore'], + glMultiDrawElementsWEBGL__deps: ['$convertOffsets', '$stackSave', '$stackRestore'], #endif glMultiDrawElementsWEBGL: (mode, counts, type, offsets, drawcount) => { #if MEMORY64 @@ -3983,7 +3984,7 @@ for (/**@suppress{duplicate}*/var i = 0; i < {{{ GL_POOL_TEMP_BUFFERS_SIZE }}}; glMultiDrawElementsInstancedWEBGL__sig: 'vipippi', glMultiDrawElementsInstancedANGLE: 'glMultiDrawElementsInstancedWEBGL', #if MEMORY64 - glMultiDrawElementsInstancedWEBGL__deps: ['$convertOffsets', 'stackSave', 'stackRestore'], + glMultiDrawElementsInstancedWEBGL__deps: ['$convertOffsets', '$stackSave', '$stackRestore'], #endif glMultiDrawElementsInstancedWEBGL: (mode, counts, type, offsets, instanceCounts, drawcount) => { #if MEMORY64 diff --git a/src/settings_internal.js b/src/settings_internal.js index 13b2c7a98aeef..06d320f69f905 100644 --- a/src/settings_internal.js +++ b/src/settings_internal.js @@ -173,7 +173,7 @@ var SUPPORTS_PROMISE_ANY = false; // Wasm backend symbols that are considered system symbols and don't // have the normal C symbol name mangled applied (== prefix with an underscore) // (Also implicily on this list is any function that starts with string "dynCall_") -var WASM_SYSTEM_EXPORTS = ['stackAlloc', 'stackSave', 'stackRestore', 'getTempRet0', 'setTempRet0']; +var WASM_SYSTEM_EXPORTS = ['getTempRet0', 'setTempRet0']; // Internal: value of -flto argument (either full or thin) var LTO = 0; diff --git a/system/lib/compiler-rt/stack_ops.S b/system/lib/compiler-rt/stack_ops.S index b56b1dd524d69..9d1913d7219e3 100644 --- a/system/lib/compiler-rt/stack_ops.S +++ b/system/lib/compiler-rt/stack_ops.S @@ -1,6 +1,5 @@ -.globl stackSave -.globl stackRestore -.globl stackAlloc +.globl _emscripten_stack_restore +.globl _emscripten_stack_alloc .globl emscripten_stack_get_current #ifdef __wasm64__ @@ -13,19 +12,14 @@ .globaltype __stack_pointer, PTR -stackSave: - .functype stackSave() -> (PTR) - global.get __stack_pointer - end_function - -stackRestore: - .functype stackRestore(PTR) -> () +_emscripten_stack_restore: + .functype _emscripten_stack_restore(PTR) -> () local.get 0 global.set __stack_pointer end_function -stackAlloc: - .functype stackAlloc(PTR) -> (PTR) +_emscripten_stack_alloc: + .functype _emscripten_stack_alloc(PTR) -> (PTR) .local PTR, PTR global.get __stack_pointer # Get arg 0 -> number of bytes to allocate @@ -44,4 +38,3 @@ emscripten_stack_get_current: .functype emscripten_stack_get_current () -> (PTR) global.get __stack_pointer end_function - diff --git a/test/core/stackAlloc.cpp b/test/core/test_stackAlloc.c similarity index 96% rename from test/core/stackAlloc.cpp rename to test/core/test_stackAlloc.c index d01738040b1b4..b7d994048833b 100644 --- a/test/core/stackAlloc.cpp +++ b/test/core/test_stackAlloc.c @@ -5,6 +5,8 @@ #include +EM_JS_DEPS(deps, "$stackSave,$stackAlloc"); + int main() { EM_ASM({ var size = 128; diff --git a/test/core/stackAlloc.out b/test/core/test_stackAlloc.out similarity index 100% rename from test/core/stackAlloc.out rename to test/core/test_stackAlloc.out diff --git a/test/other/metadce/test_metadce_cxx_ctors1.exports b/test/other/metadce/test_metadce_cxx_ctors1.exports index 6f3a3efdc330d..030579969421a 100644 --- a/test/other/metadce/test_metadce_cxx_ctors1.exports +++ b/test/other/metadce/test_metadce_cxx_ctors1.exports @@ -1,13 +1,13 @@ __cxa_is_pointer_type __indirect_function_table __wasm_call_ctors +_emscripten_stack_alloc +_emscripten_stack_restore dynCall_iiiiiijj dynCall_iiiiij dynCall_iiiiijj dynCall_jiji dynCall_viijii +emscripten_stack_get_current main memory -stackAlloc -stackRestore -stackSave diff --git a/test/other/metadce/test_metadce_cxx_ctors1.size b/test/other/metadce/test_metadce_cxx_ctors1.size index 505d8470fd322..174bcfbdfd39b 100644 --- a/test/other/metadce/test_metadce_cxx_ctors1.size +++ b/test/other/metadce/test_metadce_cxx_ctors1.size @@ -1 +1 @@ -125815 +125860 diff --git a/test/other/metadce/test_metadce_cxx_ctors2.exports b/test/other/metadce/test_metadce_cxx_ctors2.exports index b490f6067f8be..8e1309496644e 100644 --- a/test/other/metadce/test_metadce_cxx_ctors2.exports +++ b/test/other/metadce/test_metadce_cxx_ctors2.exports @@ -1,12 +1,12 @@ __cxa_is_pointer_type __indirect_function_table +_emscripten_stack_alloc +_emscripten_stack_restore dynCall_iiiiiijj dynCall_iiiiij dynCall_iiiiijj dynCall_jiji dynCall_viijii +emscripten_stack_get_current main memory -stackAlloc -stackRestore -stackSave diff --git a/test/other/metadce/test_metadce_cxx_ctors2.size b/test/other/metadce/test_metadce_cxx_ctors2.size index ccc0fc5940be7..059fa5851559e 100644 --- a/test/other/metadce/test_metadce_cxx_ctors2.size +++ b/test/other/metadce/test_metadce_cxx_ctors2.size @@ -1 +1 @@ -125274 +125319 diff --git a/test/other/metadce/test_metadce_cxx_except.exports b/test/other/metadce/test_metadce_cxx_except.exports index befddd6bf9112..2ecb7a3e5efe5 100644 --- a/test/other/metadce/test_metadce_cxx_except.exports +++ b/test/other/metadce/test_metadce_cxx_except.exports @@ -5,16 +5,16 @@ __cxa_increment_exception_refcount __cxa_is_pointer_type __indirect_function_table __wasm_call_ctors +_emscripten_stack_alloc +_emscripten_stack_restore dynCall_iiiiiijj dynCall_iiiiij dynCall_iiiiijj dynCall_jiiii dynCall_jiji dynCall_viijii +emscripten_stack_get_current main memory setTempRet0 setThrew -stackAlloc -stackRestore -stackSave diff --git a/test/other/metadce/test_metadce_cxx_except.gzsize b/test/other/metadce/test_metadce_cxx_except.gzsize index 636cf90353a99..5d468dd839acd 100644 --- a/test/other/metadce/test_metadce_cxx_except.gzsize +++ b/test/other/metadce/test_metadce_cxx_except.gzsize @@ -1 +1 @@ -10931 +10942 diff --git a/test/other/metadce/test_metadce_cxx_except.jssize b/test/other/metadce/test_metadce_cxx_except.jssize index 8ba1476eb86fc..c2e3b139332ef 100644 --- a/test/other/metadce/test_metadce_cxx_except.jssize +++ b/test/other/metadce/test_metadce_cxx_except.jssize @@ -1 +1 @@ -28115 +28148 diff --git a/test/other/metadce/test_metadce_cxx_except.size b/test/other/metadce/test_metadce_cxx_except.size index d94c8580123da..07f3ee7a76196 100644 --- a/test/other/metadce/test_metadce_cxx_except.size +++ b/test/other/metadce/test_metadce_cxx_except.size @@ -1 +1 @@ -168051 +168096 diff --git a/test/other/metadce/test_metadce_cxx_except_wasm.exports b/test/other/metadce/test_metadce_cxx_except_wasm.exports index cb78451acdf4a..5555bb2a116cb 100644 --- a/test/other/metadce/test_metadce_cxx_except_wasm.exports +++ b/test/other/metadce/test_metadce_cxx_except_wasm.exports @@ -1,6 +1,7 @@ __indirect_function_table __trap __wasm_call_ctors +_emscripten_stack_alloc dynCall_iiiiiijj dynCall_iiiiij dynCall_iiiiijj @@ -8,4 +9,3 @@ dynCall_jiji dynCall_viijii main memory -stackAlloc diff --git a/test/other/metadce/test_metadce_cxx_except_wasm.size b/test/other/metadce/test_metadce_cxx_except_wasm.size index 777d72a556247..2d95c1e699aeb 100644 --- a/test/other/metadce/test_metadce_cxx_except_wasm.size +++ b/test/other/metadce/test_metadce_cxx_except_wasm.size @@ -1 +1 @@ -139189 +139202 diff --git a/test/other/metadce/test_metadce_cxx_mangle.exports b/test/other/metadce/test_metadce_cxx_mangle.exports index a2b0a1368b950..486935c4f6ff8 100644 --- a/test/other/metadce/test_metadce_cxx_mangle.exports +++ b/test/other/metadce/test_metadce_cxx_mangle.exports @@ -6,17 +6,17 @@ __cxa_increment_exception_refcount __cxa_is_pointer_type __indirect_function_table __wasm_call_ctors +_emscripten_stack_alloc +_emscripten_stack_restore dynCall_iiiiiijj dynCall_iiiiij dynCall_iiiiijj dynCall_jiiii dynCall_jiji dynCall_viijii +emscripten_stack_get_current free main memory setTempRet0 setThrew -stackAlloc -stackRestore -stackSave diff --git a/test/other/metadce/test_metadce_cxx_mangle.gzsize b/test/other/metadce/test_metadce_cxx_mangle.gzsize index 2ba0481d05fa9..94a39828fcc98 100644 --- a/test/other/metadce/test_metadce_cxx_mangle.gzsize +++ b/test/other/metadce/test_metadce_cxx_mangle.gzsize @@ -1 +1 @@ -10939 +10949 diff --git a/test/other/metadce/test_metadce_cxx_mangle.jssize b/test/other/metadce/test_metadce_cxx_mangle.jssize index c08574dd53d92..07d91666fb039 100644 --- a/test/other/metadce/test_metadce_cxx_mangle.jssize +++ b/test/other/metadce/test_metadce_cxx_mangle.jssize @@ -1 +1 @@ -28116 +28149 diff --git a/test/other/metadce/test_metadce_cxx_mangle.size b/test/other/metadce/test_metadce_cxx_mangle.size index 5547af12fe75b..ed875d227b9cd 100644 --- a/test/other/metadce/test_metadce_cxx_mangle.size +++ b/test/other/metadce/test_metadce_cxx_mangle.size @@ -1 +1 @@ -223535 +223580 diff --git a/test/other/metadce/test_metadce_cxx_noexcept.exports b/test/other/metadce/test_metadce_cxx_noexcept.exports index 6f3a3efdc330d..030579969421a 100644 --- a/test/other/metadce/test_metadce_cxx_noexcept.exports +++ b/test/other/metadce/test_metadce_cxx_noexcept.exports @@ -1,13 +1,13 @@ __cxa_is_pointer_type __indirect_function_table __wasm_call_ctors +_emscripten_stack_alloc +_emscripten_stack_restore dynCall_iiiiiijj dynCall_iiiiij dynCall_iiiiijj dynCall_jiji dynCall_viijii +emscripten_stack_get_current main memory -stackAlloc -stackRestore -stackSave diff --git a/test/other/metadce/test_metadce_cxx_noexcept.size b/test/other/metadce/test_metadce_cxx_noexcept.size index 0019d734ff978..e7ab461ebbf11 100644 --- a/test/other/metadce/test_metadce_cxx_noexcept.size +++ b/test/other/metadce/test_metadce_cxx_noexcept.size @@ -1 +1 @@ -128612 +128657 diff --git a/test/other/metadce/test_metadce_cxx_wasmfs.exports b/test/other/metadce/test_metadce_cxx_wasmfs.exports index 1b2e555b7b029..ae05d89424427 100644 --- a/test/other/metadce/test_metadce_cxx_wasmfs.exports +++ b/test/other/metadce/test_metadce_cxx_wasmfs.exports @@ -1,6 +1,8 @@ __cxa_is_pointer_type __indirect_function_table __wasm_call_ctors +_emscripten_stack_alloc +_emscripten_stack_restore dynCall_iiiiiijj dynCall_iiiiij dynCall_iiiiijj @@ -9,8 +11,6 @@ dynCall_iij dynCall_ji dynCall_jiji dynCall_viijii +emscripten_stack_get_current main memory -stackAlloc -stackRestore -stackSave diff --git a/test/other/metadce/test_metadce_cxx_wasmfs.size b/test/other/metadce/test_metadce_cxx_wasmfs.size index 6234e97c2df17..5f5aca75350df 100644 --- a/test/other/metadce/test_metadce_cxx_wasmfs.size +++ b/test/other/metadce/test_metadce_cxx_wasmfs.size @@ -1 +1 @@ -165806 +165851 diff --git a/test/other/metadce/test_metadce_hello_O0.exports b/test/other/metadce/test_metadce_hello_O0.exports index 0fd19243481ae..2ca637cc2dc99 100644 --- a/test/other/metadce/test_metadce_hello_O0.exports +++ b/test/other/metadce/test_metadce_hello_O0.exports @@ -1,5 +1,7 @@ __indirect_function_table __wasm_call_ctors +_emscripten_stack_alloc +_emscripten_stack_restore dynCall_jiji emscripten_stack_get_base emscripten_stack_get_current @@ -9,6 +11,3 @@ emscripten_stack_init fflush main memory -stackAlloc -stackRestore -stackSave diff --git a/test/other/metadce/test_metadce_hello_O0.funcs b/test/other/metadce/test_metadce_hello_O0.funcs index f9363c2b54a6d..6ac1da0aee339 100644 --- a/test/other/metadce/test_metadce_hello_O0.funcs +++ b/test/other/metadce/test_metadce_hello_O0.funcs @@ -22,6 +22,8 @@ $__unlockfile $__vfprintf_internal $__wasi_syscall_ret $__wasm_call_ctors +$_emscripten_stack_alloc +$_emscripten_stack_restore $dynCall_jiji $emscripten_stack_get_base $emscripten_stack_get_current @@ -48,9 +50,6 @@ $pop_arg_long_double $printf $printf_core $setTempRet0 -$stackAlloc -$stackRestore -$stackSave $strnlen $vfprintf $wcrtomb diff --git a/test/other/metadce/test_metadce_hello_O0.gzsize b/test/other/metadce/test_metadce_hello_O0.gzsize index 252c7755b33a1..f70da493eb9af 100644 --- a/test/other/metadce/test_metadce_hello_O0.gzsize +++ b/test/other/metadce/test_metadce_hello_O0.gzsize @@ -1 +1 @@ -8116 +8115 diff --git a/test/other/metadce/test_metadce_hello_O0.size b/test/other/metadce/test_metadce_hello_O0.size index 0df12313d99f3..517aafb53c028 100644 --- a/test/other/metadce/test_metadce_hello_O0.size +++ b/test/other/metadce/test_metadce_hello_O0.size @@ -1 +1 @@ -12118 +12126 diff --git a/test/other/metadce/test_metadce_hello_O1.exports b/test/other/metadce/test_metadce_hello_O1.exports index 4a0235b88d1c2..4f4b6313b5239 100644 --- a/test/other/metadce/test_metadce_hello_O1.exports +++ b/test/other/metadce/test_metadce_hello_O1.exports @@ -1,8 +1,8 @@ __indirect_function_table __wasm_call_ctors +_emscripten_stack_alloc +_emscripten_stack_restore dynCall_jiji +emscripten_stack_get_current main memory -stackAlloc -stackRestore -stackSave diff --git a/test/other/metadce/test_metadce_hello_O1.funcs b/test/other/metadce/test_metadce_hello_O1.funcs index a5befc6e1c66e..817a6a71c68ae 100644 --- a/test/other/metadce/test_metadce_hello_O1.funcs +++ b/test/other/metadce/test_metadce_hello_O1.funcs @@ -11,7 +11,10 @@ $__towrite $__unlockfile $__wasi_syscall_ret $__wasm_call_ctors +$_emscripten_stack_alloc +$_emscripten_stack_restore $dynCall_jiji +$emscripten_stack_get_current $fputs $fwrite $getTempRet0 @@ -19,7 +22,4 @@ $legalstub$dynCall_jiji $main $puts $setTempRet0 -$stackAlloc -$stackRestore -$stackSave $strlen diff --git a/test/other/metadce/test_metadce_hello_O1.size b/test/other/metadce/test_metadce_hello_O1.size index 6ee72971bf63e..153118cbcff36 100644 --- a/test/other/metadce/test_metadce_hello_O1.size +++ b/test/other/metadce/test_metadce_hello_O1.size @@ -1 +1 @@ -2403 +2449 diff --git a/test/other/metadce/test_metadce_hello_O2.exports b/test/other/metadce/test_metadce_hello_O2.exports index 4a0235b88d1c2..4f4b6313b5239 100644 --- a/test/other/metadce/test_metadce_hello_O2.exports +++ b/test/other/metadce/test_metadce_hello_O2.exports @@ -1,8 +1,8 @@ __indirect_function_table __wasm_call_ctors +_emscripten_stack_alloc +_emscripten_stack_restore dynCall_jiji +emscripten_stack_get_current main memory -stackAlloc -stackRestore -stackSave diff --git a/test/other/metadce/test_metadce_hello_O2.funcs b/test/other/metadce/test_metadce_hello_O2.funcs index c1126cda2cfe0..a16df54d7de2c 100644 --- a/test/other/metadce/test_metadce_hello_O2.funcs +++ b/test/other/metadce/test_metadce_hello_O2.funcs @@ -5,8 +5,8 @@ $__stdio_write $__towrite $__wasi_syscall_ret $__wasm_call_ctors +$_emscripten_stack_alloc +$_emscripten_stack_restore +$emscripten_stack_get_current $legalstub$dynCall_jiji $main -$stackAlloc -$stackRestore -$stackSave diff --git a/test/other/metadce/test_metadce_hello_O2.size b/test/other/metadce/test_metadce_hello_O2.size index b39a36a7c18b4..46ff1032560fb 100644 --- a/test/other/metadce/test_metadce_hello_O2.size +++ b/test/other/metadce/test_metadce_hello_O2.size @@ -1 +1 @@ -2018 +2064 diff --git a/test/other/metadce/test_metadce_hello_dylink.exports b/test/other/metadce/test_metadce_hello_dylink.exports index 399c7d1af5298..9aa298858fd18 100644 --- a/test/other/metadce/test_metadce_hello_dylink.exports +++ b/test/other/metadce/test_metadce_hello_dylink.exports @@ -1,9 +1,9 @@ __wasm_apply_data_relocs __wasm_call_ctors +_emscripten_stack_alloc +_emscripten_stack_restore dynCall_jiji +emscripten_stack_get_current main malloc setThrew -stackAlloc -stackRestore -stackSave diff --git a/test/other/metadce/test_metadce_hello_dylink.funcs b/test/other/metadce/test_metadce_hello_dylink.funcs index 5209aab16c314..4ec6c20d0ee6c 100644 --- a/test/other/metadce/test_metadce_hello_dylink.funcs +++ b/test/other/metadce/test_metadce_hello_dylink.funcs @@ -6,11 +6,11 @@ $__towrite $__wasm_apply_data_relocs $__wasm_apply_global_relocs $__wasm_call_ctors +$_emscripten_stack_alloc +$_emscripten_stack_restore $dlmalloc +$emscripten_stack_get_current $legalstub$dynCall_jiji $main $sbrk $setThrew -$stackAlloc -$stackRestore -$stackSave diff --git a/test/other/metadce/test_metadce_hello_dylink.gzsize b/test/other/metadce/test_metadce_hello_dylink.gzsize index 91f10036677a4..e5087067ac0b7 100644 --- a/test/other/metadce/test_metadce_hello_dylink.gzsize +++ b/test/other/metadce/test_metadce_hello_dylink.gzsize @@ -1 +1 @@ -6428 +6431 diff --git a/test/other/metadce/test_metadce_hello_dylink.jssize b/test/other/metadce/test_metadce_hello_dylink.jssize index aa22e7f865eec..a5eaeb42ef39c 100644 --- a/test/other/metadce/test_metadce_hello_dylink.jssize +++ b/test/other/metadce/test_metadce_hello_dylink.jssize @@ -1 +1 @@ -14235 +14280 diff --git a/test/other/metadce/test_metadce_hello_dylink.size b/test/other/metadce/test_metadce_hello_dylink.size index 7c08534bc3972..a82f43e512540 100644 --- a/test/other/metadce/test_metadce_hello_dylink.size +++ b/test/other/metadce/test_metadce_hello_dylink.size @@ -1 +1 @@ -9370 +9415 diff --git a/test/other/metadce/test_metadce_mem_O3.funcs b/test/other/metadce/test_metadce_mem_O3.funcs index aa0174861bf05..e9c1f0cd2f18b 100644 --- a/test/other/metadce/test_metadce_mem_O3.funcs +++ b/test/other/metadce/test_metadce_mem_O3.funcs @@ -1,4 +1,4 @@ $__wasm_call_ctors +$_emscripten_stack_alloc $main $sbrk -$stackAlloc diff --git a/test/other/metadce/test_metadce_mem_O3_grow.funcs b/test/other/metadce/test_metadce_mem_O3_grow.funcs index aa0174861bf05..e9c1f0cd2f18b 100644 --- a/test/other/metadce/test_metadce_mem_O3_grow.funcs +++ b/test/other/metadce/test_metadce_mem_O3_grow.funcs @@ -1,4 +1,4 @@ $__wasm_call_ctors +$_emscripten_stack_alloc $main $sbrk -$stackAlloc diff --git a/test/other/metadce/test_metadce_minimal_64.gzsize b/test/other/metadce/test_metadce_minimal_64.gzsize index 54a4c5bed47c8..3f894f77c3f71 100644 --- a/test/other/metadce/test_metadce_minimal_64.gzsize +++ b/test/other/metadce/test_metadce_minimal_64.gzsize @@ -1 +1 @@ -1640 +1653 diff --git a/test/other/metadce/test_metadce_minimal_64.jssize b/test/other/metadce/test_metadce_minimal_64.jssize index 80b87f13ca124..fe488bfc97430 100644 --- a/test/other/metadce/test_metadce_minimal_64.jssize +++ b/test/other/metadce/test_metadce_minimal_64.jssize @@ -1 +1 @@ -3452 +3543 diff --git a/test/other/metadce/test_metadce_minimal_O0.exports b/test/other/metadce/test_metadce_minimal_O0.exports index 93399d3ef89f1..14e7e0b170e1b 100644 --- a/test/other/metadce/test_metadce_minimal_O0.exports +++ b/test/other/metadce/test_metadce_minimal_O0.exports @@ -1,5 +1,7 @@ __indirect_function_table __wasm_call_ctors +_emscripten_stack_alloc +_emscripten_stack_restore add emscripten_stack_get_base emscripten_stack_get_current @@ -9,6 +11,3 @@ emscripten_stack_init fflush global_val memory -stackAlloc -stackRestore -stackSave diff --git a/test/other/metadce/test_metadce_minimal_O0.funcs b/test/other/metadce/test_metadce_minimal_O0.funcs index 31cb98f0f2146..11070c3020bd7 100644 --- a/test/other/metadce/test_metadce_minimal_O0.funcs +++ b/test/other/metadce/test_metadce_minimal_O0.funcs @@ -5,6 +5,8 @@ $__ofl_unlock $__unlock $__unlockfile $__wasm_call_ctors +$_emscripten_stack_alloc +$_emscripten_stack_restore $add $emscripten_stack_get_base $emscripten_stack_get_current @@ -14,6 +16,3 @@ $emscripten_stack_init $fflush $getTempRet0 $setTempRet0 -$stackAlloc -$stackRestore -$stackSave diff --git a/test/other/metadce/test_metadce_minimal_O0.gzsize b/test/other/metadce/test_metadce_minimal_O0.gzsize index bc9e1b1b0d70c..c0fc3ed0f40c8 100644 --- a/test/other/metadce/test_metadce_minimal_O0.gzsize +++ b/test/other/metadce/test_metadce_minimal_O0.gzsize @@ -1 +1 @@ -6704 +6703 diff --git a/test/other/metadce/test_metadce_minimal_O0.size b/test/other/metadce/test_metadce_minimal_O0.size index 4fdb298461845..208931296142a 100644 --- a/test/other/metadce/test_metadce_minimal_O0.size +++ b/test/other/metadce/test_metadce_minimal_O0.size @@ -1 +1 @@ -887 +895 diff --git a/test/other/metadce/test_metadce_minimal_O1.exports b/test/other/metadce/test_metadce_minimal_O1.exports index c2626d769c3b9..ddeeb6613b67b 100644 --- a/test/other/metadce/test_metadce_minimal_O1.exports +++ b/test/other/metadce/test_metadce_minimal_O1.exports @@ -1,8 +1,8 @@ __indirect_function_table __wasm_call_ctors +_emscripten_stack_alloc +_emscripten_stack_restore add +emscripten_stack_get_current global_val memory -stackAlloc -stackRestore -stackSave diff --git a/test/other/metadce/test_metadce_minimal_O1.funcs b/test/other/metadce/test_metadce_minimal_O1.funcs index c58b4a2f17c1b..ab50bcd3ab79a 100644 --- a/test/other/metadce/test_metadce_minimal_O1.funcs +++ b/test/other/metadce/test_metadce_minimal_O1.funcs @@ -1,7 +1,7 @@ $__wasm_call_ctors +$_emscripten_stack_alloc +$_emscripten_stack_restore $add +$emscripten_stack_get_current $getTempRet0 $setTempRet0 -$stackAlloc -$stackRestore -$stackSave diff --git a/test/other/metadce/test_metadce_minimal_O1.size b/test/other/metadce/test_metadce_minimal_O1.size index ace9d0362138c..d8fc48a4f27cc 100644 --- a/test/other/metadce/test_metadce_minimal_O1.size +++ b/test/other/metadce/test_metadce_minimal_O1.size @@ -1 +1 @@ -255 +301 diff --git a/test/other/metadce/test_metadce_minimal_O2.exports b/test/other/metadce/test_metadce_minimal_O2.exports index c2626d769c3b9..ddeeb6613b67b 100644 --- a/test/other/metadce/test_metadce_minimal_O2.exports +++ b/test/other/metadce/test_metadce_minimal_O2.exports @@ -1,8 +1,8 @@ __indirect_function_table __wasm_call_ctors +_emscripten_stack_alloc +_emscripten_stack_restore add +emscripten_stack_get_current global_val memory -stackAlloc -stackRestore -stackSave diff --git a/test/other/metadce/test_metadce_minimal_O2.funcs b/test/other/metadce/test_metadce_minimal_O2.funcs index 5922cd8b318b5..819f7d5bf2b03 100644 --- a/test/other/metadce/test_metadce_minimal_O2.funcs +++ b/test/other/metadce/test_metadce_minimal_O2.funcs @@ -1,5 +1,5 @@ $__wasm_call_ctors +$_emscripten_stack_alloc +$_emscripten_stack_restore $add -$stackAlloc -$stackRestore -$stackSave +$emscripten_stack_get_current diff --git a/test/other/metadce/test_metadce_minimal_O2.size b/test/other/metadce/test_metadce_minimal_O2.size index 7b5813c6a7ebe..1b1c1312820bf 100644 --- a/test/other/metadce/test_metadce_minimal_O2.size +++ b/test/other/metadce/test_metadce_minimal_O2.size @@ -1 +1 @@ -234 +280 diff --git a/test/other/metadce/test_metadce_minimal_pthreads.funcs b/test/other/metadce/test_metadce_minimal_pthreads.funcs index 1fc05ee71778e..74e330096f87a 100644 --- a/test/other/metadce/test_metadce_minimal_pthreads.funcs +++ b/test/other/metadce/test_metadce_minimal_pthreads.funcs @@ -29,6 +29,8 @@ $__wasm_init_tls $_emscripten_check_mailbox $_emscripten_proxy_main $_emscripten_run_on_main_thread_js +$_emscripten_stack_alloc +$_emscripten_stack_restore $_emscripten_thread_crashed $_emscripten_thread_exit $_emscripten_thread_free_data @@ -69,6 +71,7 @@ $em_task_queue_is_empty $emscripten_current_thread_process_queued_calls $emscripten_futex_wait $emscripten_futex_wake +$emscripten_stack_get_current $emscripten_stack_set_limits $free_ctx $get_tasks_for_thread @@ -86,8 +89,5 @@ $receive_notification $remove_active_ctx $run_js_func $sbrk -$stackAlloc -$stackRestore -$stackSave $undo $unlock diff --git a/test/other/metadce/test_metadce_minimal_pthreads.gzsize b/test/other/metadce/test_metadce_minimal_pthreads.gzsize index 7b6109be438a8..8de3a927ac9fe 100644 --- a/test/other/metadce/test_metadce_minimal_pthreads.gzsize +++ b/test/other/metadce/test_metadce_minimal_pthreads.gzsize @@ -1 +1 @@ -4895 +4894 diff --git a/test/other/test_unoptimized_code_size.js.size b/test/other/test_unoptimized_code_size.js.size index 10acbb1029e02..7c36cde13f459 100644 --- a/test/other/test_unoptimized_code_size.js.size +++ b/test/other/test_unoptimized_code_size.js.size @@ -1 +1 @@ -55484 +55657 diff --git a/test/other/test_unoptimized_code_size.wasm.size b/test/other/test_unoptimized_code_size.wasm.size index 2ecd353969b9f..e8b15f251ccec 100644 --- a/test/other/test_unoptimized_code_size.wasm.size +++ b/test/other/test_unoptimized_code_size.wasm.size @@ -1 +1 @@ -12115 +12123 diff --git a/test/other/test_unoptimized_code_size_no_asserts.js.size b/test/other/test_unoptimized_code_size_no_asserts.js.size index bed7ad636453e..f6a081e281a11 100644 --- a/test/other/test_unoptimized_code_size_no_asserts.js.size +++ b/test/other/test_unoptimized_code_size_no_asserts.js.size @@ -1 +1 @@ -31480 +31743 diff --git a/test/other/test_unoptimized_code_size_no_asserts.wasm.size b/test/other/test_unoptimized_code_size_no_asserts.wasm.size index b746bba7501b9..b9f85eb3f7629 100644 --- a/test/other/test_unoptimized_code_size_no_asserts.wasm.size +++ b/test/other/test_unoptimized_code_size_no_asserts.wasm.size @@ -1 +1 @@ -11555 +11601 diff --git a/test/other/test_unoptimized_code_size_strict.js.size b/test/other/test_unoptimized_code_size_strict.js.size index fd79e0dee7a34..b12efd968ca84 100644 --- a/test/other/test_unoptimized_code_size_strict.js.size +++ b/test/other/test_unoptimized_code_size_strict.js.size @@ -1 +1 @@ -54371 +54544 diff --git a/test/other/test_unoptimized_code_size_strict.wasm.size b/test/other/test_unoptimized_code_size_strict.wasm.size index 2ecd353969b9f..e8b15f251ccec 100644 --- a/test/other/test_unoptimized_code_size_strict.wasm.size +++ b/test/other/test_unoptimized_code_size_strict.wasm.size @@ -1 +1 @@ -12115 +12123 diff --git a/test/test_core.py b/test/test_core.py index fc2feb1fda402..1b7a89280f792 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -2720,7 +2720,29 @@ def test_stack_overflow(self): self.do_runf('core/stack_overflow.c', 'Aborted(stack overflow', assert_returncode=NON_ZERO) def test_stackAlloc(self): - self.do_core_test('stackAlloc.cpp') + self.do_core_test('test_stackAlloc.c') + + def test_legacy_stack_deps(self): + # stackSave/stackRestore/stackAlloc are now normal JS library + # functions that must be $-prefixed in `__deps` lists. However, + # to support legacy code we continue to support the non-prefixed + # versions in `__deps` lists. + create_file('lib.js', ''' + addToLibrary({ + foo__deps: ['stackSave', 'stackRestore'], + foo: () => { + var a = stackSave(); + stackRestore(a); + return 0; + } + })''') + create_file('main.c', ''' + int foo(); + + int main() { + return foo(); + }''') + self.do_runf('main.c', emcc_args=['--js-library=lib.js']) def test_nestedstructs(self): src = r''' diff --git a/tools/emscripten.py b/tools/emscripten.py index b02c56e7a92bc..c35541dff56cd 100644 --- a/tools/emscripten.py +++ b/tools/emscripten.py @@ -826,16 +826,14 @@ def install_wrapper(sym): # The emscripten stack functions are called very early (by writeStackCookie) before # the runtime is initialized so we can't create these wrappers that check for # runtimeInitialized. - if sym.startswith('_asan_') or sym.startswith('emscripten_stack_'): + if sym.startswith('_asan_') or sym.startswith('emscripten_stack_') or sym.startswith('_emscripten_stack_'): return False # Likewise `__trap` can occur before the runtime is initialized since it is used in # abort. - # stackRestore is often called during stack unwinding (e.g. by invoke_xxx function) which - # runs after the runtime has exited. # pthread_self and _emscripten_proxy_execute_task_queue are currently called in some # cases after the runtime has exited. # TODO: Look into removing these, and improving our robustness around thread termination. - if sym in ('__trap', 'pthread_self', '_emscripten_proxy_execute_task_queue', 'stackRestore'): + if sym in ('__trap', 'pthread_self', '_emscripten_proxy_execute_task_queue'): return False return True @@ -950,7 +948,7 @@ def create_pointer_conversion_wrappers(metadata): # 'P' - same as above but allow `undefined` too (requires extra check) mapping = { 'sbrk': 'pP', - 'stackAlloc': 'pp', + '_emscripten_stack_alloc': 'pp', 'emscripten_builtin_malloc': 'pp', 'malloc': 'pp', 'webidl_malloc': 'pp', @@ -961,9 +959,8 @@ def create_pointer_conversion_wrappers(metadata): 'setThrew': '_p', 'free': '_p', 'webidl_free': '_p', - 'stackRestore': '_p', + '_emscripten_stack_restore': '_p', '__cxa_is_pointer_type': '_p', - 'stackSave': 'p', 'fflush': '_p', 'emscripten_stack_get_end': 'p', 'emscripten_stack_get_base': 'p', diff --git a/tools/link.py b/tools/link.py index af6ffba0bb71d..674f7c0a41960 100644 --- a/tools/link.py +++ b/tools/link.py @@ -819,6 +819,7 @@ def phase_linker_setup(options, state, newargs): if settings.PURE_WASI: settings.STANDALONE_WASM = 1 settings.WASM_BIGINT = 1 + settings.SUPPORT_LONGJMP = 0 if options.no_entry: settings.EXPECT_MAIN = 0 @@ -1301,12 +1302,12 @@ def phase_linker_setup(options, state, newargs): settings.REQUIRED_EXPORTS.append(sym) if settings.MAIN_READS_PARAMS and not settings.STANDALONE_WASM: - # callMain depends on stackAlloc - settings.REQUIRED_EXPORTS += ['stackAlloc'] + # callMain depends on _emscripten_stack_alloc + settings.REQUIRED_EXPORTS += ['_emscripten_stack_alloc'] if settings.SUPPORT_LONGJMP == 'emscripten' or not settings.DISABLE_EXCEPTION_CATCHING: # make_invoke depends on stackSave and stackRestore - settings.REQUIRED_EXPORTS += ['stackSave', 'stackRestore'] + settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$stackSave', '$stackRestore'] if settings.RELOCATABLE: # TODO(https://reviews.llvm.org/D128515): Make this mandatory once diff --git a/tools/maint/gen_sig_info.py b/tools/maint/gen_sig_info.py index 31e96eb64e68a..5ce485f0da014 100755 --- a/tools/maint/gen_sig_info.py +++ b/tools/maint/gen_sig_info.py @@ -174,10 +174,11 @@ def ignore_symbol(s, cxx): return True if s.startswith('gl') and any(s.endswith(x) for x in ('NV', 'EXT', 'WEBGL', 'ARB', 'ANGLE')): return True - if s in ('__stack_base', '__memory_base', '__table_base', '__global_base', '__heap_base', + if s in {'__stack_base', '__memory_base', '__table_base', '__global_base', '__heap_base', '__stack_pointer', '__stack_high', '__stack_low', '_load_secondary_module', '__asyncify_state', '__asyncify_data', - ): + 'stackSave', 'stackRestore', 'stackAlloc', + }: return True if cxx and s in ('__asctime_r') or s.startswith('__cxa_find_matching_catch'): return True diff --git a/tools/maint/gen_struct_info.py b/tools/maint/gen_struct_info.py index d84c44e310fc2..167c2af3f78e9 100755 --- a/tools/maint/gen_struct_info.py +++ b/tools/maint/gen_struct_info.py @@ -253,6 +253,7 @@ def inspect_headers(headers, cflags): '-sBOOTSTRAPPING_STRUCT_INFO', '-sINCOMING_MODULE_JS_API=', '-sSTRICT', + '-sSUPPORT_LONGJMP=0', '-sASSERTIONS=0'] + node_flags # Default behavior for emcc is to warn for binaryen version check mismatches