re PR debug/49032 (-gstabs generates reference to deleted static variable)
authorJakub Jelinek <jakub@redhat.com>
Mon, 23 May 2011 18:07:43 +0000 (20:07 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 23 May 2011 18:07:43 +0000 (20:07 +0200)
PR debug/49032
* dbxout.c: Include cgraph.h.
(dbxout_expand_expr): If a VAR_DECL is TREE_STATIC, not written
and without value expr, return NULL if no varpool node exists for
it or if it is not needed.
* Makefile.in (dbxout.o): Depend on $(CGRAPH_H).

* gcc.dg/debug/pr49032.c: New test.

From-SVN: r174083

gcc/ChangeLog
gcc/Makefile.in
gcc/dbxout.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/debug/pr49032.c [new file with mode: 0644]

index 4c73adb37892e3c29150598332ebd94aaba4f683..623a34770d3bb166e8670f5ef4a6c48cb43b860c 100644 (file)
@@ -1,5 +1,12 @@
 2011-05-23  Jakub Jelinek  <jakub@redhat.com>
 
+       PR debug/49032
+       * dbxout.c: Include cgraph.h.
+       (dbxout_expand_expr): If a VAR_DECL is TREE_STATIC, not written
+       and without value expr, return NULL if no varpool node exists for
+       it or if it is not needed.
+       * Makefile.in (dbxout.o): Depend on $(CGRAPH_H).
+
        PR c/49120
        * c-decl.c (start_decl): Convert expr to void_type_node.
 
index 1c65a5bf00c744b8cad997450e77e2b10be27425..d3e6ea4aaa93dadcbf3a6c10a975525909c1813a 100644 (file)
@@ -2957,7 +2957,8 @@ optabs.o : optabs.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
 dbxout.o : dbxout.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
    $(RTL_H) $(FLAGS_H) $(REGS_H) debug.h $(TM_P_H) $(TARGET_H) $(FUNCTION_H) \
    langhooks.h insn-config.h reload.h $(GSTAB_H) xcoffout.h output.h dbxout.h \
-   toplev.h $(DIAGNOSTIC_CORE_H) $(GGC_H) $(OBSTACK_H) $(EXPR_H) gt-dbxout.h
+   toplev.h $(DIAGNOSTIC_CORE_H) $(GGC_H) $(OBSTACK_H) $(EXPR_H) $(CGRAPH_H) \
+   gt-dbxout.h
 debug.o : debug.c debug.h $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H)
 sdbout.o : sdbout.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) debug.h \
    $(TREE_H) $(GGC_H) $(RTL_H) $(REGS_H) $(FLAGS_H) insn-config.h \
index 3190803f9c494785c001123cbb0813152a7770c8..be43ed3dae7251eceae6a24907e04a542c64494f 100644 (file)
@@ -91,6 +91,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "langhooks.h"
 #include "obstack.h"
 #include "expr.h"
+#include "cgraph.h"
 
 #ifdef XCOFF_DEBUGGING_INFO
 #include "xcoffout.h"
@@ -2470,6 +2471,20 @@ dbxout_expand_expr (tree expr)
         disable debug info for these variables.  */
       if (!targetm.have_tls && DECL_THREAD_LOCAL_P (expr))
        return NULL;
+      if (TREE_STATIC (expr)
+         && !TREE_ASM_WRITTEN (expr)
+         && !DECL_HAS_VALUE_EXPR_P (expr)
+         && !TREE_PUBLIC (expr)
+         && DECL_RTL_SET_P (expr)
+         && MEM_P (DECL_RTL (expr)))
+       {
+         /* If this is a var that might not be actually output,
+            return NULL, otherwise stabs might reference an undefined
+            symbol.  */
+         struct varpool_node *node = varpool_get_node (expr);
+         if (!node || !node->needed)
+           return NULL;
+       }
       /* FALLTHRU */
 
     case PARM_DECL:
index 65a3514b44e6fdb9a74cbf8ce04efcb4443d8c7e..ff678fc1d679cba21a3ed7d236c798362d319fc9 100644 (file)
@@ -1,5 +1,8 @@
 2011-05-23  Jakub Jelinek  <jakub@redhat.com>
 
+       PR debug/49032
+       * gcc.dg/debug/pr49032.c: New test.
+
        PR c/49120
        * gcc.dg/pr49120.c: New test.
 
diff --git a/gcc/testsuite/gcc.dg/debug/pr49032.c b/gcc/testsuite/gcc.dg/debug/pr49032.c
new file mode 100644 (file)
index 0000000..3985040
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR debug/49032 */
+/* { dg-do link } */
+
+static int s = 42;
+
+int
+main ()
+{
+  int *l[18] = { &s, &s, &s, &s, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+  return 0;
+}