Bug in gcc CVS HEAD from a few days ago with alloca and stack alignment

Geoff Keating geoffk@geoffk.org
Sun Feb 11 16:08:00 GMT 2001


> From: "Kevin B. Hendricks" <khendricks@ivey.uwo.ca>
> Reply-To: khendricks@ivey.uwo.ca
> Date: Sun, 11 Feb 2001 14:44:36 -0500
> Cc: khendricks@ivey.uwo.ca, gcc-patches@gcc.gnu.org,
>         David Edelsohn <dje@watson.ibm.com>, tromey@redhat.com
> 
> Hi Geoff,
> 
> On a related matter, the libffi code does not follow the sysv abi for passing 
> long long ints in specific register pairs.
> 
> As I understand things (please correct me if I am wrong!) only the following 
> register pairs may be used (r3,r4), (r5,r6), (r7,r8), (r9,r10) to pass long 
> long ints under the sysv abi.

Yes, it has to be 64-bit aligned starting at r3.

> The current code in libffi/src/powerpc/ffi.c does not do this.  It simply 
> packs it into registers not looking at the starting register.
> 
> When I submit my patch to add the closures code for gcj/gij, I will fix this. 

Please do.

> The ffitest.c code never caught this since it only tested passing and 
> returning one long long int which was always the first parameter (so always 
> stored in (r3,r4).

... and add more tests, of course.

> Also, one other ABI interpretation question: when passing arguments, if r9 is 
> used to say pass an int 32, and then we next pass a long long int (it must be 
> stored on outgoing parameter stack since insufficient room), and finally 
> another int32 is passed, should it be stored in r10 or on the parameter stack?

I believe that it goes on the stack.  r10 has been skipped.

> > I'd think you'd want to use PREFERRED_STACK_BOUNDARY then,
> > instead of inventing a target-specific macro.

That sounds like a good idea.  The rs6000 backend predates
PREFERRED_STACK_BOUNDARY.

-- 
- Geoffrey Keating <geoffk@geoffk.org>



More information about the Gcc-patches mailing list