Hi Jason

> On 22 Aug 2024, at 17:47, Jason Merrill <ja...@redhat.com> wrote:
> 
> On 8/22/24 12:35 PM, Iain Sandoe wrote:
>> Hi Jason,
>> Firstly, Arsen has WIP to revise the allocation / deallocation to deal with
>> coroutine frames that are more aligned than 2 * sizeof (pointer).  We will 
>> also
>> be considering Lewis' P2014 (use of the aligned allocator).  So this patch is
>> very much a staging point.
>>>>     operator new for the params provided.  Extract a simplified version
>>>> +   of the machinery from build_operator_new_call.
>>> This seems like a call to that function, not a simplified version of it?
>> Fixed the comment.
>>>> +   NOTE: This can update the frame size so we need to account for that
>>>> +   when building the IFN_CO_FRAME later.  */
>>> I don't think it can when cookie and size_check are both NULL, as they are 
>>> here.
>> That is good to know and I think we can factor in a change to the revisions 
>> we
>> are making for more aligned frames (since we will need to intercept and 
>> change
>> the frame allocation size to deal with those).
>>>> +build_coroutine_frame_delete_expr (tree coro_fp, tree orig, tree 
>>>> frame_size,
>>>> +                             tree promise_type, location_t loc)
>>>> +{
>>> Here it seems like you could already use build_op_delete_call for all of 
>>> this, just by converting coro_fp to pointer-to-promise_type instead of to 
>>> ptr_type_node?
>> I am missing something - the frame pointer is not a pointer to a promise 
>> object
>> it is a pointer to the whole coroutine state?
> 
> Yes, but you could lie about that; build_op_delete_call only uses the type 
> for lookup (which we want to do in the promise type), then converts to void*.

hmm I’m having trouble with this, but not sure what I’m doing wrong - this is 
what I have now:
...
  tree pptr_type = build_pointer_type (promise_type);
  tree frame_arg = build1_loc (loc, CONVERT_EXPR, pptr_type, coro_fp);
…
del_coro_fr = build_op_delete_call (DELETE_EXPR, frame_arg, frame_size,
                                          /*global_p=*/false, 
/*placement=*/NULL,
                                          /*alloc_fn=*/NULL,
                                          tf_warning_or_error);

http://eel.is/c++draft/dcl.fct.def.coroutine#12 (sentence 2) says " If both a 
usual deallocation function with only a pointer parameter and a usual 
deallocation function with both a pointer parameter and a size parameter are 
found, then the selected deallocation function shall be the one with two 
parameters.”

however, if my promise provides both - the one with a single param is always 
chosen.
It is not that the other overload is invalid - if I do not include the single 
param version, the two param one is happily selected.

(I’m stumped at the moment)

>>>> +  location_t save_input_loc = input_location;
>>>> +  location_t loc = fn_start;
>>>> +  input_location = loc;
>>> Here using iloc_sentinel is simple.
>> now using it.
>>>> +  /* The decl_expr for the coro frame pointer, initialize to zero so that 
>>>> we
>>>> +     can pass it to the IFN_CO_FRAME (since there's no way to pass a type,
>>>> +     directly apparently).  This avoids a "used uninitialized" warning.  
>>>> */
>>> You could pass build_zero_cst (frame_ptr_type) instead of the variable?
>> changed to do that.
> 
> I meant pass the zero_cst to IFN_CO_FRAME, so you don't need to initialize 
> coro_fp until after that call.

ack, I’ll tackle that once the op del is fixed.
Iain

> 
> Jason

Reply via email to