This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: ARM problems with the exception unwinder
- To: Andrew Haley <aph at redhat dot com>
- Subject: Re: ARM problems with the exception unwinder
- From: Richard Earnshaw <rearnsha at arm dot com>
- Date: Tue, 23 Jan 2001 14:21:40 +0000
- cc: rearnsha at arm dot com, jason at redhat dot com, gcc-bugs at gcc dot gnu dot org
- Organization: ARM Ltd.
- Reply-To: rearnsha at arm dot com
[ Sorry, should have sent this to everyone].
> Richard Earnshaw writes:
>
> > I've just been looking at execute_cfa_insn() in frame_dwarf2.c and I've no
> > idea how it is supposed to work when the cfa reg is not the stack pointer,
> > since it seems to completely ignore any adjustments to the cfa register.
> > How is this code supposed to work when the cfa register changes from frame
> > to frame?
>
> As I understand it, the CFA is *defined* to be the value of SP before
> the call instruction. Is that not so in your case?
Yes it is, but cfa_reg is the register used when describing the frame.
Often, this isn't the stack pointer but the frame pointer (I guess this is
the crux of the other thread on this issue concerning exception throwing
and alloca).
The problem is that when cfa_reg is set to the frame pointer, the stack
pointer value pushed on the stack is updated, but when cfa_reg is the
stack pointer, the value stored on the stack isn't updated. Then when we
restore SP we get a number that may be right or it may not -- there is no
way to tell. I think the correct thing to do is that if there is a save
slot for ustate.cfa_reg in mystate we should update that value; then the
only adjustment that should be applied at the end is to add args_size for
the initial caller to unwind any pushed arguments.