This is the mail archive of the
mailing list for the GCC project.
Re: Fix a pretend_args goof in tail calling
On Mon, May 02, 2005 at 08:31:51AM -0700, Mark Mitchell wrote:
> Daniel Jacobowitz wrote:
> >No, that's not right. This patch was for a problem found on ARM
> >targets, and it is contiguous. The problem is that the space is
> >"pretend". It's allocated by the called function, not by the caller,
> >so it must be cleaned up before we leave this function or the stack
> >pointer will be corrupted. Therefore it can not be used for outgoing
> Oh; the problem would be that when the eventual return occurred from the
> sibcalled function, we'd have more stack space allocated than the
> original caller expected. So, if the original caller pops the
> arguments, it won't pop enough. If the ABI had the callee pop the args,
> then things would work OK, I guess, because the sibcalled function would
> pop all the space. Is that right?
Basically. In practice I think that GCC correctly restored the stack,
but then wrote more bytes of arguments than there were bytes of stack
frame, clobbering the parent's saved registers.
> >Therefore the existing comment is right. It could be extended to:
> > /* If this function requires more stack slots than the current
> > function, we cannot change it into a sibling call.
> > current_function_pretend_args_size is not part of the
> > stack allocated by our caller. */
> >OK with that change instead?
Thanks, will commit for HEAD. Is this appropriate for 4.0?