libffi PowerPC64 ELFv1 fp arg fixes
commit6cae29fe46326ddb070eaa67d7a7a1bd3065855a
authoramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 4 May 2018 13:47:11 +0000 (4 13:47 +0000)
committeramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 4 May 2018 13:47:11 +0000 (4 13:47 +0000)
tree8640270aa588400317c2731ffbea77b72b12cfe2
parent79b9cc460fbc5646ab0de0fdb78662617afe5ef9
libffi PowerPC64 ELFv1 fp arg fixes

The ELFv1 ABI says: "Single precision floating point values are mapped
to the second word in a single doubleword" and also "Floating point
registers f1 through f13 are used consecutively to pass up to 13
floating point values, one member aggregates passed by value
containing a floating point value, and to pass complex floating point
values".

libffi wasn't expecting float args in the second word, and wasn't
passing one member aggregates in fp registers.  This patch fixes those
problems, making use of the existing ELFv2 homogeneous aggregate
support since a one element fp struct is a special case of an
homogeneous aggregate.

I've also set a flag when returning pointers that might be used one
day.  This is just a tidy since the ppc64 assembly support code
currently doesn't test FLAG_RETURNS_64BITS for integer types..

* src/powerpc/ffi_linux64.c (discover_homogeneous_aggregate):
Compile for ELFv1 too, handling single element aggregates.
(ffi_prep_cif_linux64_core): Call discover_homogeneous_aggregate
for ELFv1.  Set FLAG_RETURNS_64BITS for FFI_TYPE_POINTER return.
(ffi_prep_args64): Call discover_homogeneous_aggregate for ELFv1,
and handle single element structs containing float or double
as if the element wasn't wrapped in a struct.  Store floats in
second word of doubleword slot when big-endian.
(ffi_closure_helper_LINUX64): Similarly.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@259934 138bc75d-0d04-0410-961f-82ee72b054a4
libffi/ChangeLog
libffi/src/powerpc/ffi_linux64.c