Fix ICE after sorry for big stack arguments (PR 84964)
Richard Biener
richard.guenther@gmail.com
Wed Mar 21 12:02:00 GMT 2018
On Wed, Mar 21, 2018 at 12:16 PM, Richard Sandiford
<richard.sandiford@linaro.org> wrote:
> Richard Biener <richard.guenther@gmail.com> writes:
>> On Wed, Mar 21, 2018 at 11:48 AM, Richard Sandiford
>> <richard.sandiford@linaro.org> wrote:
>>> Richard Biener <richard.guenther@gmail.com> writes:
>>>> On Wed, Mar 21, 2018 at 9:33 AM, Richard Sandiford
>>>> <richard.sandiford@linaro.org> wrote:
>>>>> Index: gcc/diagnostic.c
>>>>> ===================================================================
>>>>> --- gcc/diagnostic.c 2018-03-01 08:20:43.589534337 +0000
>>>>> +++ gcc/diagnostic.c 2018-03-21 08:31:34.635677798 +0000
>>>>> @@ -1407,6 +1407,20 @@ sorry (const char *gmsgid, ...)
>>>>> va_end (ap);
>>>>> }
>>>>>
>>>>> +/* Same, but stop compilation immediately. */
>>>>> +
>>>>> +void
>>>>> +fatal_sorry (const char *gmsgid, ...)
>>>>> +{
>>>>> + va_list ap;
>>>>> + va_start (ap, gmsgid);
>>>>> + rich_location richloc (line_table, input_location);
>>>>> + diagnostic_impl (&richloc, -1, gmsgid, &ap, DK_SORRY);
>>>>> + va_end (ap);
>>>>> +
>>>>> + exit (FATAL_EXIT_CODE);
>>>>
>>>> This is somewhat not in style of the other "fatal" handlers. I guess
>>>> you don't get "sorry: " when using DK_FATAL, but ...
>>>
>>> I didn't add another DK_* because I don't think we want a different prefix
>>> (unliked "error:" vs. "fatal error:").
>>>
>>>>> +}
>>>>> +
>>>>> /* Return true if an error or a "sorry" has been seen. Various
>>>>> processing is disabled after errors. */
>>>>> bool
>>>>> Index: gcc/calls.c
>>>>> ===================================================================
>>>>> --- gcc/calls.c 2018-03-17 08:30:20.937100705 +0000
>>>>> +++ gcc/calls.c 2018-03-21 08:31:34.635677798 +0000
>>>>> @@ -4052,13 +4052,10 @@ expand_call (tree exp, rtx target, int i
>>>>> rtx_insn *before_arg = get_last_insn ();
>>>>>
>>>>> /* We don't allow passing huge (> 2^30 B) arguments
>>>>> - by value. It would cause an overflow later on. */
>>>>> + by value. It would cause an overflow later on. */
>>>>> if (constant_lower_bound (adjusted_args_size.constant)
>>>>> >= (1 << (HOST_BITS_PER_INT - 2)))
>>>>> - {
>>>>> - sorry ("passing too large argument on stack");
>>>>> - continue;
>>>>> - }
>>>>> + fatal_sorry ("passing too large argument on stack");
>>>>
>>>> ... why not use fatal_error here? It doesn't seem to be something
>>>> that is just not implemented but impossible to implement?
>>>
>>> It's HOST_BITS_PER_INT rather than _WIDE_INT, so I think we could
>>> implement it if we were tighter with types. E.g. this PR occurred
>>> because we went from int to HWI for some things, which should have
>>> fixed part of the problem. There might still be other uses of
>>> "int" that need to change though.
>>
>> Ah, missed the BITS part. I wonder if we can get away with simply
>> setting adjusted_args_size.constant to some small constant? For
>> bits we generally need offset_ints, just HWI isn't enough anyway.
>
> This is a byte quantity, so HWI should be OK. We're just using
> HOST_BITS_PER_INT to calculate the range of int on the host.
Ok...
> I think we'd run into other problems if the accumulated size didn't
> match the sizes of the individual arguments. That's why setting the
> sizes to zero and the number of arguments to zero seemed "safer".
> But I don't think anyone's really thought about what else could go wrong
> if we make arbitrary changes like that. Just bailing out seems better.
Fine. Then sorry () plus fatal_error () with a comment still sounds best here
(if we care at all about error-recovery issues - care to "paper over
them" instead
of fixing them for real, whatever that means)
Richard.
> Thanks,
> Richard
More information about the Gcc-patches
mailing list