One year ago the compiler (gigi) was changed to align the RETURN structure generated for the Copy-In Copy-Out mechanism: http://gcc.gnu.org/ml/gcc-patches/2010-04/msg00256.html This helps to generate better code, especially on 64-bit platforms. But this is not sufficient in some cases, i.e. when there are integer and fixed-point types involved. The attached patch improves the layout of the type.
Tested on i586-suse-linux, applied on the mainline. 2011-04-08 Eric Botcazou <ebotca...@adacore.com> * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Procedure>: Set minimum alignment on fields of the RETURN type built for the Copy-In Copy-Out mechanism. -- Eric Botcazou
Index: gcc-interface/decl.c =================================================================== --- gcc-interface/decl.c (revision 172166) +++ gcc-interface/decl.c (working copy) @@ -4226,6 +4226,9 @@ gnat_to_gnu_entity (Entity_Id gnat_entit = create_field_decl (gnu_param_name, gnu_param_type, gnu_return_type, NULL_TREE, NULL_TREE, 0, 0); + /* Set a minimum alignment to speed up accesses. */ + if (DECL_ALIGN (gnu_field) < TYPE_ALIGN (gnu_return_type)) + DECL_ALIGN (gnu_field) = TYPE_ALIGN (gnu_return_type); Sloc_to_locus (Sloc (gnat_param), &DECL_SOURCE_LOCATION (gnu_field)); DECL_CHAIN (gnu_field) = gnu_field_list;