re PR c++/6381 (Missing assembler label)
authorJason Merrill <jason@redhat.com>
Wed, 8 May 2002 15:33:04 +0000 (11:33 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 8 May 2002 15:33:04 +0000 (11:33 -0400)
        * dwarf2out.c (output_call_frame_info): Don't emit a CIE with no FDEs.

        * dwarf2out.c (gen_type_die): Abort on broken recursion.

        PR c++/6381
        * dwarf2out.c (rtl_for_decl_location): Only expand INTEGER_CST and
        REAL_CST.

From-SVN: r53295

gcc/ChangeLog
gcc/dwarf2out.c
gcc/testsuite/g++.dg/debug/const1.C [new file with mode: 0644]

index 617d19d51111d530142f7f4ad18221a29be8e5b5..5b2c5a832810bc408642e8439cfd3ffc088661b8 100644 (file)
@@ -1,3 +1,13 @@
+2002-05-08  Jason Merrill  <jason@redhat.com>
+
+       * dwarf2out.c (output_call_frame_info): Don't emit a CIE with no FDEs.
+
+       * dwarf2out.c (gen_type_die): Abort on broken recursion.
+
+       PR c++/6381
+       * dwarf2out.c (rtl_for_decl_location): Only expand INTEGER_CST and
+       REAL_CST.
+
 2002-05-08  Nick Clifton  <nickc@cambridge.redhat.com>
 
        * config/arm/t-arm-elf (MULTILIB): Do not allow big-endian/
index 2b8e56c771f68daf86ee54ce926c10ed0d27c44a..9c0c6340d75c4c75ba22de652ff7784d69e991eb 100644 (file)
@@ -1814,6 +1814,10 @@ output_call_frame_info (for_eh)
   int per_encoding = DW_EH_PE_absptr;
   int lsda_encoding = DW_EH_PE_absptr;
 
+  /* Don't emit a CIE if there won't be any FDEs.  */
+  if (fde_table_in_use == 0)
+    return;
+
   /* If we don't have any functions we'll want to unwind out of, don't emit any
      EH unwind information.  */
   if (for_eh)
@@ -8946,15 +8950,17 @@ rtl_for_decl_location (decl)
                  == strlen (TREE_STRING_POINTER (init)) + 1))
            rtl = gen_rtx_CONST_STRING (VOIDmode, TREE_STRING_POINTER (init));
        }
-
-      if (rtl == NULL)
+      /* If the initializer is something that we know will expand into an
+        immediate RTL constant, expand it now.  Expanding anything else
+        tends to produce unresolved symbols; see debug/5770 and c++/6381.  */
+      else if (TREE_CODE (DECL_INITIAL (decl)) == INTEGER_CST
+              || TREE_CODE (DECL_INITIAL (decl)) == REAL_CST)
        {
          rtl = expand_expr (DECL_INITIAL (decl), NULL_RTX, VOIDmode,
                             EXPAND_INITIALIZER);
-         /* If expand_expr returned a MEM, we cannot use it, since
-            it won't be output, leading to unresolved symbol.  */
+         /* If expand_expr returns a MEM, it wasn't immediate.  */
          if (rtl && GET_CODE (rtl) == MEM)
-           rtl = NULL;
+           abort ();
        }
     }
 
@@ -11071,6 +11077,10 @@ gen_type_die (type, context_die)
   if (TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
       && DECL_ORIGINAL_TYPE (TYPE_NAME (type)))
     {
+      /* Prevent broken recursion; we can't hand off to the same type.  */
+      if (DECL_ORIGINAL_TYPE (TYPE_NAME (type)) == type)
+       abort ();
+
       TREE_ASM_WRITTEN (type) = 1;
       gen_decl_die (TYPE_NAME (type), context_die);
       return;
diff --git a/gcc/testsuite/g++.dg/debug/const1.C b/gcc/testsuite/g++.dg/debug/const1.C
new file mode 100644 (file)
index 0000000..7cbc571
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/6381
+// Bug: we were emitting the initializer for bar, which referenced foo,
+// which was not emitted.
+
+// { dg-options "-O" }
+// { dg-do link }
+
+static const int foo[] = { 0 };
+static const int * const bar[] = { foo };
+
+int main() {}