When compiling WebAssembly with ThinLTO, functions are partitioned into isolated `.bc` modules and dispatched to individual LTO backend threads. During code generation, the `CoalesceFeaturesAndStripAtomics` pass iterates over the module to gather the union of target features (like `+atomics`) attached to defined functions. In particular when not using threads, it lowers away atomics and TLS variables to their single-threaded equivalents. However, if a partitioned module only contains globally defined TLS variables (e.g. there are no functions, or all functions were fully inlined or stripped by dropDeadSymbols before ThinLTO optimization), the module becomes completely devoid of function definitions. The coalescing pass then falls back to fetching features from the `TargetMachine`. Because in LTO the `TargetMachine` defaults to a generic target without atomics enabled, the TLS is lowered away and the `wasm-feature-atomics` flag is omitted from the resulting ThinLTO object partition, causing `wasm-ld` to immediately reject it. To fix this we take advantage of the fact that the linker always knows whether threads are being used (via the --shared-memory flag). When using shared memory, we enable +atomics and +bulk-memory in the TargetMachine that is used for the backend, and the feature coalescing pass will correctly detect the use of therads. This only makes sense for atomics because of the global linker configuration; for other features we wouldn't be able to do this, but we don't rewrite away any other features anyway.
LLVM Linker (lld)
This directory and its subdirectories contain source code for the LLVM Linker, a modular cross platform linker which is built as part of the LLVM compiler infrastructure project.
lld is open source software. You may freely distribute it under the terms of the license agreement found in LICENSE.txt.
Benchmarking
In order to make sure various developers can evaluate patches over the same tests, we create a collection of self contained programs.
It is hosted at https://s3-us-west-2.amazonaws.com/linker-tests/lld-speed-test.tar.xz
The current sha256 is 10eec685463d5a8bbf08d77f4ca96282161d396c65bd97dc99dbde644a31610f.