[clang] [llvm] [clang][LTO] Emit symbols for global inline assembly as module flags (PR #174995)
Andrew Savonichev via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 18 05:56:09 PST 2026
asavonic wrote:
I tested the patch more and added handling of duplicated symbols after IR linking. We have the following cases:
1. Duplicated defined symbols - this is an error in AsmParser. For `global-asm-symbols` we now use `ModFlagBehavior::AppendUnique`, so duplicates are discarded by IR Mover. There is no diagnostic in ModuleSymbolTable, but AsmParser will complain once such code reaches CodeGen.
2. Defined and undefined symbols linked together - not an error in AsmParser. If there used to be an undefined symver, and the corresponding symbol is now defined - such symver is also considered to be defined.
AppendUnique does not help here, because it treats metadata pairs with different `BasicSymbolRef::Flags` as unique. Metadata is left with a mix of defined and undefined symbols with the same name but different flags. This is demonstrated in `llvm/test/Object/global-inline-asm.test`.
We cannot change how module metadata flags are merged beyond `AppendUnique`. Therefore ModuleSymbolTable now performs de-duplication in `CollectAsmSymbols` using metadata as an input. It goes through the list of `(symbol,flags)` pairs, discards undefined symbols in favor of defined ones, and defines symvers in presence of the corresponding defined symbol.
This is all very similar to what `AsmParser` and `RecordStreamer` do, but we cannot call them here with just metadata.
3. Discarded symbols with `.lto_discard` - LTO adds this line to linked assembly to instruct AsmParser to ignore a set of symbols. We have to change `global-asm-symbols` in LTO to match.
4. Discarded symvers with `.lto_discard` - while LTO can discard symvers, this syntax is not supported by AsmParser:
```
<inline asm>:1:22: unexpected token
.lto_discard bar, bar at VER
^
```
I don't see a way to write a test without dealing with this error, so filtering of `global-asm-symver` is not done.
Updated the the patch and changed tests significantly. Generic tests are now in `llvm/test/Object` - they do not call LTO and use llvm-link and llvm-nm.
The patch is more complicated than I originally anticipated, but I don't see any other way. Maybe I'm missing something. Let me know what you think.
https://github.com/llvm/llvm-project/pull/174995
More information about the cfe-commits
mailing list