Patchwork [java] VECify TYPE_CATCH_CLASSES

login
register
mail settings
Submitter Nathan Froyd
Date June 26, 2010, 11:55 a.m.
Message ID <20100626115546.GS22606@codesourcery.com>
Download mbox | patch
Permalink /patch/57055/
State New
Headers show

Comments

Nathan Froyd - June 26, 2010, 11:55 a.m.
The patch below turns TYPE_CATCH_CLASSES into a VEC.  I briefly looked
at the necessary changes to ensure that make_catch_class_record could be
callable in make_class, but that looked fairly daunting, so I opted for
the simpler solution.

Tested on x86_64-unknown-linux-gnu (libjava testsuite).  OK to commit?

-Nathan

	* java-tree.h (struct lang_type) [catch_classes]: Change type to a
	VEC.
	* except.c (prepare_eh_table_type): Call CONSTRUCTOR_APPEND_ELT
	instead of tree_cons.
	* class.c (make_class): Add dummy entry to TYPE_CATCH_CLASSES.
	(emit_catch_table): Adjust for new type of TYPE_CATCH_CLASSES.
Andrew Haley - June 28, 2010, 9:27 a.m.
On 06/26/2010 12:55 PM, Nathan Froyd wrote:
> The patch below turns TYPE_CATCH_CLASSES into a VEC.  I briefly looked
> at the necessary changes to ensure that make_catch_class_record could be
> callable in make_class, but that looked fairly daunting, so I opted for
> the simpler solution.
> 
> Tested on x86_64-unknown-linux-gnu (libjava testsuite).  OK to commit?
> 
> -Nathan
> 
> 	* java-tree.h (struct lang_type) [catch_classes]: Change type to a
> 	VEC.
> 	* except.c (prepare_eh_table_type): Call CONSTRUCTOR_APPEND_ELT
> 	instead of tree_cons.
> 	* class.c (make_class): Add dummy entry to TYPE_CATCH_CLASSES.
> 	(emit_catch_table): Adjust for new type of TYPE_CATCH_CLASSES.

Great, thanks.

Andrew.

Patch

diff --git a/gcc/java/class.c b/gcc/java/class.c
index 47b721c..7f8897c 100644
--- a/gcc/java/class.c
+++ b/gcc/java/class.c
@@ -382,6 +382,12 @@  make_class (void)
      loading works.  */
   TYPE_BINFO (type) = make_tree_binfo (0);
   MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type);
+  TYPE_CATCH_CLASSES (type) = NULL;
+  /* Push a dummy entry; we can't call make_catch_class_record here
+     because other infrastructure may not be set up yet.  We'll come
+     back and fill it in later once said infrastructure is
+     initialized.  */
+  CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (type), NULL_TREE, NULL_TREE);
 
   return type;
 }
@@ -2960,18 +2966,17 @@  tree
 emit_catch_table (tree this_class)
 {
   tree table, table_size, array_type;
-  TYPE_CATCH_CLASSES (this_class) =
-    tree_cons (NULL,
-	       make_catch_class_record (null_pointer_node, null_pointer_node),
-	       TYPE_CATCH_CLASSES (this_class));
-  TYPE_CATCH_CLASSES (this_class) = nreverse (TYPE_CATCH_CLASSES (this_class));
-  TYPE_CATCH_CLASSES (this_class) = 
-    tree_cons (NULL,
-	       make_catch_class_record (null_pointer_node, null_pointer_node),
-	       TYPE_CATCH_CLASSES (this_class));
-  table_size = build_index_type
-    (build_int_cst (NULL_TREE,
-		    list_length (TYPE_CATCH_CLASSES (this_class))));
+  int n_catch_classes;
+  constructor_elt *e;
+  /* Fill in the dummy entry that make_class created.  */
+  e = VEC_index (constructor_elt, TYPE_CATCH_CLASSES (this_class), 0);
+  e->value = make_catch_class_record (null_pointer_node, null_pointer_node);
+  CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (this_class), NULL_TREE,
+			  make_catch_class_record (null_pointer_node,
+						   null_pointer_node));
+  n_catch_classes = VEC_length (constructor_elt,
+				TYPE_CATCH_CLASSES (this_class));
+  table_size = build_index_type (build_int_cst (NULL_TREE, n_catch_classes));
   array_type 
     = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class))),
 			table_size);
@@ -2979,7 +2984,7 @@  emit_catch_table (tree this_class)
     build_decl (input_location,
 		VAR_DECL, DECL_NAME (TYPE_CTABLE_DECL (this_class)), array_type);
   DECL_INITIAL (table) = 
-    build_constructor_from_list (array_type, TYPE_CATCH_CLASSES (this_class));
+    build_constructor (array_type, TYPE_CATCH_CLASSES (this_class));
   TREE_STATIC (table) = 1;
   TREE_READONLY (table) = 1;  
   DECL_IGNORED_P (table) = 1;
diff --git a/gcc/java/except.c b/gcc/java/except.c
index f5a6407..62778e0 100644
--- a/gcc/java/except.c
+++ b/gcc/java/except.c
@@ -420,9 +420,9 @@  prepare_eh_table_type (tree type)
       layout_decl (decl, 0);
       pushdecl (decl);
       exp = build1 (ADDR_EXPR, build_pointer_type (utf8const_ptr_type), decl);
-      TYPE_CATCH_CLASSES (output_class) = 
-	tree_cons (NULL, make_catch_class_record (exp, utf8_ref), 
-		   TYPE_CATCH_CLASSES (output_class));
+      CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (output_class),
+			      NULL_TREE,
+			      make_catch_class_record (exp, utf8_ref));
     }
 
   exp = convert (ptr_type_node, exp);
diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h
index 282b580..ccaa0e3 100644
--- a/gcc/java/java-tree.h
+++ b/gcc/java/java-tree.h
@@ -952,7 +952,7 @@  struct GTY((variable_size)) lang_type {
 
   tree ctable_decl;             /* The table of classes for the runtime
 				   type matcher.  */
-  tree catch_classes;
+  VEC(constructor_elt,gc) *catch_classes;
 
   htab_t GTY ((param_is (struct treetreehash_entry))) type_to_runtime_map;   
                                 /* The mapping of classes to exception region