Skip to content

Commit 8147f9b

Browse files
committed
[WIP] Remove deps_info system and and the running of llvm-nm on input file. NFC
This uses a new "stub object" construct to tell the linker (wasm-ld) not only about the existence of the JS library symbols but the native symbols on which they depend (a.k.a reverse dependencies). This allows us to completely remove deps_info.py in favor of just using normal `__deps` entries in the library files. It also means we no longer need to run `llvm-nm` on the linker inputs to discover the symbols they use. Depends on: https://reviews.llvm.org/D145308 Fixes: #18875
1 parent 978e102 commit 8147f9b

18 files changed

+95
-524
lines changed

emcc.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import json
2929
import logging
3030
import os
31+
import pprint
3132
import re
3233
import shlex
3334
import shutil
@@ -50,7 +51,6 @@
5051
from tools.minimal_runtime_shell import generate_minimal_runtime_html
5152
import tools.line_endings
5253
from tools import feature_matrix
53-
from tools import deps_info
5454
from tools import js_manipulation
5555
from tools import wasm2c
5656
from tools import webassembly
@@ -1336,7 +1336,12 @@ def run(args):
13361336
js_syms = {}
13371337
if not settings.SIDE_MODULE:
13381338
js_syms = get_all_js_syms()
1339-
deps_info.append_deps_info(js_syms)
1339+
if not settings.USES_DYNAMIC_ALLOC:
1340+
for value in js_syms.values():
1341+
if 'malloc' in value:
1342+
value.remove('malloc')
1343+
if 'free' in value:
1344+
value.remove('free')
13401345

13411346
phase_calculate_system_libraries(state, linker_arguments, linker_inputs, newargs)
13421347

@@ -2093,11 +2098,6 @@ def phase_linker_setup(options, state, newargs):
20932098
settings.INCLUDE_FULL_LIBRARY = 1
20942099
settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$loadDylibs']
20952100

2096-
# If we are including the entire JS library then we know for sure we will, by definition,
2097-
# require all the reverse dependencies.
2098-
if settings.INCLUDE_FULL_LIBRARY:
2099-
default_setting('REVERSE_DEPS', 'all')
2100-
21012101
if settings.MAIN_MODULE == 1 or settings.SIDE_MODULE == 1:
21022102
settings.LINKABLE = 1
21032103

site/source/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.rst

-4
Original file line numberDiff line numberDiff line change
@@ -596,9 +596,6 @@ See the `library_*.js`_ files for other examples.
596596
This is useful when all the implemented methods use a JavaScript
597597
singleton containing helper methods. See ``library_webgl.js`` for
598598
an example.
599-
- If a JavaScript library depends on a compiled C library (like most
600-
of *libc*), you must edit `src/deps_info.json`_. Search for
601-
"deps_info" in `tools/system_libs.py`_.
602599
- The keys passed into `mergeInto` generate functions that are prefixed
603600
by ``_``. In other words ``my_func: function() {},`` becomes
604601
``function _my_func() {}``, as all C methods in emscripten have a ``_`` prefix. Keys starting with ``$`` have the ``$``
@@ -810,7 +807,6 @@ you can give it a try. See `Emnapi documentation`_ for more details.
810807

811808
.. _library.js: https://github.com/emscripten-core/emscripten/blob/main/src/library.js
812809
.. _test_js_libraries: https://github.com/emscripten-core/emscripten/blob/1.29.12/tests/test_core.py#L5043
813-
.. _src/deps_info.json: https://github.com/emscripten-core/emscripten/blob/main/src/deps_info.json
814810
.. _tools/system_libs.py: https://github.com/emscripten-core/emscripten/blob/main/tools/system_libs.py
815811
.. _library_\*.js: https://github.com/emscripten-core/emscripten/tree/main/src
816812
.. _test_add_function in test/test_core.py: https://github.com/emscripten-core/emscripten/blob/1.29.12/tests/test_core.py#L6237

src/jsifier.js

+21-2
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,25 @@ function isDefined(symName) {
6666
return false;
6767
}
6868

