llvm-project
b60a39e3 - [lld][WebAssembly] Propagate +atomics for ThinLTO when using --shared-memory (#188381)

Commit
2 days ago
[lld][WebAssembly] Propagate +atomics for ThinLTO when using --shared-memory (#188381) 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.
Author
Parents
Loading