]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix placement of recently implemented DIE
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 11 Mar 2024 08:24:50 +0000 (09:24 +0100)
committerEric Botcazou <ebotcazou@adacore.com>
Mon, 11 Mar 2024 08:30:05 +0000 (09:30 +0100)
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.

gcc/dwarf2out.cc
gcc/testsuite/gcc.dg/sso-20.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/sso-21.c [new file with mode: 0644]

index 87e4240b871565257111f0cd3b19f6c910f77b21..8f18bc4fe64becedb1204f68d8d00a3cfca6a410 100644 (file)
@@ -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 (file)
index 0000000..3bea384
--- /dev/null
@@ -0,0 +1,19 @@
+/* PR debug/113519 */
+/* Reported by Zdenek Sojka <zsojka@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 (file)
index 0000000..4b5d76d
--- /dev/null
@@ -0,0 +1,19 @@
+/* PR debug/113777 */
+/* Reported by Zdenek Sojka <zsojka@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