[PATCH] handle sprintf(d, "%s", ...) in gimple-ssa-sprintf.c

Jeff Law law@redhat.com
Fri May 12 18:44:00 GMT 2017


On 05/03/2017 08:46 AM, Martin Sebor wrote:
> On 05/03/2017 04:20 AM, Richard Biener wrote:
>> On Tue, May 2, 2017 at 4:41 PM, Martin Sebor <msebor@gmail.com> wrote:
>>>>>> FWIW, my fix for bug 79062 is only partial (it gets the pass
>>>>>> to run but the warnings are still not issued).  I don't quite
>>>>>> understand what prevents the warning flag(s) from getting set
>>>>>> when -flto is used.  This seems to be a bigger problem than
>>>>>> just the sprintf pass not doing something just right.
>>>>>
>>>>>
>>>>> I've never dug deeply in the LTO stuff, but I believe we stream the
>>>>> compiler
>>>>> flags, so it could be something there.
>>>>
>>>>
>>>> We do.
>>>>
>>>>> Alternately you might be running into a case where in LTO mode we
>>>>> recreate
>>>>> base types.  Look for a type equality tester that goes beyond just
>>>>> testing
>>>>> pointer equality.
>>>>>
>>>>> ie, in LTO I think we'll create a type based on the streamed data, 
>>>>> but I
>>>>> also think we'll create various basic types.  Thus in LTO mode pointer
>>>>> equality may not be sufficient.
>>>>
>>>>
>>>> We make sure that for most basic types we end up re-using them where
>>>> possible.
>>>> char_type_node is an example where that generally doesn't work because
>>>> it's
>>>> value depends on a command-line flag.
>>>
>>>
>>> That answers the first part of the question of why the sprintf
>>> pass wouldn't run (or do anything) with -flto.   With it fixed
>>> (as in fold-const.c or tree-ssa-strlen.c as you suggested in
>>> bug 79602) it runs and the optimization does its job, but no
>>> warnings are issued.  The wan_foo_flags for warnings that are
>>> enabled implicitly (e.g., by -Wall or -Wextra on the command
>>> line) are clear.  There seem to be dependencies between warnings
>>> in c.opt that ignore LTO (as a language), but even with those
>>> corrected (i.e., with LTO added as a language to -Wformat and
>>> -Wall) the flags are still clear when LTO runs.  Does that ring
>>> any bells for you?
>>
>> You can look at the lto_opts section (it's just a string) and see
>> that we seem to fail to pass through -Wall (or any warning option
>> I tried).  This is because
>>
>>       /* Also drop all options that are handled by the driver as well,
>>          which includes things like -o and -v or -fhelp for example.
>>          We do not need those.  The only exception is -foffload 
>> option, if we
>>          write it in offload_lto section.  Also drop all diagnostic 
>> options.  */
>>       if ((cl_options[option->opt_index].flags & (CL_DRIVER|CL_WARNING))
>>           && (!lto_stream_offload_p || option->opt_index != 
>> OPT_foffload_))
>>         continue;
>>
>> which means you have to explicitely enable diagnostics you want at
>> link time at the moment.
>>
>> If you want to change that you have to do some changes to lto-wrapper.c
>> as for example only pass through warning options that are set on all
>> input files (warning options are not kept per function).
> 
> Great, thanks for the pointer!  I might tackle that at some point.
> 
> Jeff, given that we now understand why the warnings are suppressed
> (i.e., the root cause of the rest of bug 79062), are you okay with
> treating that independently of this PR (bug 77671) and committing
> this patch (including the two-line fix to enable the sprintf return
> value optimization with LTO)?
Yea.  I think you needed to add a function comment for is_call_safe and 
try_simplify_call.  With those additions this is OK.

Sorry for the delay.

jeff



More information about the Gcc-patches mailing list