[clang] [llvm] [Clang][Coroutines] Introducing the `[[clang::coro_inplace_task]]` attribute (PR #94693)
Yuxuan Chen via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 18 19:25:29 PDT 2024
yuxuanchen1997 wrote:
> What I thought is, to touch the code that generates the CallExpr specially instead of marking a CallExpr as special after that. The later generally looks not good to me.
The recursive structure in `EmitCallExpr` makes it hard to do this. There are just too many ways you can emit a CallExpr via `EmitCallExpr`.
> For the later question, I roughly remember we can make it in several functions emitting CallExpr in CGExpr.cpp and CGExprCXX.cpp.
As far as I can tell, it's just the `CallOrInvoke` out parameter. What I have done was to just apply it all the way to the top level `EmitCallExpr`?
> Also we should try to avoid touch so many CodeGen* files if possible. It looks scary at first and not easy to maintain.
It is a little scary to do this at first, and there are cases like Pseudo destructors that don't end up being a Call or Invoke instruction. I still think this is easier to maintain than having `EmitCall` somehow know the context that this is a coroutine we can elide and do the marking there.
> It may be possible either due to new operator co_await overloads
This we can check in the FE if the operator co_await we found was a member of the attributed type? If the search resulted in a nonmember operator we don't do the optimization?
> or due to the other await_transform didn't handle third party coroutine types well.
Indeed. The general assumption is that if you do something in the await_transform to break the promise to the compiler, it should be obvious to the developer.
> So may be, if possible, I feel better if we can add the attribute to awaiters.
That's also an option. The main conflict there being:
https://github.com/llvm/llvm-project/pull/94693
More information about the llvm-commits
mailing list