Description
Today in emscripten we have a reverse dependency system that is made up of two main parts:
- Explicitly dependency info in deps_info.py and
__deps
entries in library files. - Scanning of all inputs using llvm-nm do discover which deps are needed.
With #18849 having been merged we can now move the deps information out of deps_info.py and into the library files.
I was planning on land that next phase, #18865, which enables transitive dependencies, but unfortunately that cause a regression because the current error message produced by wasm-ld was less useful than the jsifier ones:
Current wasm-ld error for missing reverse deps:
wasm-ld: error: symbol exported via --export not found: foo
vs:
error: undefined symbol: bar (referenced by foo__deps: ['bar'], referenced by emscripten_runtime_keepalive_pop__deps: ['foo','$runtimeKeepalivePop'], referenced by top-level compiled C/C++ code)
I think if we can make the wasm-ld message more like this then we could finally switch over to wasm-ld for all symbol resolution:
wasm-ld: error: undefined symbols `foo` required by `bar` which was imported from `libemscripten.txt`
This will require a new wasm-ld input format, which is kind of like a dummy shared library, but is essentially just a text file representing external symbol and their dependencies. My plan is to use a format much like the current current format we use for our cached symbol lists. e.g.:
js_sym
js_sym_foo: malloc, free