Skip to content

Commit

Permalink
Remove deps_info system and and the running of llvm-nm on input file.…
Browse files Browse the repository at this point in the history
… 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
  • Loading branch information
sbc100 committed Mar 27, 2023
1 parent 48109af commit 99a521d
Show file tree
Hide file tree
Showing 26 changed files with 105 additions and 537 deletions.
20 changes: 9 additions & 11 deletions emcc.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@
from tools.minimal_runtime_shell import generate_minimal_runtime_html
import tools.line_endings
from tools import feature_matrix
from tools import deps_info
from tools import js_manipulation
from tools import wasm2c
from tools import webassembly
Expand Down Expand Up @@ -1336,9 +1335,14 @@ def run(args):
js_syms = {}
if not settings.SIDE_MODULE:
js_syms = get_all_js_syms()
deps_info.append_deps_info(js_syms)
if not settings.USES_DYNAMIC_ALLOC:
for value in js_syms.values():
if 'malloc' in value:
value.remove('malloc')
if 'free' in value:
value.remove('free')

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

phase_link(linker_arguments, wasm_target, js_syms)

Expand Down Expand Up @@ -2093,11 +2097,6 @@ def phase_linker_setup(options, state, newargs):
settings.INCLUDE_FULL_LIBRARY = 1
settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$loadDylibs']

# If we are including the entire JS library then we know for sure we will, by definition,
# require all the reverse dependencies.
if settings.INCLUDE_FULL_LIBRARY:
default_setting('REVERSE_DEPS', 'all')

if settings.MAIN_MODULE == 1 or settings.SIDE_MODULE == 1:
settings.LINKABLE = 1

Expand Down Expand Up @@ -3082,14 +3081,13 @@ def compile_source_file(i, input_file):


@ToolchainProfiler.profile_block('calculate system libraries')
def phase_calculate_system_libraries(state, linker_arguments, linker_inputs, newargs):
def phase_calculate_system_libraries(state, linker_arguments, newargs):
extra_files_to_link = []
# Link in ports and system libraries, if necessary
if not settings.SIDE_MODULE:
# Ports are always linked into the main module, never the side module.
extra_files_to_link += ports.get_libs(settings)
all_linker_inputs = [f for _, f in sorted(linker_inputs)] + extra_files_to_link
extra_files_to_link += system_libs.calculate(all_linker_inputs, newargs, forced=state.forced_stdlibs)
extra_files_to_link += system_libs.calculate(newargs, forced=state.forced_stdlibs)
linker_arguments.extend(extra_files_to_link)


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

.. _library.js: https://github.com/emscripten-core/emscripten/blob/main/src/library.js
.. _test_js_libraries: https://github.com/emscripten-core/emscripten/blob/1.29.12/tests/test_core.py#L5043
.. _src/deps_info.json: https://github.com/emscripten-core/emscripten/blob/main/src/deps_info.json
.. _tools/system_libs.py: https://github.com/emscripten-core/emscripten/blob/main/tools/system_libs.py
.. _library_\*.js: https://github.com/emscripten-core/emscripten/tree/main/src
.. _test_add_function in test/test_core.py: https://github.com/emscripten-core/emscripten/blob/1.29.12/tests/test_core.py#L6237
Expand Down
23 changes: 21 additions & 2 deletions src/jsifier.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,25 @@ function isDefined(symName) {
return false;
}

function getTransitiveDeps(symbol) {
const transitiveDeps = new Set();
const seen = new Set();
const toVisit = [symbol];
while (toVisit.length) {
const sym = toVisit.pop();
if (!seen.has(sym)) {
let directDeps = LibraryManager.library[sym + '__deps'] || [];
directDeps = directDeps.filter((d) => typeof d === 'string');
if (directDeps.length) {
directDeps.forEach(transitiveDeps.add, transitiveDeps);
toVisit.push(...directDeps);
}
seen.add(sym);
}
}
return Array.from(transitiveDeps);
}