69+
function getTransitiveDeps(symbol) {
70+
const transitiveDeps = new Set();
71+
const seen = new Set();
72+
const toVisit = [symbol];
73+
while (toVisit.length) {
74+
const sym = toVisit.pop();
75+
if (!seen.has(sym)) {
76+
let directDeps = LibraryManager.library[sym + '__deps'] || [];
77+
directDeps = directDeps.filter((d) => typeof d === 'string');
78+
if (directDeps.length) {
79+
directDeps.forEach(transitiveDeps.add, transitiveDeps);
80+
toVisit.push(...directDeps);
81+
}
82+
seen.add(sym);
83+
}
84+
}
85+
return Array.from(transitiveDeps);
86+
}
87+
6988
function runJSify() {
7089
const libraryItems = [];
7190
const symbolDeps = {};
@@ -249,8 +268,8 @@ function ${name}(${args}) {
249268

250269
if (symbolsOnly) {
251270
if (!isJsOnlySymbol(symbol) && LibraryManager.library.hasOwnProperty(symbol)) {
252-
externalDeps = deps.filter((d) => !isJsOnlySymbol(d) && !(d in LibraryManager.library) && typeof d === 'string');
253-
symbolDeps[symbol] = externalDeps;
271+
var transtiveDeps = getTransitiveDeps(symbol);
272+
symbolDeps[symbol] = transtiveDeps.filter((d) => !isJsOnlySymbol(d) && !(d in LibraryManager.library));
254273
}
255274
return;
256275
}

src/library.js

+7-4
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ mergeInto(LibraryManager.library, {
588588

589589
// TODO: Initialize these to defaults on startup from system settings.
590590
// Note: glibc has one fewer underscore for all of these. Also used in other related functions (timegm)
591-
_tzset_js__deps: ['$allocateUTF8'],
591+
_tzset_js__deps: ['$allocateUTF8', 'malloc'],
592592
_tzset_js__internal: true,
593593
_tzset_js__sig: 'vppp',
594594
_tzset_js: function(timezone, daylight, tzname) {
@@ -1237,6 +1237,7 @@ mergeInto(LibraryManager.library, {
12371237

12381238
#if SUPPORT_LONGJMP == 'emscripten'
12391239
_emscripten_throw_longjmp__sig: 'v',
1240+
_emscripten_throw_longjmp__deps: ['setThrew'],
12401241
_emscripten_throw_longjmp: function() {
12411242
#if EXCEPTION_STACK_TRACES
12421243
throw new EmscriptenSjLj;
@@ -1746,7 +1747,7 @@ mergeInto(LibraryManager.library, {
17461747
return { family: family, addr: addr, port: port };
17471748
},
17481749
$writeSockaddr__docs: '/** @param {number=} addrlen */',
1749-
$writeSockaddr__deps: ['$Sockets', '$inetPton4', '$inetPton6', '$zeroMemory'],
1750+
$writeSockaddr__deps: ['$Sockets', '$inetPton4', '$inetPton6', '$zeroMemory', 'htons'],
17501751
$writeSockaddr: function (sa, family, addr, port, addrlen) {
17511752
switch (family) {
17521753
case {{{ cDefs.AF_INET }}}:
@@ -1887,7 +1888,7 @@ mergeInto(LibraryManager.library, {
18871888
return 0;
18881889
},
18891890

1890-
getaddrinfo__deps: ['$Sockets', '$DNS', '$inetPton4', '$inetNtop4', '$inetPton6', '$inetNtop6', '$writeSockaddr'],
1891+
getaddrinfo__deps: ['$Sockets', '$DNS', '$inetPton4', '$inetNtop4', '$inetPton6', '$inetNtop6', '$writeSockaddr', 'malloc', 'htonl'],
18911892
getaddrinfo__proxy: 'sync',
18921893
getaddrinfo__sig: 'ipppp',
18931894
getaddrinfo: function(node, service, hint, out) {
@@ -2343,6 +2344,7 @@ mergeInto(LibraryManager.library, {
23432344
// Mark as `noleakcheck` otherwise lsan will report the last returned string
23442345
// as a leak.
23452346
emscripten_run_script_string__noleakcheck: true,
2347+
emscripten_run_script_string__deps: ['malloc', 'free'],
23462348
emscripten_run_script_string__sig: 'pp',
23472349
emscripten_run_script_string: function(ptr) {
23482350
{{{ makeEval("var s = eval(UTF8ToString(ptr));") }}}
@@ -2662,6 +2664,7 @@ mergeInto(LibraryManager.library, {
26622664
// using builtin_malloc to avoid LSan reporting these as leaks.
26632665
emscripten_get_compiler_setting__noleakcheck: true,
26642666
emscripten_get_compiler_setting__sig: 'pp',
2667+
emscripten_get_compiler_setting__deps: ['malloc'],
26652668
emscripten_get_compiler_setting: function(name) {
26662669
#if RETAIN_COMPILER_SETTINGS
26672670
name = UTF8ToString(name);
@@ -2847,7 +2850,7 @@ mergeInto(LibraryManager.library, {
28472850

28482851
// Look up the function name from our stack frame cache with our PC representation.
28492852
#if USE_OFFSET_CONVERTER
2850-
emscripten_pc_get_function__deps: ['$UNWIND_CACHE', 'free', '$allocateUTF8'],
2853+
emscripten_pc_get_function__deps: ['$UNWIND_CACHE', 'free', 'malloc', '$allocateUTF8'],
28512854
// Don't treat allocation of _emscripten_pc_get_function.ret as a leak
28522855
emscripten_pc_get_function__noleakcheck: true,
28532856
emscripten_pc_get_function__sig: 'pp',

src/library_async.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ mergeInto(LibraryManager.library, {
489489
},
490490

491491
emscripten_wget_data__sig: 'vpppp',
492-
emscripten_wget_data__deps: ['$asyncLoad', 'malloc'],
492+
emscripten_wget_data__deps: ['$asyncLoad', 'malloc', 'free'],
493493
emscripten_wget_data: function(url, pbuffer, pnum, perror) {
494494
return Asyncify.handleSleep((wakeUp) => {
495495
asyncLoad(UTF8ToString(url), (byteArray) => {

src/library_exceptions.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ var LibraryExceptions = {
224224
return type;
225225
},
226226

227-
__cxa_begin_catch__deps: ['$exceptionCaught', '$exception_addRef', '$uncaughtExceptionCount'],
227+
__cxa_begin_catch__deps: ['$exceptionCaught', '$exception_addRef', '$uncaughtExceptionCount', '__cxa_can_catch', 'setTempRet0'],
228228
__cxa_begin_catch__sig: 'pp',
229229
__cxa_begin_catch: function(ptr) {
230230
var info = new ExceptionInfo(ptr);

src/library_glew.js

+1
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ var LibraryGLEW = {
112112
},
113113
},
114114

115+
glewInit__deps: ['malloc'],
115116
glewInit: function() { return 0; },
116117

117118
glewIsSupported: function(name) {

src/library_glfw.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1121,7 +1121,7 @@ var LibraryGLFW = {
11211121
/*******************************************************************************
11221122
* GLFW FUNCTIONS
11231123
******************************************************************************/
1124-
glfwInit__deps: ['emscripten_get_device_pixel_ratio'],
1124+
glfwInit__deps: ['emscripten_get_device_pixel_ratio', 'malloc', 'free'],
11251125
glfwInit__sig: 'i',
11261126
glfwInit: function() {
11271127
if (GLFW.windows) return 1; // GL_TRUE
@@ -1269,6 +1269,7 @@ var LibraryGLFW = {
12691269
glfwPostEmptyEvent__sig: 'v',
12701270
glfwPostEmptyEvent: function() {},
12711271

1272+
glfwGetMonitors__deps: ['malloc'],
12721273
glfwGetMonitors__sig: 'ii',
12731274
glfwGetMonitors: function(count) {
12741275
{{{ makeSetValue('count', '0', '1', 'i32') }}};

src/library_html5.js

+14-14
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ var LibraryHTML5 = {
235235
},
236236
},
237237

238-
$registerKeyEventCallback__deps: ['$JSEvents', '$findEventTarget'],
238+
$registerKeyEventCallback__deps: ['$JSEvents', '$findEventTarget', 'malloc'],
239239
$registerKeyEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
240240
#if PTHREADS
241241
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -506,7 +506,7 @@ var LibraryHTML5 = {
506506
#endif
507507
},
508508

509-
$registerMouseEventCallback__deps: ['$JSEvents', '$fillMouseEventData', '$findEventTarget'],
509+
$registerMouseEventCallback__deps: ['$JSEvents', '$fillMouseEventData', '$findEventTarget', 'malloc'],
510510
$registerMouseEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
511511
#if PTHREADS
512512
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -629,7 +629,7 @@ var LibraryHTML5 = {
629629
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
630630
},
631631

632-
$registerWheelEventCallback__deps: ['$JSEvents', '$fillMouseEventData', '$findEventTarget'],
632+
$registerWheelEventCallback__deps: ['$JSEvents', '$fillMouseEventData', '$findEventTarget', 'malloc'],
633633
$registerWheelEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
634634
#if PTHREADS
635635
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -706,7 +706,7 @@ var LibraryHTML5 = {
706706
}
707707
},
708708

709-
$registerUiEventCallback__deps: ['$JSEvents', '$findEventTarget'],
709+
$registerUiEventCallback__deps: ['$JSEvents', '$findEventTarget', 'malloc'],
710710
$registerUiEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
711711
#if PTHREADS
712712
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -784,7 +784,7 @@ var LibraryHTML5 = {
784784
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
785785
},
786786

787-
$registerFocusEventCallback__deps: ['$JSEvents', '$findEventTarget'],
787+
$registerFocusEventCallback__deps: ['$JSEvents', '$findEventTarget', 'malloc'],
788788
$registerFocusEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
789789
#if PTHREADS
790790
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -933,7 +933,7 @@ var LibraryHTML5 = {
933933
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenDeviceMotionEvent.rotationRateGamma, 'rr["gamma"]', 'double') }}};
934934
},
935935

936-
$registerDeviceMotionEventCallback__deps: ['$JSEvents', '$fillDeviceMotionEventData', '$findEventTarget'],
936+
$registerDeviceMotionEventCallback__deps: ['$JSEvents', '$fillDeviceMotionEventData', '$findEventTarget', 'malloc'],
937937
$registerDeviceMotionEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
938938
#if PTHREADS
939939
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -1003,7 +1003,7 @@ var LibraryHTML5 = {
10031003
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenOrientationChangeEvent.orientationAngle, 'orientation', 'i32') }}};
10041004
},
10051005

1006-
$registerOrientationChangeEventCallback__deps: ['$JSEvents', '$fillOrientationChangeEventData', '$findEventTarget'],
1006+
$registerOrientationChangeEventCallback__deps: ['$JSEvents', '$fillOrientationChangeEventData', '$findEventTarget', 'malloc'],
10071007
$registerOrientationChangeEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
10081008
#if PTHREADS
10091009
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -1127,7 +1127,7 @@ var LibraryHTML5 = {
11271127
}
11281128
},
11291129

1130-
$registerFullscreenChangeEventCallback__deps: ['$JSEvents', '$fillFullscreenChangeEventData', '$findEventTarget'],
1130+
$registerFullscreenChangeEventCallback__deps: ['$JSEvents', '$fillFullscreenChangeEventData', '$findEventTarget', 'malloc'],
11311131
$registerFullscreenChangeEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
11321132
#if PTHREADS
11331133
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -1712,7 +1712,7 @@ var LibraryHTML5 = {
17121712
stringToUTF8(id, eventStruct + {{{ C_STRUCTS.EmscriptenPointerlockChangeEvent.id }}}, {{{ cDefs.EM_HTML5_LONG_STRING_LEN_BYTES }}});
17131713
},
17141714

1715-
$registerPointerlockChangeEventCallback__deps: ['$JSEvents', '$fillPointerlockChangeEventData', '$findEventTarget'],
1715+
$registerPointerlockChangeEventCallback__deps: ['$JSEvents', '$fillPointerlockChangeEventData', '$findEventTarget', 'malloc'],
17161716
$registerPointerlockChangeEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
17171717
#if PTHREADS
17181718
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -1965,7 +1965,7 @@ var LibraryHTML5 = {
19651965
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenVisibilityChangeEvent.visibilityState, 'visibilityState', 'i32') }}};
19661966
},
19671967

1968-
$registerVisibilityChangeEventCallback__deps: ['$JSEvents', '$fillVisibilityChangeEventData', '$findEventTarget'],
1968+
$registerVisibilityChangeEventCallback__deps: ['$JSEvents', '$fillVisibilityChangeEventData', '$findEventTarget', 'malloc'],
19691969
$registerVisibilityChangeEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
19701970
#if PTHREADS
19711971
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -2022,7 +2022,7 @@ var LibraryHTML5 = {
20222022
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
20232023
},
20242024

2025-
$registerTouchEventCallback__deps: ['$JSEvents', '$findEventTarget', '$getBoundingClientRect'],
2025+
$registerTouchEventCallback__deps: ['$JSEvents', '$findEventTarget', '$getBoundingClientRect', 'malloc'],
20262026
$registerTouchEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
20272027
#if PTHREADS
20282028
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -2184,7 +2184,7 @@ var LibraryHTML5 = {
21842184
stringToUTF8(e.mapping, eventStruct + {{{ C_STRUCTS.EmscriptenGamepadEvent.mapping }}}, {{{ cDefs.EM_HTML5_MEDIUM_STRING_LEN_BYTES }}});
21852185
},
21862186

2187-
$registerGamepadEventCallback__deps: ['$JSEvents', '$fillGamepadEventData', '$findEventTarget'],
2187+
$registerGamepadEventCallback__deps: ['$JSEvents', '$fillGamepadEventData', '$findEventTarget', 'malloc'],
21882188
$registerGamepadEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
21892189
#if PTHREADS
21902190
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -2359,7 +2359,7 @@ var LibraryHTML5 = {
23592359

23602360
emscripten_set_batterychargingchange_callback_on_thread__proxy: 'sync',
23612361
emscripten_set_batterychargingchange_callback_on_thread__sig: 'ippp',
2362-
emscripten_set_batterychargingchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$battery', 'malloc'],
2362+
emscripten_set_batterychargingchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$battery'],
23632363
emscripten_set_batterychargingchange_callback_on_thread: function(userData, callbackfunc, targetThread) {
23642364
if (!battery()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
23652365
registerBatteryEventCallback(battery(), userData, true, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_BATTERYCHARGINGCHANGE }}}, "chargingchange", targetThread);
@@ -2368,7 +2368,7 @@ var LibraryHTML5 = {
23682368

23692369
emscripten_set_batterylevelchange_callback_on_thread__proxy: 'sync',
23702370
emscripten_set_batterylevelchange_callback_on_thread__sig: 'ippp',
2371-
emscripten_set_batterylevelchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$battery', 'malloc'],
2371+
emscripten_set_batterylevelchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$battery'],
23722372
emscripten_set_batterylevelchange_callback_on_thread: function(userData, callbackfunc, targetThread) {
23732373
if (!battery()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
23742374
registerBatteryEventCallback(battery(), userData, true, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_BATTERYLEVELCHANGE }}}, "levelchange", targetThread);

src/library_syscall.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ var SyscallsLibrary = {
127127
_mmap_js__sig: 'ipiiippp',
128128
_mmap_js__deps: ['$SYSCALLS',
129129
#if FILESYSTEM && SYSCALLS_REQUIRE_FILESYSTEM
130-
'$FS',
130+
'$FS', 'emscripten_builtin_memalign',
131131
#endif
132132
],
133133
_mmap_js: function(len, prot, flags, fd, off, allocated, addr) {

src/parseTools.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -920,7 +920,7 @@ function makeMalloc(source, param) {
920920
return `_malloc(${param})`;
921921
}
922922
// It should be impossible to call some functions without malloc being
923-
// included, unless we have a deps_info.json bug. To let closure not error
923+
// included, unless we have a missing __deps entry. To let closure not error
924924
// on `_malloc` not being present, they don't call malloc and instead abort
925925
// with an error at runtime.
926926
// TODO: A more comprehensive deps system could catch this at compile time.

src/settings.js

+1-16
Original file line numberDiff line numberDiff line change
@@ -2028,22 +2028,6 @@ var IMPORTED_MEMORY = false;
20282028
// [link]
20292029
var SPLIT_MODULE = false;
20302030

2031-
// How to calculate reverse dependencies (dependencies from JS functions to
2032-
// native functions) prior to linking native code with wasm-ld. This option
2033-
// has three possible values:
2034-
// 'auto': (default) Inspect the object code passed to the linker (by running
2035-
// llvm-nm on all input) and use the map in deps_info.py to determine
2036-
// the set of additional dependencies.
2037-
// 'all' : Include the full set of possible reverse dependencies.
2038-
// 'none': No reverse dependences will be added by emscriopten. Any reverse
2039-
// dependencies will be assumed to be explicitly added to
2040-
// EXPORTED_FUNCTIONS and deps_info.py will be completely ignored.
2041-
// While 'auto' will produce a minimal set (so is good for code size), 'all'
2042-
// and 'none' will give faster link times, especially for very large projects
2043-
// (since they both avoid the running of llvm-nm on all linker inputs).
2044-
// [link]
2045-
var REVERSE_DEPS = 'auto';
2046-
20472031
// For MAIN_MODULE builds, automatically load any dynamic library dependencies
20482032
// on startup, before loading the main module.
20492033
var AUTOLOAD_DYLIBS = true;
@@ -2175,4 +2159,5 @@ var LEGACY_SETTINGS = [
21752159
['LLD_REPORT_UNDEFINED', [1], 'Disabling is no longer supported'],
21762160
['MEM_INIT_METHOD', [0], 'No longer supported'],
21772161
['USE_PTHREADS', [0, 1], 'No longer needed. Use -pthread instead'],
2162+
['REVERSE_DEPS', ['auto', 'all', 'none'], 'No longer needed'],
21782163
];

test/test_core.py

-16
Original file line numberDiff line numberDiff line change
@@ -9682,22 +9682,6 @@ def test_main_module_js_symbol(self):
96829682
self.emcc_args += ['--js-library', test_file('core/test_main_module_js_symbol.js')]
96839683
self.do_runf(test_file('core/test_main_module_js_symbol.c'))
96849684

9685-
def test_REVERSE_DEPS(self):
9686-
create_file('connect.c', '#include <sys/socket.h>\nint main() { return (int)(long)&connect; }')
9687-
self.run_process([EMCC, 'connect.c'])
9688-
base_size = os.path.getsize('a.out.wasm')
9689-
9690-
# 'auto' should work (its the default)
9691-
self.run_process([EMCC, 'connect.c', '-sREVERSE_DEPS=auto'])
9692-
9693-
# 'all' should work too although it should produce a larger binary
9694-
self.run_process([EMCC, 'connect.c', '-sREVERSE_DEPS=all'])
9695-
self.assertGreater(os.path.getsize('a.out.wasm'), base_size)
9696-
9697-
# 'none' should fail to link because the dependency on ntohs was not added.
9698-
err = self.expect_fail([EMCC, 'connect.c', '-sREVERSE_DEPS=none'])
9699-
self.assertContained('undefined symbol: ntohs', err)
9700-
97019685
def test_emscripten_async_call(self):
97029686
self.set_setting('EXIT_RUNTIME')
97039687
self.do_run_in_out_file_test(test_file('core/test_emscripten_async_call.c'))

0 commit comments

Comments
 (0)