From a19cf635ea29658d5f9fc19199473d6d823ef2d1 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Fri, 23 Aug 2024 17:06:00 +0200 Subject: [PATCH] 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) : Add kludge to cope with ancient 32-bit ABIs. --- 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 fadd6b483d5..c99b06670d5 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)); -- 2.47.2