This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]