[Patch] PR 61692 - Fix for inline asm ICE
David Wohlferd
dw@LimeGreenSocks.com
Fri Aug 1 08:07:00 GMT 2014
On 7/30/2014 9:58 PM, Jeff Law wrote:
> On 07/28/14 16:39, David Wohlferd wrote:
>>
>> On 7/28/2014 12:42 PM, Jeff Law wrote:
>>> On 07/27/14 01:26, David Wohlferd wrote:
>>>> I'm not sure which maintainer to cc for inline asm stuff?
>>>>
>>>> I have a release on file with the FSF, but don't have SVN write
>>>> access.
>>>>
>>>> Problem:
>>>> extract_insn() in recog.c will ICE if (noperands >
>>>> MAX_RECOG_OPERANDS).
>>>> Normally this isn't a problem since expand_asm_operands() in
>>>> cfgexpand.c
>>>> catches and reports a proper error for this condition. However,
>>>> expand_asm_operands() only checks (ninputs + noutputs) instead of
>>>> (ninputs + noutputs + nlabels), so you can get the ICE when using "asm
>>>> goto." See the bugzilla entry for sample code.
>>>>
>>>> ChangeLog:
>>>> 2014-07-27 David Wohlferd <dw@LimeGreenSocks.com>
>>>>
>>>> PR target/61692
>>>> * cfgexpand.c (expand_asm_operands): Count all inline asm
>>>> parameters.
>>> You should also include 'nclobbers'.
>>
>> Reading thru asm_noperands (which is what extract_insn uses to count
>> operands), I would have thought you were right. But while making this
>> fail with nLabels was easy, I wasn't able to get this to ICE at all
>> using clobbers (30 labels + 11 clobbers still didn't ICE).
>>
>> And I'm reluctant to propose that change unless I can see it fail.
> I understand, but I'm still quite confident it's the right thing to
> do. Running that 30 label + 11 clobber testcase under valgrind might
> show the problem, if you can stand waiting that long...
I'd love to. Unfortunately, my platform doesn't support valgrind.
> Also, please include the testcase you had nlabels part.
I have created the testcase for the 31 labels problem. However, not so
much for the nclobbers part. And if I'm going to patch both, I should
have testcases for both.
I also worry about potentially breaking existing code. While the 31
labels thing I proposed won't break existing code (it would have been
ICE-ing), adding nclobbers to the count of parameters could do so.
When Jeff Law says that something is so about gcc, I tend to believe
that it is so. But, unless I can see an example of the actual problem
here, I have no idea how to create a test case for it. So I spent the
last several hours hunting for it.
If valgrind was going to show the problem, presumably we were expecting
some type of array overrun. And there are a LOT of places that do
foo[MAX_RECOG_OPERANDS]. Absent valgrind, I resorted to using printfs
sprinkled throughout the code to check indices. However, despite my best
efforts, I was unable to see any out of range accesses, gcc_asserts,
segment faults or any other indications of a problem. All the places I
tried seem to treat clobbers separately. That doesn't prove anything: I
could easily have missed something. But I did make a sincere effort.
Given how confident you are that there's a problem, could you point out
a place+condition I should focus on? That way I can create the
additional test case, satisfy my curiosity, and sleep soundly at night
knowing I haven't (unnecessarily) broken people's code.
Thanks,
dw
More information about the Gcc-patches
mailing list