> On Jan 14, 2022, at 12:58 PM, Martin Sebor <[email protected]> wrote:
>
> On 1/14/22 11:29, Qing Zhao wrote:
>>> On Jan 14, 2022, at 12:11 PM, Martin Sebor <[email protected]> wrote:
>>>
>>> On 1/14/22 09:30, Qing Zhao wrote:
>>>>> On Jan 14, 2022, at 6:45 AM, Richard Biener <[email protected]>
>>>>> wrote:
>>>>>
>>>>> On Thu, Jan 13, 2022 at 2:45 AM Qing Zhao <[email protected]> wrote:
>>>>>>
>>>>>> Hi, Richard,
>>>>>>
>>>>>> This is the updated version for the second patch, which is mainly the
>>>>>> change for "Enable -Wuninitialized + -ftrivial-auto-var-init for
>>>>>> address taken variables”.
>>>>>>
>>>>>> In this update, I mainly made the following change:
>>>>>>
>>>>>> 1. Delete “repl_var”, use the var_def_stmt, i.e, the call to
>>>>>> .DEFERRED_INIT to record the warning suppressed info.
>>>>>> 2. Add and change the comments in multiple places to make the change
>>>>>> more readable.
>>>>>>
>>>>>> Now, for the deleted variable, we will get the necessary info to report
>>>>>> warning from the call to .DEFERRED_INIT.
>>>>>>
>>>>>> A. the name string of DECL from the 3rd parameter of the call;
>>>>>> B. the location of the DECL from the location of the call;
>>>>>> C. the call can also be used to hold the information on whether the
>>>>>> warning
>>>>>> has been issued or not to suppress warning messages when needed;
>>>>>>
>>>>>> Please see the detailed description below for the problem and solution
>>>>>> of this patch.
>>>>>>
>>>>>> This patch has been bootstrapped and regressing tested on both X86 and
>>>>>> aarch64.
>>>>>>
>>>>>> Okay for GCC12?
>>>>>
>>>>> I think the change to split "%qD is used uninitialized" is bad for i8n
>>>>> though it seems
>>>>> like none of the strings passed to warn_uninit are currently marked
>>>>> for localization.
>>>>> I suppose there's lazy matching with the exact same strings passed to
>>>>> warning_at around like 641 but after your change those will no longer
>>>>> match up,
>>>> Silly question: What does the above “641” mean?
>>>
>>> At around line 641 :)
>> I thought of this, but I didn’t find a meaningful statement around line 641
>> in tree-ssa-uninit.c…
>> 636 found_alloc = true;
>> 637 break;
>> 638 }
>> 639
>> 640 if (!is_gimple_assign (def_stmt))
>> 641 break;
>> 642
>> 643 tree_code code = gimple_assign_rhs_code (def_stmt);
>> 644 if (code != ADDR_EXPR && code != POINTER_PLUS_EXPR)
>> 645 break;
>>
>>>
>>>>> at least for the "%qs ..." case constructed. I think a better way
>>>>> (for i8n) would be
>>>>> to pass down a flag whether it is "may" or "is" and have the full
>>>>> translatable
>>>>> strings literally passed to warning_at at the expense of some code
>>>>> duplication.
>>>>> Actually the extra flag is unnecessary, the OPT_W... we pass is already
>>>>> fully
>>>>> specifying that.
>>>> The only issue with the above change is: among the 4 calls to
>>>> “warn_uninit” as following:
>>>> if (use_stmt)
>>>> warn_uninit (OPT_Wuninitialized, def, SSA_NAME_VAR (def),
>>>> - "%qD is used uninitialized", use_stmt);
>>>> + "is used uninitialized", use_stmt);
>>>> }
>>>> }
>>>> @@ -932,10 +1015,10 @@ warn_uninitialized_vars (bool wmaybe_uninit)
>>>> tree use = USE_FROM_PTR (use_p);
>>>> if (wlims.always_executed)
>>>> warn_uninit (OPT_Wuninitialized, use, SSA_NAME_VAR (use),
>>>> - "%qD is used uninitialized", stmt);
>>>> + "is used uninitialized", stmt);
>>>> else if (wmaybe_uninit)
>>>> warn_uninit (OPT_Wmaybe_uninitialized, use, SSA_NAME_VAR
>>>> (use),
>>>> - "%qD may be used uninitialized", stmt);
>>>> + "may be used uninitialized", stmt);
>>>> }
>>>> /* For limiting the alias walk below we count all
>>>> @@ -1182,7 +1265,7 @@ warn_uninitialized_phi (gphi *phi, vec<gphi *>
>>>> *worklist,
>>>> warn_uninit (OPT_Wmaybe_uninitialized, uninit_op,
>>>> SSA_NAME_VAR (uninit_op),
>>>> - "%qD may be used uninitialized in this function",
>>>> + "may be used uninitialized in this function",
>>>> uninit_use_stmt, loc);
>>>> All the strings passed map well with the OPT_W… except the last one, since
>>>> the last one has an additional string “in this function” at the end.
>>>> However, since the last call has the last argument “loc” been NULL, maybe
>>>> we can use this to distinguish.
>>>
>>> Now that diagnostics are prefixed by something like "In function 'foo':
>>> the "in this function" part is superfluous and could be removed from
>>> all warning messages.
>> Okay, so, you mean that it’s safe to just remove “in this function” from the
>> last callsite?
>
> Yes, I would remove it. It might require some cleanup in the test
> suite but I wouldn't expect it to be too bad.
Okay, I see.
I didn’t see any test case regression due to this change.
>
>>>
>>> When there's no location (i.e., loc is UNKNOWN_LOCATION) the called
>>> code tries to derive a location from the context. When it can't, it
>>> won't point anywhere useful, so if that case ever comes up here it
>>> should probably be handled by using the location of the curly brace
>>> closing the function definition.
>> You mean the following in the routine warn_uninit:
>> /* Use either the location of the read statement or that of the PHI
>> argument, or that of the uninitialized variable, in that order,
>> whichever is valid. */
>> location_t location = UNKNOWN_LOCATION;
>> if (gimple_has_location (context))
>> location = gimple_location (context);
>> else if (phi_arg_loc != UNKNOWN_LOCATION)
>> location = phi_arg_loc;
>> else if (var)
>> location = DECL_SOURCE_LOCATION (var);
>> else if (var_name_str)
>> location = gimple_location (var_def_stmt);
>> When all the above failed, we could add the “location of the curly brace
>> closing the function definition”?
>
> Yes, that's what I meant. But to be clear, I didn't mean to suggest
> you make the change as part of this change It was just a side note.
> Sorry for not being clearer.
Okay.
Thanks a lot.
Qing
>
> Martin
>
>
>> Qing
>>>
>>> Martin
>>>
>>>>>
>>>>> Instead of doing
>>>>>
>>>>> + if (gimple_call_internal_p (var_def_stmt, IFN_DEFERRED_INIT))
>>>>> + {
>>>>> + /* Ignore the call to .DEFERRED_INIT that define the original
>>>>> + var itself as the following case:
>>>>> + temp = .DEFERRED_INIT (4, 2, â~@~\alt_reloc");
>>>>> + alt_reloc = temp;
>>>>> + In order to avoid generating warning for the fake usage
>>>>> + at alt_reloc = temp.
>>>>> ...
>>>>>
>>>>> I thought of many options, none really very appealing so I guess we have
>>>>> to
>>>>> go with this for now.
>>>> I agree with you, this is really ugly, I am not very comfortable myself
>>>> either. But looks like no better way to resolve it….
>>>>>
>>>>> So OK with the i8n thing sorted out - please post one hopefully last
>>>>> update
>>>>> for the patch.
>>>> Will do it.
>>>>>
>>>>> Thanks for your patience,
>>>> Thank you!
>>>> Qing
>>>>> Richard.
>>>>>
>>>>>> thanks.
>>>>>>
>>>>>> Qing.
>>>>>>
>>>>>> ========================
>>>>>> Enable -Wuninitialized + -ftrivial-auto-var-init for address
>>>>>> taken variables.
>>>>>>
>>>>>> With -ftrivial-auto-var-init, the address taken auto variable is
>>>>>> replaced with
>>>>>> a temporary variable during gimplification, and the original auto
>>>>>> variable might
>>>>>> be eliminated by compiler optimization completely. As a result, the
>>>>>> current
>>>>>> uninitialized warning analysis cannot get enough information from the IR,
>>>>>> therefore the uninitialized warnings for address taken variable cannot be
>>>>>> issued based on the current implemenation of -ftrival-auto-var-init.
>>>>>>
>>>>>> For more info please refer to:
>>>>>> https://gcc.gnu.org/pipermail/gcc-patches/2021-August/577431.html
>>>>>>
>>>>>> In order to improve this situation, we can improve uninitialized analysis
>>>>>> for address taken auto variables with -ftrivial-auto-var-init as
>>>>>> following:
>>>>>>
>>>>>> for the following stmt:
>>>>>>
>>>>>> _1 = .DEFERRED_INIT (4, 2, &"alt_reloc"[0]);
>>>>>> if (_1 != 0)
>>>>>>
>>>>>> The original variable DECL has been eliminated from the IR, all the
>>>>>> necessary
>>>>>> information that is needed for reporting the warnings for DECL can be
>>>>>> acquired
>>>>>> from the call to .DEFERRED_INIT.
>>>>>>
>>>>>> A. the name string of DECL from the 3rd parameter of the call;
>>>>>> B. the location of the DECL from the location of the call;
>>>>>> C. the call can also be used to hold the information on whether the
>>>>>> warning
>>>>>> has been issued or not to suppress warning messages when needed;
>>>>>>
>>>>>> The current testing cases for uninitialized warnings +
>>>>>> -ftrivial-auto-var-init
>>>>>> are adjusted to reflect the fact that we can issue warnings for address
>>>>>> taken
>>>>>> variables.
>>>>>>
>>>>>> gcc/ChangeLog:
>>>>>>
>>>>>> 2022-01-12 qing zhao <[email protected]>
>>>>>>
>>>>>> * tree-ssa-uninit.c (warn_uninit): Handle .DEFERRED_INIT call
>>>>>> with an
>>>>>> anonymous SSA_NAME specially.
>>>>>> (check_defs): Likewise.
>>>>>> (warn_uninit_phi_uses): Adjust the message format for warn_uninit.
>>>>>> (warn_uninitialized_vars): Likewise.
>>>>>> (warn_uninitialized_phi): Likewise
>>>>>>
>>>>>> gcc/testsuite/ChangeLog:
>>>>>>
>>>>>> 2022-01-12 qing zhao <[email protected]>
>>>>>>
>>>>>> * gcc.dg/auto-init-uninit-16.c (testfunc): Delete xfail to reflect
>>>>>> the fact that address taken variable can be warned.
>>>>>> * gcc.dg/auto-init-uninit-34.c (warn_scalar_1): Likewise.
>>>>>> (warn_scalar_2): Likewise.
>>>>>> * gcc.dg/auto-init-uninit-37.c (T1): Likewise.
>>>>>> (T2): Likewise.
>>>>>> * gcc.dg/auto-init-uninit-B.c (baz): Likewise.
>>>>>>
>>>>>> The complete patch is attached: