Skip to content
Snippets Groups Projects
  • Alan Modra's avatar
    71d372eb
    libffi PowerPC64 ELFv1 fp arg fixes · 71d372eb
    Alan Modra authored
    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.
    
    From-SVN: r259934
    71d372eb
    History
    libffi PowerPC64 ELFv1 fp arg fixes
    Alan Modra authored
    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.
    
    From-SVN: r259934