Re: [RFA] Fix float argument passing in inferior function calls for ppc64

Mark Kettenis
2008-01-15T14:44:35Z

> From: Thiago Jung Bauermann <bauerman@br.ibm.com>
> Date: Tue, 15 Jan 2008 10:33:53 -0200
>
> Hi,
>
> The 64-bit PowerPC ELF ABI version 1.9 says that "single precision
> floating point values are mapped to the second word in a single
> doubleword". The ppc64_sysv_abi_push_dummy_call function in
> ppc-sysv-tdep.c, however, implements version 1.7 of the ABI which says
> that they should go in the first doubleword.

Aren't ABI changes fun?

Is the first word used for anything in the new ABI? If not, you could
support both ABIs by copying the value into both the first and the
second word.

> Because of this, if you are calling a function with many arguments and
> some need to be passed on the stack, GDB will get it wrong for 32-bit
> floats. This is why in Linux/ppc64 GDB fails the "Call function with
> many float arguments" test posted here:
>
> http://sourceware.org/ml/gdb-patches/2008-01/msg00291.html
>
> This patch fixes the test. It makes GDB pass 32-bit floats in the second
> word when passing them in the stack as stated in the current ABI.
>
> I didn't touch the code which writes the float to a general register in
> the first word because I'm not sure how to test it. It is probably
> related to soft-float, I guess.

Actually, it may be related to varargs. Or perhaps it is a leftover
from the 32-bit ABI code that was copied.

> Tested on Linux/ppc64 with no regressions. I believe this will also fix
> other operating systems supported by GDB on ppc64 since they use the
> same push_dummy_call implementation (assuming they also follow the
> current SysV ABI), but I don't have the means to test them either.
>
> Maybe someone could test the patch and the testcase in *BSD? Luis' patch
> which has the testcases would also need this testing.

There's no 64-bit OpenBSD/powerpc port; we only run on Apple hardware
and we run the G5 machines in 32-bit mode.

It doesn't look like NetBSD and FreeBSD have a working 64-bit powerpc
port either.

I'm fairly certain Linux/ppc64 used the old ABI for a while. Are you
certain GDB doesn't need to support any people running those older
installs anymore?