> On Jan 26, 2023, at 12:16 PM, Siddhesh Poyarekar <siddh...@gotplt.org> wrote:
> 
> On 2023-01-26 11:20, Qing Zhao wrote:
>> Hi, Siddhesh,
>> Thanks a lot for this patch, after -fstrict-flex-array functionality has 
>> been added into GCC,
>>  I think that making the tree-object-size to have consistent behavior with 
>> flex arrays is a
>> valuable and natural work that need to be added.
>> I also like the comments you added into tree-object-size.cc, making the code 
>> much easier to be understood.
>> Minor comments below:
>>> On Dec 21, 2022, at 5:25 PM, Siddhesh Poyarekar <siddh...@gotplt.org> wrote:
>>> 
>>> The tree object size pass tries to fail when it detects a flex array in
>>> the struct, but it ends up doing the right thing only when the flex
>>> array is in the outermost struct.  For nested cases (such as arrays
>>> nested in a union or an inner struct), it ends up taking whatever value
>>> the flex array is declared with, using zero for the standard flex array,
>>> i.e. [].
>>> 
>>> Rework subobject size computation to make it more consistent across the
>>> board, honoring -fstrict-flex-arrays.  With this change, any array at
>>> the end of the struct will end up causing __bos to use the allocated
>>> value of the outer object, bailing out in the maximum case when it can't
>>> find it.  In the minimum case, it will return the subscript value or the
>>> allocated value of the outer object, whichever is larger.
>> I see from the changes in the testing case, there are the following major 
>> changes for the existing behavior (can be show with the testing case)
>> ****For non-nested structures:
>> struct A
>> {
>>   char a[10];
>>   int b;
>>   char c[10];
>> };
>> 1.  The Minimum size of the reference to the subobject that is a trailing 
>> array of a structure is changed from “0” to “sizeof the subobject"
>>> -  if (__builtin_object_size (&p->c, 3) != 0)
>> +  if (__builtin_object_size (&p->c, 3) != 10)
>> ****For nested structures:
>> struct D
>> {
>>   int i;
>>   struct D1
>>   {
>>     char b;
>>     char a[10];
>>   } j;
>> };
>> 2.   The Maximum size of the reference to the subobject that is a trailing 
>> array of the inner structure is changed from “sizeof the subobject” to “-1"
>>> -  if (__builtin_object_size (&d->j.a[3], 1) != sizeof (d->j.a) - 3)
>>> +  if (__builtin_object_size (&d->j.a[3], 1) != (size_t) -1)
>> .
>> 3.  The Minimum size of the reference to the subobject that is a trailing 
>> array of the inner structure is changed from “0” to “sizeof the subobject"
>> -  if (__builtin_object_size ((char *) &e->j[0], 3) != 0)
>>> +  if (__builtin_object_size ((char *) &e->j[0], 3) != sizeof (e->j))
> 
> All of the above is correct, thanks for the high level review!
> 
>> I think that all the above changes are good. My only concern is, for the 
>> change of the Minimum size of the reference to the subobject that is a 
>> trailing array (the above case 1 and 3), will there be any negtive impact on 
>> the existing application that use it?
> 
> I doubt it, because the 0 return value for minimum object size is essentially 
> a failure to determine minimum object size, i.e. a special value.  This 
> change can be interpreted as succeeding to get the minimum object size in 
> more cases.
> 
> Likewise for the maximum object size change, the change can be interpreted as 
> failing to get the maximum object size in more cases. Does that sound 
> reasonable?

Yes, make sense to me.

Thanks.

Qing
> 
>>> +     /* If the subobject size cannot be easily inferred or is smaller than
>>> +        the whole size, just use the whole size.  */
>> Should the above comment be:
>> +      /* If the subobject size cannot be easily inferred or is larger than
>> +         the whole size, just use the whole size.  */
>>>       if (! TYPE_SIZE_UNIT (TREE_TYPE (var))
>>>           || ! tree_fits_uhwi_p (TYPE_SIZE_UNIT (TREE_TYPE (var)))
>>>           || (pt_var_size && TREE_CODE (pt_var_size) == INTEGER_CST
>>>               && tree_int_cst_lt (pt_var_size,
>>>                                   TYPE_SIZE_UNIT (TREE_TYPE (var)))))
>>>         var = pt_var;
> 
> Oops, yes indeed, fixed in my copy.
> 
> Thanks,
> Sid

Reply via email to