[PATCH] D99693: Update the linkage name of coro-split functions where applicable
Adrian Prantl via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 1 09:56:46 PDT 2021
aprantl added inline comments.
================
Comment at: llvm/lib/Transforms/Coroutines/CoroSplit.cpp:866
+ // linkage name and asserts that they are identical.
+ if (!SP->getDeclaration())
+ SP->replaceLinkageName(MDString::get(Context, NewF->getName()));
----------------
ChuanqiXu wrote:
> aprantl wrote:
> > kastiglione wrote:
> > > Is `!SP->getDeclaration()` the implicit check for swift but not C++?
> > Yes. If you have a top-level C++ coroutine — and I have no idea if that's a thing, you would get the "real" linkage name.
> Does this mean the DISubprogram for every C++ coroutine did contain a declaration? May I ask where the constraint is?
The problem we're working around here is (as far as I understand) a limitation of LLVM itself. The `distinct DISubprogram`s for C++ *methods* always have a a `declaration:` pointing into the uniqued `DISubprogram` in the type system that contains their abstract declaration. This is roughly equivalent to the `DW_AT_specification` in the DWARF for the concrete method pointing to the abstract declaration that holds all the shared attributes.
When emitting a `DW_AT_specification` attribute AsmPrinter asserts that all attributes in the `distinct DISubprogram` are equivalent to the ones in the abstract `DISubprogram` declaration. That's why we can't modify the linkage name for a DISubprogram that had a `declaration:` specified, because it would clash with the linkage name in the specification.
```
0x200:
DW_TAG_subprogram // abstract decl
DW_AT_linkage_name (foo)
DW_TAG_formal_paramater ...
...
DW_TAG_subprogram // concrete instance 1
DW_AT_low_pc (0x1000)
...
DW_AT_specification (0x200) // points to decl for common bits
DW_TAG_subprogram // concrete instance 2
DW_AT_low_pc (0x1500)
...
DW_AT_specification (0x200) // points to decl for common bits
```
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D99693/new/
https://reviews.llvm.org/D99693
More information about the llvm-commits
mailing list