https://gcc.gnu.org/g:0c4df2c3c38ca15c123e9a801b617e63256c83a3

commit r14-9423-g0c4df2c3c38ca15c123e9a801b617e63256c83a3
Author: Eric Botcazou <ebotca...@adacore.com>
Date:   Mon Mar 11 09:24:50 2024 +0100

    Fix placement of recently implemented DIE
    
    It's the DIE added for enumeration types with reverse scalar storage order.
    
    gcc/
            PR debug/113519
            PR debug/113777
            * dwarf2out.cc (gen_enumeration_type_die): In the reverse case,
            generate the DIE with the same parent as in the regular case.
    
    gcc/testsuite/
            * gcc.dg/sso-20.c: New test.
            * gcc.dg/sso-21.c: Likewise.

Diff:
---
 gcc/dwarf2out.cc              |  7 ++++---
 gcc/testsuite/gcc.dg/sso-20.c | 19 +++++++++++++++++++
 gcc/testsuite/gcc.dg/sso-21.c | 19 +++++++++++++++++++
 3 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc
index 87e4240b871..8f18bc4fe64 100644
--- a/gcc/dwarf2out.cc
+++ b/gcc/dwarf2out.cc
@@ -22868,18 +22868,19 @@ gen_enumeration_type_die (tree type, dw_die_ref 
context_die, bool reverse)
 
   if (type_die == NULL || reverse)
     {
+      dw_die_ref scope_die = scope_die_for (type, context_die);
+
       /* The DIE with DW_AT_endianity is placed right after the naked DIE.  */
       if (reverse)
        {
          gcc_assert (type_die);
          dw_die_ref after_die = type_die;
          type_die = new_die_raw (DW_TAG_enumeration_type);
-         add_child_die_after (context_die, type_die, after_die);
+         add_child_die_after (scope_die, type_die, after_die);
        }
       else
        {
-         type_die = new_die (DW_TAG_enumeration_type,
-                             scope_die_for (type, context_die), type);
+         type_die = new_die (DW_TAG_enumeration_type, scope_die, type);
          equate_type_number_to_die (type, type_die);
        }
       add_name_attribute (type_die, type_tag (type));
diff --git a/gcc/testsuite/gcc.dg/sso-20.c b/gcc/testsuite/gcc.dg/sso-20.c
new file mode 100644
index 00000000000..3bea38423a8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/sso-20.c
@@ -0,0 +1,19 @@
+/* PR debug/113519 */
+/* Reported by Zdenek Sojka <zso...@seznam.cz> */
+
+/* { dg-do compile } */
+/* { dg-options "-g -fdebug-types-section" } */
+
+enum E { X };
+
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+struct __attribute__((scalar_storage_order("big-endian")))
+{
+  enum E e;
+} S;
+#else
+struct __attribute__((scalar_storage_order("little-endian")))
+{
+  enum E e;
+} S;
+#endif
diff --git a/gcc/testsuite/gcc.dg/sso-21.c b/gcc/testsuite/gcc.dg/sso-21.c
new file mode 100644
index 00000000000..4b5d76d479b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/sso-21.c
@@ -0,0 +1,19 @@
+/* PR debug/113777 */
+/* Reported by Zdenek Sojka <zso...@seznam.cz> */
+
+/* { dg-do compile } */
+/* { dg-options "-g" } */
+
+typedef short __attribute__((__hardbool__)) hbool;
+
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+struct __attribute__((scalar_storage_order("big-endian")))
+{
+  hbool a[2];
+} S;
+#else
+struct __attribute__((scalar_storage_order("little-endian")))
+{
+  hbool a[2];
+} S;
+#endif

Reply via email to