Hi JunMa, JunMa <ju...@linux.alibaba.com> wrote:
> 在 2020/1/20 下午6:07, Iain Sandoe 写道: >> Hi JunMa, >> >> JunMa <ju...@linux.alibaba.com> wrote: >> >>> Hi >>> Accroding to N4835: When a coroutine is invoked, a copy is created >>> for each coroutine parameter. While in current implementation, we >>> only collect used parameters. This may lost behavior inside constructor >>> and destructor of unused parameters. >>> >>> This patch change the implementation to collect all parameter. >> >> thanks for the patch. >> >> I am not convinced this is the right way to fix this, we do not want to >> increase >> the size of the coroutine frame unnecessarily. I would like to check the >> lifetime >> requirements; such copies might only need to be made local to the ramp >> function. >> >> Iain > For type with trivial destructor, There is no need to copy parameter if it is > never referenced after a reachable suspend point(return-to-caller/resume) in > the > coroutine. Since we are in front end, that should be inital_suspend point. so > we > can create field for type with non-trivial destructor first, and skip unused > parameters > in register_param_uses. I'll update the patch I think that, even if the DTOR is non-trivial, the copy only needs to be in the stack frame of the ramp, not in the coroutine frame. This is also what clang does for -O>0 (although it makes a frame copy at O0). Will clarify this (perhaps the wording could be slightly more specfic). thanks Iain > > Regards > JunMa >>> Bootstrap and test on X86_64, is it OK? >>> >>> Regards >>> JunMa >>> >>> gcc/cp >>> 2020-01-20 Jun Ma <ju...@linux.alibaba.com> >>> >>> * coroutines.cc (build_actor_fn): Skip rewrite when there is no >>> param references. >>> (register_param_uses): Only collect param references here. >>> (morph_fn_to_coro): Create coroutine frame field for each >>> function params. >>> >>> gcc/testsuite >>> 2020-01-20 Jun Ma <ju...@linux.alibaba.com> >>> >>> * g++.dg/coroutines/torture/func-params-07.C: New test. >>> <0001-Fix-issue-when-copy-function-parameters-into-corouti.patch>