function runJSify() {
const libraryItems = [];
const symbolDeps = {};
Expand Down Expand Up @@ -249,8 +268,8 @@ function ${name}(${args}) {

if (symbolsOnly) {
if (!isJsOnlySymbol(symbol) && LibraryManager.library.hasOwnProperty(symbol)) {
externalDeps = deps.filter((d) => !isJsOnlySymbol(d) && !(d in LibraryManager.library) && typeof d === 'string');
symbolDeps[symbol] = externalDeps;
var transtiveDeps = getTransitiveDeps(symbol);
symbolDeps[symbol] = transtiveDeps.filter((d) => !isJsOnlySymbol(d) && !(d in LibraryManager.library));
}
return;
}
Expand Down
12 changes: 7 additions & 5 deletions src/library.js
Original file line number Diff line number Diff line change
Expand Up @@ -569,7 +569,7 @@ mergeInto(LibraryManager.library, {

// TODO: Initialize these to defaults on startup from system settings.
// Note: glibc has one fewer underscore for all of these. Also used in other related functions (timegm)
_tzset_js__deps: ['$allocateUTF8'],
_tzset_js__deps: ['$allocateUTF8', 'malloc'],
_tzset_js__internal: true,
_tzset_js: function(timezone, daylight, tzname) {
// TODO: Use (malleable) environment variables instead of system settings.
Expand Down Expand Up @@ -1212,6 +1212,7 @@ mergeInto(LibraryManager.library, {
// ==========================================================================

#if SUPPORT_LONGJMP == 'emscripten'
_emscripten_throw_longjmp__deps: ['setThrew'],
_emscripten_throw_longjmp: function() {
#if EXCEPTION_STACK_TRACES
throw new EmscriptenSjLj;
Expand Down Expand Up @@ -1721,7 +1722,7 @@ mergeInto(LibraryManager.library, {
return { family: family, addr: addr, port: port };
},
$writeSockaddr__docs: '/** @param {number=} addrlen */',
$writeSockaddr__deps: ['$Sockets', '$inetPton4', '$inetPton6', '$zeroMemory'],
$writeSockaddr__deps: ['$Sockets', '$inetPton4', '$inetPton6', '$zeroMemory', 'htons'],
$writeSockaddr: function (sa, family, addr, port, addrlen) {
switch (family) {
case {{{ cDefs.AF_INET }}}:
Expand Down Expand Up @@ -1858,7 +1859,7 @@ mergeInto(LibraryManager.library, {
return 0;
},

getaddrinfo__deps: ['$Sockets', '$DNS', '$inetPton4', '$inetNtop4', '$inetPton6', '$inetNtop6', '$writeSockaddr'],
getaddrinfo__deps: ['$Sockets', '$DNS', '$inetPton4', '$inetNtop4', '$inetPton6', '$inetNtop6', '$writeSockaddr', 'malloc', 'htonl'],
getaddrinfo__proxy: 'sync',
getaddrinfo: function(node, service, hint, out) {
// Note getaddrinfo currently only returns a single addrinfo with ai_next defaulting to NULL. When NULL
Expand Down Expand Up @@ -2307,6 +2308,7 @@ mergeInto(LibraryManager.library, {
// Mark as `noleakcheck` otherwise lsan will report the last returned string
// as a leak.
emscripten_run_script_string__noleakcheck: true,
emscripten_run_script_string__deps: ['malloc', 'free'],
emscripten_run_script_string: function(ptr) {
{{{ makeEval("var s = eval(UTF8ToString(ptr));") }}}
if (s == null) {
Expand Down Expand Up @@ -2622,7 +2624,7 @@ mergeInto(LibraryManager.library, {
// using builtin_malloc to avoid LSan reporting these as leaks.
emscripten_get_compiler_setting__noleakcheck: true,
#if RETAIN_COMPILER_SETTINGS
emscripten_get_compiler_setting__deps: ['$allocateUTF8'],
emscripten_get_compiler_setting__deps: ['$allocateUTF8', 'malloc'],
#endif
emscripten_get_compiler_setting: function(name) {
#if RETAIN_COMPILER_SETTINGS
Expand Down Expand Up @@ -2803,7 +2805,7 @@ mergeInto(LibraryManager.library, {

// Look up the function name from our stack frame cache with our PC representation.
#if USE_OFFSET_CONVERTER
emscripten_pc_get_function__deps: ['$UNWIND_CACHE', 'free', '$allocateUTF8'],
emscripten_pc_get_function__deps: ['$UNWIND_CACHE', 'free', 'malloc', '$allocateUTF8'],
// Don't treat allocation of _emscripten_pc_get_function.ret as a leak
emscripten_pc_get_function__noleakcheck: true,
#endif
Expand Down
2 changes: 1 addition & 1 deletion src/library_async.js
Original file line number Diff line number Diff line change
Expand Up @@ -486,7 +486,7 @@ mergeInto(LibraryManager.library, {
});
},

emscripten_wget_data__deps: ['$asyncLoad', 'malloc'],
emscripten_wget_data__deps: ['$asyncLoad', 'malloc', 'free'],
emscripten_wget_data: function(url, pbuffer, pnum, perror) {
return Asyncify.handleSleep((wakeUp) => {
asyncLoad(UTF8ToString(url), (byteArray) => {
Expand Down
2 changes: 1 addition & 1 deletion src/library_exceptions.js
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ var LibraryExceptions = {
return type;
},

__cxa_begin_catch__deps: ['$exceptionCaught', '$exception_addRef', '$uncaughtExceptionCount'],
__cxa_begin_catch__deps: ['$exceptionCaught', '$exception_addRef', '$uncaughtExceptionCount', '__cxa_can_catch', 'setTempRet0'],
__cxa_begin_catch__sig: 'pp',
__cxa_begin_catch: function(ptr) {
var info = new ExceptionInfo(ptr);
Expand Down
1 change: 1 addition & 0 deletions src/library_glew.js
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ var LibraryGLEW = {
},
},

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

glewIsSupported: function(name) {
Expand Down
3 changes: 2 additions & 1 deletion src/library_glfw.js
Original file line number Diff line number Diff line change
Expand Up @@ -1121,7 +1121,7 @@ var LibraryGLFW = {
/*******************************************************************************
* GLFW FUNCTIONS
******************************************************************************/
glfwInit__deps: ['emscripten_get_device_pixel_ratio'],
glfwInit__deps: ['emscripten_get_device_pixel_ratio', 'malloc', 'free'],
glfwInit__sig: 'i',
glfwInit: function() {
if (GLFW.windows) return 1; // GL_TRUE
Expand Down Expand Up @@ -1269,6 +1269,7 @@ var LibraryGLFW = {
glfwPostEmptyEvent__sig: 'v',
glfwPostEmptyEvent: function() {},

glfwGetMonitors__deps: ['malloc'],
glfwGetMonitors__sig: 'ii',
glfwGetMonitors: function(count) {
{{{ makeSetValue('count', '0', '1', 'i32') }}};
Expand Down
28 changes: 14 additions & 14 deletions src/library_html5.js
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ var LibraryHTML5 = {
},
},

$registerKeyEventCallback__deps: ['$JSEvents', '$findEventTarget'],
$registerKeyEventCallback__deps: ['$JSEvents', '$findEventTarget', 'malloc'],
$registerKeyEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
Expand Down Expand Up @@ -503,7 +503,7 @@ var LibraryHTML5 = {
#endif
},

$registerMouseEventCallback__deps: ['$JSEvents', '$fillMouseEventData', '$findEventTarget'],
$registerMouseEventCallback__deps: ['$JSEvents', '$fillMouseEventData', '$findEventTarget', 'malloc'],
$registerMouseEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
Expand Down Expand Up @@ -616,7 +616,7 @@ var LibraryHTML5 = {
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},

$registerWheelEventCallback__deps: ['$JSEvents', '$fillMouseEventData', '$findEventTarget'],
$registerWheelEventCallback__deps: ['$JSEvents', '$fillMouseEventData', '$findEventTarget', 'malloc'],
$registerWheelEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
Expand Down Expand Up @@ -692,7 +692,7 @@ var LibraryHTML5 = {
}
},

$registerUiEventCallback__deps: ['$JSEvents', '$findEventTarget'],
$registerUiEventCallback__deps: ['$JSEvents', '$findEventTarget', 'malloc'],
$registerUiEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
Expand Down Expand Up @@ -768,7 +768,7 @@ var LibraryHTML5 = {
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},

$registerFocusEventCallback__deps: ['$JSEvents', '$findEventTarget'],
$registerFocusEventCallback__deps: ['$JSEvents', '$findEventTarget', 'malloc'],
$registerFocusEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
Expand Down Expand Up @@ -911,7 +911,7 @@ var LibraryHTML5 = {
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenDeviceMotionEvent.rotationRateGamma, 'rr["gamma"]', 'double') }}};
},

$registerDeviceMotionEventCallback__deps: ['$JSEvents', '$fillDeviceMotionEventData', '$findEventTarget'],
$registerDeviceMotionEventCallback__deps: ['$JSEvents', '$fillDeviceMotionEventData', '$findEventTarget', 'malloc'],
$registerDeviceMotionEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
Expand Down Expand Up @@ -979,7 +979,7 @@ var LibraryHTML5 = {
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenOrientationChangeEvent.orientationAngle, 'orientation', 'i32') }}};
},

$registerOrientationChangeEventCallback__deps: ['$JSEvents', '$fillOrientationChangeEventData', '$findEventTarget'],
$registerOrientationChangeEventCallback__deps: ['$JSEvents', '$fillOrientationChangeEventData', '$findEventTarget', 'malloc'],
$registerOrientationChangeEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
Expand Down Expand Up @@ -1099,7 +1099,7 @@ var LibraryHTML5 = {
}
},

$registerFullscreenChangeEventCallback__deps: ['$JSEvents', '$fillFullscreenChangeEventData', '$findEventTarget'],
$registerFullscreenChangeEventCallback__deps: ['$JSEvents', '$fillFullscreenChangeEventData', '$findEventTarget', 'malloc'],
$registerFullscreenChangeEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
Expand Down Expand Up @@ -1677,7 +1677,7 @@ var LibraryHTML5 = {
stringToUTF8(id, eventStruct + {{{ C_STRUCTS.EmscriptenPointerlockChangeEvent.id }}}, {{{ cDefs.EM_HTML5_LONG_STRING_LEN_BYTES }}});
},

$registerPointerlockChangeEventCallback__deps: ['$JSEvents', '$fillPointerlockChangeEventData', '$findEventTarget'],
$registerPointerlockChangeEventCallback__deps: ['$JSEvents', '$fillPointerlockChangeEventData', '$findEventTarget', 'malloc'],
$registerPointerlockChangeEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
Expand Down Expand Up @@ -1923,7 +1923,7 @@ var LibraryHTML5 = {
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenVisibilityChangeEvent.visibilityState, 'visibilityState', 'i32') }}};
},

$registerVisibilityChangeEventCallback__deps: ['$JSEvents', '$fillVisibilityChangeEventData', '$findEventTarget'],
$registerVisibilityChangeEventCallback__deps: ['$JSEvents', '$fillVisibilityChangeEventData', '$findEventTarget', 'malloc'],
$registerVisibilityChangeEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
Expand Down Expand Up @@ -1978,7 +1978,7 @@ var LibraryHTML5 = {
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},

$registerTouchEventCallback__deps: ['$JSEvents', '$findEventTarget', '$getBoundingClientRect'],
$registerTouchEventCallback__deps: ['$JSEvents', '$findEventTarget', '$getBoundingClientRect', 'malloc'],
$registerTouchEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
Expand Down Expand Up @@ -2136,7 +2136,7 @@ var LibraryHTML5 = {
stringToUTF8(e.mapping, eventStruct + {{{ C_STRUCTS.EmscriptenGamepadEvent.mapping }}}, {{{ cDefs.EM_HTML5_MEDIUM_STRING_LEN_BYTES }}});
},

$registerGamepadEventCallback__deps: ['$JSEvents', '$fillGamepadEventData', '$findEventTarget'],
$registerGamepadEventCallback__deps: ['$JSEvents', '$fillGamepadEventData', '$findEventTarget', 'malloc'],
$registerGamepadEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
#if PTHREADS
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
Expand Down Expand Up @@ -2304,15 +2304,15 @@ var LibraryHTML5 = {
},

emscripten_set_batterychargingchange_callback_on_thread__proxy: 'sync',
emscripten_set_batterychargingchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$battery', 'malloc'],
emscripten_set_batterychargingchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$battery'],
emscripten_set_batterychargingchange_callback_on_thread: function(userData, callbackfunc, targetThread) {
if (!battery()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
registerBatteryEventCallback(battery(), userData, true, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_BATTERYCHARGINGCHANGE }}}, "chargingchange", targetThread);
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
},

emscripten_set_batterylevelchange_callback_on_thread__proxy: 'sync',
emscripten_set_batterylevelchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$battery', 'malloc'],
emscripten_set_batterylevelchange_callback_on_thread__deps: ['$registerBatteryEventCallback', '$battery'],
emscripten_set_batterylevelchange_callback_on_thread: function(userData, callbackfunc, targetThread) {
if (!battery()) return {{{ cDefs.EMSCRIPTEN_RESULT_NOT_SUPPORTED }}};
registerBatteryEventCallback(battery(), userData, true, callbackfunc, {{{ cDefs.EMSCRIPTEN_EVENT_BATTERYLEVELCHANGE }}}, "levelchange", targetThread);
Expand Down
2 changes: 1 addition & 1 deletion src/library_openal.js
Original file line number Diff line number Diff line change
Expand Up @@ -3018,7 +3018,7 @@ var LibraryOpenAL = {
},

alGetString__proxy: 'sync',
alGetString__deps: ['$allocateUTF8'],
alGetString__deps: ['$allocateUTF8', 'malloc'],
alGetString: function(param) {
if (AL.stringCache[param]) {
return AL.stringCache[param];
Expand Down
2 changes: 1 addition & 1 deletion src/library_syscall.js
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ var SyscallsLibrary = {

_mmap_js__deps: ['$SYSCALLS',
#if FILESYSTEM && SYSCALLS_REQUIRE_FILESYSTEM
'$FS',
'$FS', 'emscripten_builtin_memalign',
#endif
],
_mmap_js: function(len, prot, flags, fd, off, allocated, addr) {
Expand Down
2 changes: 1 addition & 1 deletion src/parseTools.js
Original file line number Diff line number Diff line change
Expand Up @@ -920,7 +920,7 @@ function makeMalloc(source, param) {
return `_malloc(${param})`;
}
// It should be impossible to call some functions without malloc being
// included, unless we have a deps_info.json bug. To let closure not error
// included, unless we have a missing __deps entry. To let closure not error
// on `_malloc` not being present, they don't call malloc and instead abort
// with an error at runtime.
// TODO: A more comprehensive deps system could catch this at compile time.
Expand Down
17 changes: 1 addition & 16 deletions src/settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -2028,22 +2028,6 @@ var IMPORTED_MEMORY = false;
// [link]
var SPLIT_MODULE = false;

// How to calculate reverse dependencies (dependencies from JS functions to
// native functions) prior to linking native code with wasm-ld. This option
// has three possible values:
// 'auto': (default) Inspect the object code passed to the linker (by running
// llvm-nm on all input) and use the map in deps_info.py to determine
// the set of additional dependencies.
// 'all' : Include the full set of possible reverse dependencies.
// 'none': No reverse dependences will be added by emscriopten. Any reverse
// dependencies will be assumed to be explicitly added to
// EXPORTED_FUNCTIONS and deps_info.py will be completely ignored.
// While 'auto' will produce a minimal set (so is good for code size), 'all'
// and 'none' will give faster link times, especially for very large projects
// (since they both avoid the running of llvm-nm on all linker inputs).
// [link]
var REVERSE_DEPS = 'auto';

// For MAIN_MODULE builds, automatically load any dynamic library dependencies
// on startup, before loading the main module.
var AUTOLOAD_DYLIBS = true;
Expand Down Expand Up @@ -2175,4 +2159,5 @@ var LEGACY_SETTINGS = [
['LLD_REPORT_UNDEFINED', [1], 'Disabling is no longer supported'],
['MEM_INIT_METHOD', [0], 'No longer supported'],
['USE_PTHREADS', [0, 1], 'No longer needed. Use -pthread instead'],
['REVERSE_DEPS', ['auto', 'all', 'none'], 'No longer needed'],
];
2 changes: 1 addition & 1 deletion test/other/metadce/test_metadce_cxx_ctors1.jssize
Original file line number Diff line number Diff line change
@@ -1 +1 @@
26183
26304
Loading

0 comments on commit 99a521d

Please sign in to comment.