https://gcc.gnu.org/g:a19cf635ea29658d5f9fc19199473d6d823ef2d1
commit r15-3407-ga19cf635ea29658d5f9fc19199473d6d823ef2d1 Author: Eric Botcazou <ebotca...@adacore.com> Date: Fri Aug 23 17:06:00 2024 +0200 ada: Add kludge for quirk of ancient 32-bit ABIs to previous change Some ancient 32-bit ABIs, most notably that of x86/Linux, misalign double scalars in record types, so comparing DECL_ALIGN with TYPE_ALIGN directly may give the wrong answer for them. gcc/ada/ * gcc-interface/trans.cc (addressable_p) <COMPONENT_REF>: Add kludge to cope with ancient 32-bit ABIs. Diff: --- gcc/ada/gcc-interface/trans.cc | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/gcc/ada/gcc-interface/trans.cc b/gcc/ada/gcc-interface/trans.cc index fadd6b483d5a..c99b06670d58 100644 --- a/gcc/ada/gcc-interface/trans.cc +++ b/gcc/ada/gcc-interface/trans.cc @@ -10294,8 +10294,20 @@ addressable_p (tree gnu_expr, tree gnu_type) check the alignment of the containing record, as it is guaranteed to be not smaller than that of its most aligned field that is not a bit-field. */ - && DECL_ALIGN (TREE_OPERAND (gnu_expr, 1)) - >= TYPE_ALIGN (TREE_TYPE (gnu_expr))) + && (DECL_ALIGN (TREE_OPERAND (gnu_expr, 1)) + >= TYPE_ALIGN (TREE_TYPE (gnu_expr)) +#ifdef TARGET_ALIGN_DOUBLE + /* Cope with the misalignment of doubles in records for + ancient 32-bit ABIs like that of x86/Linux. */ + || (DECL_ALIGN (TREE_OPERAND (gnu_expr, 1)) == 32 + && TYPE_ALIGN (TREE_TYPE (gnu_expr)) == 64 + && !TARGET_ALIGN_DOUBLE +#ifdef TARGET_64BIT + && !TARGET_64BIT +#endif + ) +#endif + )) /* The field of a padding record is always addressable. */ || TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (gnu_expr, 0)))) && addressable_p (TREE_OPERAND (gnu_expr, 0), NULL_TREE));