This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Patch: Java: Fix missed GGC root registration
- From: Bryce McKinlay <mckinlay at redhat dot com>
- To: java-patches at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Date: Wed, 26 May 2004 19:55:40 -0400
- Subject: Patch: Java: Fix missed GGC root registration
The struct binding_level in java/decl.c lacked ggc type/root
registration markers. This resulted in occasional tree corruption bugs
when compiling bytecode using the gcj-abi branch because the
current_binding_level->stmts could be freed by the GC when compiling
some class files.
This patch adds the appropriate markers and roots registration.
OK for mainline and 3.4 branch?
Bryce
2004-05-26 Bryce McKinlay <mckinlay@redhat.com>
* decl.c (struct binding_level): Add GTY marker. Compile
binding_depth unconditionally.
(current_binding_level, free_binding_level, global_binding_level):
Likewise.
(clear_binding_level): Unconditionally set binding_depth.
(make_binding_level): Use ggc_alloc_cleared, not xmalloc.
Index: decl.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/decl.c,v
retrieving revision 1.181
diff -u -r1.181 decl.c
--- decl.c 13 May 2004 06:40:34 -0000 1.181
+++ decl.c 26 May 2004 23:39:38 -0000
@@ -281,7 +281,7 @@
type, -1);
}
-struct binding_level
+struct binding_level GTY(())
{
/* A chain of _DECL nodes for all variables, constants, functions,
* and typedef types. These are in the reverse of the order supplied.
@@ -314,27 +314,25 @@
/* The statements in this binding level. */
tree stmts;
-#if defined(DEBUG_JAVA_BINDING_LEVELS)
- /* Binding depth at which this level began. */
+ /* Binding depth at which this level began. Used only for debugging. */
unsigned binding_depth;
-#endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
};
#define NULL_BINDING_LEVEL (struct binding_level *) NULL
/* The binding level currently in effect. */
-static struct binding_level *current_binding_level;
+static GTY(()) struct binding_level *current_binding_level;
/* A chain of binding_level structures awaiting reuse. */
-static struct binding_level *free_binding_level;
+static GTY(()) struct binding_level *free_binding_level;
/* The outermost binding level, for names of file scope.
This is created when the compiler is started and exists
through the entire run. */
-static struct binding_level *global_binding_level;
+static GTY(()) struct binding_level *global_binding_level;
/* A PC value bigger than any PC value we may ever may encounter. */
@@ -344,11 +342,7 @@
static const struct binding_level clear_binding_level
= {NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE,
- NULL_BINDING_LEVEL, LARGEST_PC, 0, NULL,
-#if defined(DEBUG_JAVA_BINDING_LEVELS)
- 0,
-#endif /* defined(DEBUG_JAVA_BINDING_LEVELS) */
-};
+ NULL_BINDING_LEVEL, LARGEST_PC, 0, NULL_TREE, 0};
#if 0
/* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function
@@ -1200,7 +1194,7 @@
make_binding_level (void)
{
/* NOSTRICT */
- return xmalloc (sizeof (struct binding_level));
+ return ggc_alloc_cleared (sizeof (struct binding_level));
}
void