> On Jan 9, 2023, at 2:11 AM, Richard Biener <rguent...@suse.de> wrote:
> 
> On Thu, 22 Dec 2022, Qing Zhao wrote:
> 
>> 
>> 
>>> On Dec 22, 2022, at 2:09 AM, Richard Biener <rguent...@suse.de> wrote:
>>> 
>>> On Wed, 21 Dec 2022, Qing Zhao wrote:
>>> 
>>>> Hi, Richard,
>>>> 
>>>> Thanks a lot for your comments.
>>>> 
>>>>> On Dec 21, 2022, at 2:12 AM, Richard Biener <rguent...@suse.de> wrote:
>>>>> 
>>>>> On Tue, 20 Dec 2022, Qing Zhao wrote:
>>>>> 
>>>>>> Hi,
>>>>>> 
>>>>>> This is the patch for mentioning -fstrict-flex-arrays and 
>>>>>> -Warray-bounds=2 changes in gcc-13/changes.html.
>>>>>> 
>>>>>> Let me know if you have any comment or suggestions.
>>>>> 
>>>>> Some copy editing below
>>>>> 
>>>>>> Thanks.
>>>>>> 
>>>>>> Qing.
>>>>>> 
>>>>>> =======================================
>>>>>> From c022076169b4f1990b91f7daf4cc52c6c5535228 Mon Sep 17 00:00:00 2001
>>>>>> From: Qing Zhao <qing.z...@oracle.com>
>>>>>> Date: Tue, 20 Dec 2022 16:13:04 +0000
>>>>>> Subject: [PATCH] gcc-13/changes: Mention -fstrict-flex-arrays and its 
>>>>>> impact.
>>>>>> 
>>>>>> ---
>>>>>> htdocs/gcc-13/changes.html | 15 +++++++++++++++
>>>>>> 1 file changed, 15 insertions(+)
>>>>>> 
>>>>>> diff --git a/htdocs/gcc-13/changes.html b/htdocs/gcc-13/changes.html
>>>>>> index 689178f9..47b3d40f 100644
>>>>>> --- a/htdocs/gcc-13/changes.html
>>>>>> +++ b/htdocs/gcc-13/changes.html
>>>>>> @@ -39,6 +39,10 @@ a work-in-progress.</p>
>>>>>>   <li>Legacy debug info compression option <code>-gz=zlib-gnu</code> was 
>>>>>> removed
>>>>>>     and the option is ignored right now.</li>
>>>>>>   <li>New debug info compression option value <code>-gz=zstd</code> has 
>>>>>> been added.</li>
>>>>>> +    <li><code>-Warray-bounds=2</code> will no longer issue warnings for 
>>>>>> out of bounds
>>>>>> +      accesses to trailing struct members of one-element array type 
>>>>>> anymore. Please
>>>>>> +      add <code>-fstrict-flex-arrays=level</code> to control how the 
>>>>>> compiler treat
>>>>>> +      trailing arrays of structures as flexible array members. </li>
>>>>> 
>>>>> "Instead it diagnoses accesses to trailing arrays according to 
>>>>> <code>-fstrict-flex-arrays</code>."
>>>> 
>>>> Okay.
>>>>> 
>>>>>> </ul>
>>>>>> 
>>>>>> 
>>>>>> @@ -409,6 +413,17 @@ a work-in-progress.</p>
>>>>>> <h2>Other significant improvements</h2>
>>>>>> 
>>>>>> <!-- <h3 id="uninitialized">Eliminating uninitialized variables</h3> -->
>>>>>> +<h3 id="flexible array">Treating trailing arrays as flexible array 
>>>>>> members</h3>
>>>>>> +
>>>>>> +<ul>
>>>>>> + <li>GCC can now control when to treat the trailing array of a 
>>>>>> structure as a 
>>>>>> +     flexible array member for the purpose of accessing the elements of 
>>>>>> such
>>>>>> +     an array. By default, all trailing arrays of structures are 
>>>>>> treated as
>>>>> 
>>>>> all trailing arrays in aggregates are treated
>>>> Okay.
>>>>> 
>>>>>> +     flexible array members. Use the new command-line option
>>>>>> +     <code>-fstrict-flex-array=level</code> to control how GCC treats 
>>>>>> the trailing
>>>>>> +     array of a structure as a flexible array member at different 
>>>>>> levels.
>>>>> 
>>>>> <code>-fstrict-flex-arrays</code> to control which trailing array
>>>>> members are streated as flexible arrays.
>>>> 
>>>> Okay.
>>>> 
>>>>> 
>>>>> I've also just now noticed that there's now a flag_strict_flex_arrays
>>>>> check in the middle-end (in array bound diagnostics) but this option
>>>>> isn't streamed or handled with LTO.  I think you want to replace that
>>>>> with the appropriate DECL_NOT_FLEXARRAY check.
>>>> 
>>>> We need to know the level value of the strict_flex_arrays on the struct 
>>>> field to issue proper warnings at different levels. DECL_NOT_FLEXARRAY 
>>>> does not include such info. So, what should I do? Streaming the 
>>>> flag_strict_flex_arrays with LTO?
>>> 
>>> But you do
>>> 
>>> if (compref)
>>>   {
>>>     /* Try to determine special array member type for this 
>>> COMPONENT_REF.  */
>>>     sam = component_ref_sam_type (arg);
>>>     /* Get the level of strict_flex_array for this array field.  */
>>>     tree afield_decl = TREE_OPERAND (arg, 1);
>>>     strict_flex_array_level = strict_flex_array_level_of (afield_decl);
>>> 
>>> I see that function doesn't look at DECL_NOT_FLEXARRAY but just
>>> checks attributes (those are streamed in LTO).
>> 
>> Yes, checked both flag_strict_flex_arrays and attributes. 
>> 
>> There are two places in middle end calling ?strict_flex_array_level_of? 
>> function, 
>> one inside ?array_bounds_checker::check_array_ref?, another one inside 
>> ?component_ref_size?.
>> Shall we check DECL_NOT_FLEXARRAY field instead of calling 
>> ?strict_flex_array_level_of? in both places?
> 
> I wonder if that function should check DECL_NOT_FLEXARRAY?

The function “strict_flex_array_level_of” is intended to query the LEVEL of 
strict_flex_array, only check DECL_NOT_FLEXARRAY is not enough. 

So, I think the major question here is: 

Do we need  the LEVEL of strict_flex_array information in the Middle end?

The current major use of LEVEL of strict_flex_array in the middle end is two 
places:

        1. In the routine “component_ref_size”: to determine the size of the 
trailing array based on the level of the strict_flex_array.
        2. In the routine “array_bounds_checker::check_array_ref”: to issue 
different information for -Wstrict-flex-array based on different level.


Just double checked the above 1, and 2. Without LEVEL of strict_flex_array 
info, 1 should be fine
2, as you mentioned previously, the major impact will be that the LEVEL 
information is lost in the issued message, but that might be not a big
issue.

So, I will try to eliminate the reference to “flag_strict_flex_array” in the 
middle end, replace it with “DECL_NOT_FLEXARRAY”, and come up with
an updated patch for this change.

How do you think?


> 
>>> 
>>> OK, so I suppose the diagnostic itself would become just less precise
>>> as in "trailing array %qT should not be used as a flexible array member"
>>> without the "for level N and above" part of the diagnostic?
>> 
>> Yes, that might be the major impact.
>> 
>> If only check DECL_NOT_FLEXARRAY, we will lose such information. Does that 
>> matter?
> 
> I think the main information is preserved in diagnosing the flex vs.
> non-flex array assumption.
Yes. Agreed.

> 
>>> 
>>>>> We might also want
>>>>> to see how inlining accesses from TUs with different -fstrict-flex-arrays
>>>>> setting behaves when accessing the same structure (and whether we might
>>>>> want to issue an ODR style diagnostic there).
>>> 
>>> This mixing also means streaming -fstrict-flex-arrays won't be of much
>>> help in general.
>> 
>> Then under such situation, i.e, different -fstrict-flex-arrays levels for 
>> the same structure from different TUs, how should we handle it? 
> 
> I think in similar situations we try to DWIM, but in some cases it will
> result in "garbage" behavior.  I don't think there's anything we can
> do here besides trying to diagnose such mismatches with -flto at the WPA
> stage.

Shall we issue warning for such mismatches? Where is the place I can add such 
warnings?

thanks.

Qing
> 
> Richard.

Reply via email to