aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-05-23 20:07:43 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2011-05-23 20:07:43 +0200
commit9166988f2635469e9e7a85e0473df7b0eee689ee (patch)
treef455a1ce76ac8044485fea91c9fb66093a4de7f3 /gcc
parent0e0d82a784effdcfab26696cab66d03ed5f22300 (diff)
downloadgcc-9166988f2635469e9e7a85e0473df7b0eee689ee.zip
gcc-9166988f2635469e9e7a85e0473df7b0eee689ee.tar.gz
gcc-9166988f2635469e9e7a85e0473df7b0eee689ee.tar.bz2
re PR debug/49032 (-gstabs generates reference to deleted static variable)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/Makefile.in3
-rw-r--r--gcc/dbxout.c15
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.dg/debug/pr49032.c11
5 files changed, 38 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4c73adb..623a347 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 1c65a5b..d3e6ea4 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -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 \
diff --git a/gcc/dbxout.c b/gcc/dbxout.c
index 3190803..be43ed3 100644
--- a/gcc/dbxout.c
+++ b/gcc/dbxout.c
@@ -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:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 65a3514..ff678fc 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..3985040
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/debug/pr49032.c
@@ -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;
+}