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));

Reply via email to