This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Help with cfi markup for MIPS16 hard-float stubs
- From: Richard Sandiford <rdsandiford at googlemail dot com>
- To: Richard Henderson <rth at redhat dot com>
- Cc: gcc at gcc dot gnu dot org
- Date: Thu, 16 Feb 2012 18:58:10 +0000
- Subject: Re: Help with cfi markup for MIPS16 hard-float stubs
- References: <878vk327rw.fsf@talisman.home> <4F3C1CDF.4080508@redhat.com>
Richard Henderson <rth@redhat.com> writes:
> On 02/15/2012 11:53 AM, Richard Sandiford wrote:
>> We then trip:
>>
>> /* Don't let us unwind past the handler context. */
>> gcc_assert (!match_handler);
>>
>> in _Unwind_RaiseException_Phase2. What's the right thing to do here?
>>
>
> Ug. The Right Thing is to fix the unwinder so that it identifies
> frames by pc+cfa, like gdb does, rather than by cfa alone. The
> assumption has been that a function without a frame can't perform
> a call, and can only by unwound to via signals.
>
> As a workaround for 4.7, you can try this hack:
>
> .cfi_startproc simple
> .cfi_def_cfa 29, -1 # fake cfa one byte below sp
> .cfi_register 29, 29 # "save" sp in itself so we don't use the fake cfa
> move $18,$31
> .cfi_register 31, 18
> ...
Ooh, nice (if that's the word). It certainly fixes the testcase,
although I had to use -4 rather than -1 in order to defeat
DWARF2_CIE_DATA_ALIGNMENT. That should still be OK, since the
stack is 8-byte aligned.
GDB doesn't seem to be able to backtrace through this, but that
has to come second to correctness. I'll aim to get a tested fix
in this weekend.
Thanks,
Richard