> On Jan 14, 2022, at 12:11 PM, Martin Sebor <mse...@gmail.com> wrote:
> 
> On 1/14/22 09:30, Qing Zhao wrote:
>>> On Jan 14, 2022, at 6:45 AM, Richard Biener <richard.guent...@gmail.com> 
>>> wrote:
>>> 
>>> On Thu, Jan 13, 2022 at 2:45 AM Qing Zhao <qing.z...@oracle.com> 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?

> 
> 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”?
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  <qing.z...@oracle.com>
>>>> 
>>>>        * 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  <qing.z...@oracle.com>
>>>> 
>>>>        * 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:
> 

Reply via email to