On Mon, 9 Jan 2023, Qing Zhao wrote:

> 
> 
> > 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?

Yes, that sounds good.

> > 
> >>> 
> >>> 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?

I'm not sure - we'd have to restrict it to "used" types and in principle
only when actual objects pass from one TU to another with different
flex-array semantics.  Otherwise we'll risk tons of diagnostics when
people "forget" -fstrict-flex-arrays on some TUs but pull in common
headers.

The C++ ODR diagnostics reside in ipa-devirt.cc, I'm not sure diagnostics
on flex arrays would fit there.

I just wanted to bring this up, I do not have a good idea how or where
to implement it.

Richard.

> thanks.
> 
> Qing
> > 
> > Richard.
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg,
Germany; GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman;
HRB 36809 (AG Nuernberg)

Reply via email to